Введение.

Мобильные платформы.

  • Android.
  • iOS.
  • Windows Mobile.

Курс построен на android.

Структура курса. Лекции

  • Введение.
  • Основные компоненты приложений.
  • Многопоточность в приложениях.
  • Сеть.
  • Adapter Views. Службы (Services).
  • Работа с данными и файлами.
  • Локализация и работа с ресурсами.

Структура курса. Практика

  • 3 лабораторных работы (сентябрь-октябрь).
  • Проект (ноябрь-декабрь).
  • Проект: не игра!
  • Для реализации используем java, kotlin. Нельзя: unity, flutter и др.

Инструментарий

  • JDK
  • Android SDK
  • Android Studio
  • Gradle
  • Android смартфон

SDK

  • Плагины для IDE
  • Инструменты для сборки
  • Инструменты для отладки
  • Библиотеки
  • Образы эмуляторов

Android Studio

  • Представлен в 2013, как замена Eclipse
  • Система сборки gradle
  • Отображение UI
  • Интегрирован c Goole Developer Console
  • Встроенный профайлер памяти, CPU, Network
  • Поддержка систем контроля версий (git, svn и др.)
  • Поддержка нескольких языков программирования
  • Поддержка специфичных конструкций и компонент

Gradle

  • Построена на принципах apache ant и apache maven.
  • DSL использует Groovy (Kotlin) вместо XML
  • Позволяет расширять сборку собственными функциями
  • Использует направленный ацикличный граф для определения порядка выполнения задач
  • Считается более гибким и пригодным для сборки Android приложений

Gradle

  • Задача (task) является основным компонентом процесса сборки в файле билда.
  • Задачи представляют собой именованные наборы инструкций билда.
  • По сравнению с традиционными возможностями объявления операций билда, связанных зависимостями, задачи Gradle являются полнофункциональными объектами, которыми вы при желании можете управлять программно.

Gradle. Объявление задачи

task hello				    
				    
Список задач
./gradlew tasks	// все задачи	
./gradlew subprojectName:tasks --all // все задачи для подпроекта, 
				     // в том числе второстепенные
				

Gradle. Объявление задачи

Результат
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Help tasks
----------
dependencies - Displays all dependencies declared in root project '__project'.
dependencyInsight - Displays the insight into a specific dependency in root project '__project'.
help - Displays a help message
projects - Displays the sub-projects of root project '__project'.
properties - Displays the properties of root project '__project'.
tasks - Displays the tasks runnable from root project '__project'.

Other tasks
-----------
hello				    
				    

Gradle. Добавление простейшей операции

task hello << {
    println 'hello, world'
}				    
				    
  • Операторы, такие как << («сдвиг влево» из Java), могут быть перегружены в Groovy для изменения поведения в зависимости от объектов с которыми они работают.
  • В данном случае << перегружен в Gradle для добавления блока кода в список операций, которые выполняет задача.

Gradle. Добавление простейшей операции

Существует гибкая возможность добавления кода операции аддитивным способом, ссылаясь на объект созданной задачи:

task hello

hello << {
    print 'hello, '
}

hello << {
    println 'world'
}	

./gradlew hello
:hello
hello, world

BUILD SUCCESSFUL

Total time: 1.916 secs
				    

Gradle. Конфигурация задачи

task initializeDatabase

initializeDatabase << {
    println 'connect to database'
}

initializeDatabase << {
    println 'update database schema'
}

initializeDatabase {
    println 'configuring database connection'
}				

./gradlew initializeDatabase
configuring database connection
:initializeDatabase
connect to database
update database schema

BUILD SUCCESSFUL

Total time: 3.088 secs
				    

Gradle. Конфигурация задачи

  • Для обозначения блока кода между парой фигурных скобок, в Groovy используется термин «замкнутое выражение» или «замыкание» (closure).
  • Функции-замыкания подобны объектам, которые можно передавать методу как параметр или присваивать переменной, с возможностью последующего выполнения.

Gradle. Конфигурация задачи

  • Замыкание, добавленное к имени задачи без оператора сдвиг влево совсем не добавляет новую операцию.
  • Добавился блок конфигурации.
  • Конфигурационный блок задачи выполняется во время конфигурационной фазы жизненного цикла Gradle, которая предшествует фазе выполнения, во время которой выполняются операции задачи.

Gradle. Конфигурация задачи

  • Каждый раз, когда Gradle запускает билд, процесс проходит через три фазы жизненного цикла: инициализация, конфигурация и выполнение.
  • Выполнение — фаза, во время которой задачи билда выполняются в порядке, указанном в настройках их зависимостей.
  • Конфигурация — фаза в которой объекты задачи собираются во внутреннюю объектную модель, обычно называемую направленным ациклическим графом.
  • Инициализация — фаза, в которой Gradle принимает решение, какие объекты будут принимать участие в билде.

Gradle. Конфигурация задачи

  • Конфигурационный блок — подходящее место для присвоения значений переменных и структур данных, которые используются операцией задачи в дальнейшем
  • Структура конфигурации даёт вам возможность превратить задачи вашего билда в сущности развитой объектной модели, заполненные информацией о билде.
  • В этом и состоит отличие задач Gradle от простого набора операций билда, которые выполняются в определённой последовательности.

Gradle. Конфигурация задачи

  • Без такого отличия между конфигурацией и операцией, пришлось бы усложнять настройки зависимостей, что привело бы к потере надёжности и к снижению выразительности средств для связывания основных структур данных билда.
  • При запуске Gradle-файла, конфигурационный код билда выполняется полностью, независимо от того, будет ли какая-либо из задач запускаться в фазе выполнения.

Gradle. Конфигурация задачи

Процесс загрузки ОС Android

Процесс загрузки ОС Android

  • Bootrom — это небольшой кусочек защищенной от записи флеш-памяти, встроенный в процессорный чип. Он содержит самый первый код, который выполняется процессором при его включении. Далее, он запускает BootLoader.
  • BootLoader выполняет первичный запуск специфичных настроек перед запуском ядра. То есть дословно, копирует файлы в рабочую память устройства и передает управление коду, расположенному в разделе boot, что по сути есть ядро Linux.

Процесс загрузки ОС Android

  • Ядро запускает настройку кэша, защищенную память, планировщик задач и загружает драйверы. Когда ядро завершит настройку и запуск своих подсистем, он первым делом запустить корневой и самый главный процесс init(). Все процессы запускаемые после него являются дочерними.

Процесс загрузки ОС Android

  • init()
  • подключает директории /sys, /dev, /proc
  • запускает службы(daemon), которые указаны в файле init.rc
  • Например, Service Manager, Media Server.
  • Формат init.rc достаточно простой и по сути представляет собой набор команд, разделенных на блоки.
  • Запуск среды выполнения Android путем запуска службы Zygote

Процесс загрузки ОС Android

  • Zygote ответственен за инициализацию, старт системных служб, запуск и остановку пользовательских приложений и многие другие задачи.
  • запускается с помощью приложения /system/bin/app_process
  • код которой располагается в разделяемой библиотеке /system/lib/libandroid_runtime.so
  • Zygote получит управление, он начинает формирование среды исполнения Java-приложений с помощью загрузки всех Java-классов фреймворка.

Процесс загрузки ОС Android

  • system_server
  • Включает в себя большинство высокоуровневых (написанных на Java) системных сервисов.
  • В том числе Window Manager, Status Bar, Package Manager и, что самое важное, Activity Manager.

Процесс загрузки ОС Android

  • Activity Manager
  • Zygote открывает сокет /dev/socket/zygote и уходит в сон.
  • Запущенный ранее Activity Manager посылает широковещательный интент Intent.CATEGORY_HOME, чтобы найти Launcher-приложение, отвечающее за формирование рабочего стола.
  • Zygote, в свою очередь, форкается и запускает Launcher-приложение поверх виртуальной машины.
  • На экране появляется рабочий стол, найденный Activity Manager и запущенный Zygote, и статусная строка, запущенная system_server в рамках службы Status Bar.

Запуск «своего» приложения.

  • После нажатия по иконке приложения Launcher пошлет интент с именем этого приложения, его примет Activity Manager и передаст команду на старт приложения демону Zygote.
  • Zygote получает запрос на старт приложения от Activity Manager, он не запускает новую виртуальную машину, а просто форкается, то есть копирует самого себя и затем запускает поверх полученной копии виртуальной машины нужное приложение.
  • Копия ART/Dalvik VM создаёт главный поток приложения (MainThread).

APK файл (Android Package)

  • Manifest
  • Resources
  • Classes.dex

APK файл (Android Package)

  • Java код (.java).
  • Байт код (.class). Получаем с помощью javac.
  • Другие байт коды используемых библиотек.
  • Соединяем в файл classes.dex (Dalvik executable). Получаем с помощью утилиты dex.
  • Соединяем AndroidManifest.xml, classes.dex и ресурсы (изображения, аудио файлы, видео файлы и др) в файл apk.
  • С помощью утилиты aapt.

AndroidManifest.xml

  • Разрешения
  • Описание всех компонент: application, activity, service, receiver.
  • Дополнительная информация.
  • Activity: визуальная часть приложения, точка входа
  • Application: класс приложения, используется как глобальный синглтон.
  • Service: нет интерфейса, работает в фоне.
  • Receiver: системные и пользовательские оповещения.

manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="string"
    android:versionCode="string"
    android:versionName="string"
    android:installLocation=[ "auto" | "internalOnly" | "preferExternal" ]
    >
</manifest>				    
				    

manifest

  • package - имя пакета приложения в стиле Java, должно быть уникальным
  • android:versionCode - версия приложения, нужна для обновления
  • android:versionName - версия приложения, которая показывается пользователя
  • android:installLocation - куда ставить приложение.

permission

<permission
    android:description="string"
    android:icon="string"
    android:label="string"
    android:name="string"
    android:protectionLevel="string"
    />
				    

permission

  • android:name - "android.permisstion.INTERNET"
  • android:icon - иконка, для пользователя
  • android:label - название, для пользователя
  • android:description - описание, для пользователя
  • android:protectionLevel - описание риска

application

  • Большое количество настроек.
  • android:name - Название приложения
  • android:theme - набор параметров, которые применяются ко всему приложению, содержит базовые цвета приложения, стили для отрисовки всех компонентов приложения и различные настройки.
  • android:icon - иконка приложения.

activity

  • Описывает параметры к экрану (Activity подкласс). Все экраны должны быть представлены в манифесте.
  • android:name - название класса (например, com.example.project.ExtracurricularActivity)
  • android:screenOrientation - ориентация экрана (например, портретная или альбомная).
  • android:lauchMode - описание, как экран должен запускаться (например, singleTop).
  • android:label - надпись над экраном.

Демонстрация создания проекта.