Мобильные платформы.
- 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 - надпись над экраном.
Демонстрация создания проекта.