-
-
Notifications
You must be signed in to change notification settings - Fork 4
Android Architecture
Important
ВНИМАНИЕ!
ЭТОТ РАЗДЕЛ БОЛЬШЕ НЕ ПОДДЕРЖИВАЕТСЯ!
РОАДМАП ПЕРЕЕХАЛ В NOTION
Как собирается Android-приложение?
Какова структура Android-проекта?
Опишите архитектуру платформы Android
Что происходит, когда пользователь кликает на иконку приложения?
Как система создает новый процесс и стартует приложение?
Android
ОС для смартфонов, планшетов, носимой электроники и бытовых устройств с открытым исходным кодом, основанная на ядре Linux. Android использует собственную реализацию виртуальной машины Java - ART и позволяет запускать Java-приложения, управляющие устройством через разработанные Google библиотеки
ART
Android Runtime (ART) - среда выполнения приложений Android, замена Dalvik, преобразовывает байт-код приложений в собственные инструкции, которые выполняются на устройстве
jar
Java Archive. Содержит классы Java, может использоваться как в Android-приложениях, так и в чистой Java
aar
Android Archive. Аналогичен модулю приложения Android. Может включать исходный код (классы и методы Java), файлы ресурсов, манифест. Может содержать библиотеки C/C++
ANR
Application Not Responding – системный диалог для пользователя, когда приложение зависает. Отображается если: не поступает ответа от UI (нажатие на экран) за 5 сек, broadcastReceiver не завершил выполнение за 10 сек. Частая причина ANR – IO-операции в главном потоке (чтение/запись в бд)
AIDL
Android Interface Definition Language. Язык межпроцессного взаимодействия. Разные процессы не имеют общего пространства памяти, поэтому данные между процессами передаются через сообщения. Интерфейс передачи данных создается на языке AIDL. AIDL поддерживает передачу объектов Parcelable и Serializable
Android Package (APK) - формат файла приложения, используемый для распространения и установки. Содержит весь код приложения: файлы .dex, ресурсы, ассеты, манифест
.dex
DEX файл – результат компиляции кода Android-приложения. Расшифровывается как Dalvik Executable, но несмотря на это используется и на устройствах со средой исполнения ART. В Java-программах каждый .java файл компилируется в отдельный .class файл. DEX аналогичен файлам .class, но содержит байткод всего приложения (или части приложения в случае Multidex), а не одного класса
Как уменьшить APK?
Подключить Proguard, избавиться от неиспользуемых ресурсов с помощью shrinkResources
, избавиться от ресурсов сторонних библиотек, которые не подходят под вашу локаль, с помощью resConfigs
, использовать webp и VectorDrawable
AAB - файловый формат публикации приложений для Android. AAB содержит код и ресурсы, необходимые для конфигурации конкретного устройства. Если пользователь изменит язык устройства или набор функций, магазин приложений может запросить дополнительные разделенные APK для удовлетворения изменившихся требований
Native Development Kit – набор инструментов, которые помогают работать с кодом, написанным на языках C и C++. NDK предоставляет API для доступа к физическим компонентам девайса, таким как сенсоры. Кроме того NDK позволяет скомпилировать и включить в APK C/C++ код, используя Gradle. NDK часто используется в геймдеве для увеличения производительности и для ручного управления памятью. Для взаимодействия нативного и Java-кода используется собственный интерфейс Java - JNI, он определяет способ взаимодействия байт-кода, который Android компилирует из управляемого кода (написанного на языках программирования Java или Kotlin), с собственным кодом (написанным на C/C++)
JNI
Java Native Interface. Стандартный механизм для запуска кода под управлением JVM, который написан на языках C/C++ или Ассемблере и скомпонован в виде динамических библиотек; позволяет не использовать статическое связывание. Это даёт возможность вызова функции C/C++ из программы на Java, и наоборот
• устанавливать точки останова (поэтапное выполнение программ)
• проверять значения переменных
Запустить отладку
• Run -> Attach Debugger to Android Process (или иконка жука со стрелкой)
• Нажать иконку жука
• Открыть окно Debug
Breakpoints
Точки останова. Позволяют приостанавливать выполнение приложения на нужной строчке кода, проверять значения переменных и продолжать выполнение кода строчка за строчкой
Shrink, obfuscate, and optimize your app
Proguard
Что такое Consumer Proguard?
Инструмент оптимизации и обфускации (запутывание) Java кода. Proguard удаляет неиспользуемые классы и методы из уже скомпилированного приложения. Это позволяло решать проблему 64К методов до появления MultiDex. Java- и Dalvik-байткод легко декомпилировать. Для серверного Java-приложения это не проблема, а вот к байткоду приложения под Android доступ имеет любой пользователь. Proguard обфусцирует код, что усложняет задачу декомпиляции. Этот инструмент обрабатывает уже скомпилированный Java код, так что он должен работать с любым JVM языком. Сам язык для Proguard безразличен, важен только байткод. Все манипуляции Proguard с байткодом можно разделить на 3 основных категории: Code shrinking, Optimisation и Obfuscation
R8
Используется вместо Proguard начиная с версии AGP 3.4
Проблема 64k методов
Это ограничение на количество методов в одном .dex-файле. Максимальное количество методов в .dex-файле равно 65536. На ранних версиях Андроида приложение могло иметь только один .dex-файл. Проблема 64К ограничивала количество методов в приложении. Один класс в Java может иметь максимум 64К методов. В Андроиде .dex-файл сделан по образу .class и поэтому наследует это ограничение. Причина ограничения в том, что под индексы ссылок на методы в java- и dalvik-байткоде выделено 16 бит. Т.е. максимальное число 2^16 = 65536. На ранних версиях Андроида единственным решением было уменьшение количества методов. Для этого использовался Proguard. Сейчас проблема решается включением Multidex. В этом случае приложение может иметь более одного .dex-файла
@Keep
Гарантирует, что аннотированный класс или метод не будет удален при минимизации кода во время сборки. Обычно добавляется к методам и классам, доступ к которым осуществляется через рефлексию, чтобы компилятор не рассматривал код как неиспользуемый. Классы и методы @Keep всегда появляются в APK-файле, даже если вы никогда не ссылаетесь на эти классы и методы в логике приложения
Механизм исследования данных о программе во время её выполнения. Рефлексия позволяет исследовать информацию о полях, методах и конструкторах классов
data class Person(
val name: String,
val age: Int
)
val person = Person(
name = "John",
age = 21
)
val clazz: Class<Person> = person.javaClass
val field: Field = clazz.getDeclaredField("name")
field.isAccessible = true
println(field.get(person))
println(field.type)
println(field.declaringClass)
Lint
Инструмент сканирования кода
./gradlew lint
Ktlint
Линтер Kotlin со встроенным средством форматирования
./gradlew ktlintCheck
Detekt
Статический анализатор кода для Kotlin
Запустить проверку
./gradlew detekt
Сгенерировать файл конфигурации
./gradlew detektGenerateConfig
Spotless
Плагин для форматирования кода
./gradlew spotlessCheck // запускает проверки и выдает ошибку, если какая-то проверка не прошла
./gradlew spotlessApply // запускает автоформатирование кода
Home • Interviews • Android Architecture • Android Jetpack • Android Jetpack Compose • Android Releases • Android SDK • Android Views • Basic • Design • Git • GitHub • Gradle • Java • Kotlin • Kotlin Coroutines • RxJava