- Как устроен билд APK файла внутри
- Процесс создания APK и компиляции кода
- Рассматриваемые темы
- Архитектура процессоров и зачем нужна виртуальная машина
- Понимание Java виртуальной машины
- Андроид виртуальная машина
- Комплияция в .dex файл
- ART против Dalvik
- Каждый этап описанного процесса
- Source Code (Исходный код)
- Resource Files
- AIDL Files
- Library Modules
- AAR Libraries
- JAR Libraries
- Android Asset Packaging Tool
- resources.arsc
- D8 и R8
- Dex and Multidex
- Приложения-эмуляторы Java для Android
- Возможности Java на Android
- Загрузка эмулятора на Android
- Java Manager: Emulate для телефона
- J2ME Loader
- J2ME Runner
- Использование эмулятора Java
- Virtual Machine in Android: Everything you need to know
- Virtual Machine?
- Java Virtual Machine
- How it works?
- Android OS
- Why Android use virtual machine?
- Dalvik Virtual Machine
- Dalvik EXecutable
- Compare with Java VM
- Android Runtime
- Just-In-Time vs Ahead-Of-Time
- Compare with Dalvik VM
- Optimized Garbage Collector
- In Conclusion
Как устроен билд APK файла внутри
Процесс создания APK и компиляции кода
Рассматриваемые темы
- Архитектура процессоров и необходимость для виртуальной машины
- Понимание Java виртуальной машины
- Компиляция исходного кода
- Виртуальная машина Андроид
- Процесс компиляции в .dex файл
- ART против Dalvik
- Описание каждой части билд процесса
- Исходный код
- Файлы ресурсов
- AIDL файлы
- Модули библиотек
- AAR библиотеки
- JAR библиотеки
- Android Asset Packaging Tool
- resources.arsc
- D8 и R8
- Dex и Multidex
- Подписывание APK файла
- Ссылки
Понимание флоу процесса билда APK файла, среда исполнения и компиляция кода
Этот пост нацелен быть отправной точкой для разработчиков, чтобы они ближе познакомились с билд процессом и созданием APK файла.
Архитектура процессоров и зачем нужна виртуальная машина
Андроид после того как вышел в 2007 году претерпел множество изменений связанный с билд процессом, средой исполнения и улучшениями производительности.
У андроида много удивительных характеристик и одна из них разные архитектуры процессоров такие как ARM64 и x86
Невозможно скомпилировать код, который поддерживает каждую архитектуру. Вот именно поэтому используется Java виртуальная машина.
Понимание Java виртуальной машины
JVM это виртуальная машина, позволяющая устройству запускать код, который скомпилирован в Java байткод
Используя JVM, вы избавляетесь от проблемы с разной архитектурой процессоров.
JVM предоставляет переносимость и она позволяет запускать Java код в виртуальной среде, вместо того, чтобы запускать его сразу «на железе»
Но JVM была создана для систем с большими мощностями по ресурсам, а наш андроид имеет сравнительно мало памяти и заряда батареи.
По этой причине Google создал адаптированную под андроид виртуальную машину, которая называется Dalvik.
Компилируем исходный код
Наш исходный Java код для андроида компилируется в класс файл .class с байткодом с помощью javac компилятора и запускается на JVM
Для котлина есть kotlinc компилятор, который делает совместимый с Java байткод.
Байткод — это набор инструкций, который выполняется на целевом устройстве.
Java байткод — это набор инструкций для Java виртуальной машины.
Андроид виртуальная машина
Каждое андроид приложение работает на своей виртуальной машине. С версий 1.0 до 4.4, это был Dalvik. В андроид 4.4, вместе с Dalvik, Google представил в качестве эксперимента новый андроид runtime, который назывался ART
Сгенерированный класс файл .class содержит JVM Java байткод.
Но у андроида есть свой собственный оптимизированный формат байткода, который называется Dalvik bytecode — это просто инструкции машинного кода для процессора также как и JVM байткод.
Комплияция в .dex файл
Во время компиляции происходит конвертация .class класс файл и .jar библиотеки в один classes.dex файл, который содержит Dalvik байткод.
Команда dx превращает все .class и .jar файлы в один classes.dex файл, который написан с форматом Dalvik байткода.
Dex — это аббревиатура с английского — Dalvik Executable.
ART против Dalvik
C версии 4.4 андроид мигрировал на ART. ART также работает с .dex файлом.
Преимущество ART над Dalvik проявляется в том, что приложения запускаются быстрее, потому что весь DEX байткод транслируется в машинный код во время установки, не нужно дополнительного времени на компиляцию в рантайме.
ART и Dalvik совместимы, так что приложения разработанные для Dalvik должны работать и на ART.
Компиляция Dalvik (JIT- just in time) имела такие минусы как — быстрая трата батареи, лаги в приложениях и плохой перформанс. В Dalvik трансляция происходит только когда это нужно. Мы открываем новый экран и только в этот момент происходит трансляция, за счет этого установка происходит быстрее, но при этом проседает перформанс.
Это причина по которой Google сделал Android Runtime (ART).
ART — основан на AOT (ahead of time) компиляции, она происходит до того как приложение запустится.
В ART компиляция происходит во время установки приложения. Это ведет к более долгому времени установки, но уменьшает трату батареи и избавляет от лагов, которые были на Dalvik.
Несмотря на то, что Dalvik был заменен на ART, .dex формат файлов еще используется
В андроид 7.0 JIT вернулся. Гибридная среда сочетает фичи как от JIT компиляции так и
от ART
Среда запуска байткода это очень важная часть андроида и она вовлечена в процесс запуска и установки приложения
Каждый этап описанного процесса
Source Code (Исходный код)
Это Java и Kotlin файлы в src пакете.
Resource Files
Файлы находящиеся в директории с ресурсами
AIDL Files
AIDL — аббревиатура Android Interface Definition Language, позволяет вам описать интерфейс межпроцессорного взаимодействия.
AIDL — может использоваться между любыми процессами в андроиде.
Library Modules
Модули библиотек содержат Java или Kotlin классы, компоненты андроида и ресурсы.
Код и ресурсы бибилотеки компилируются и пакуются вместе с приложением.
Поэтому модуль библиотеки может считаться компайл тайм артефактом.
AAR Libraries
Андроид библиотеки компилируются в AAR — android archive файл, который вы можете использовать как зависимость для вашего android app модуля.
AAR файлы могут содержать андроид ресурсы и файл манифеста, что позволяет вам упаковать туда общие ресурсы такие как layouts и drawables в дополнение к Java или Kotlin классам и методам.
JAR Libraries
JAR это Java библиотека и в отличие от AAR она не может содержать андроид ресурсы и манифесты.
Android Asset Packaging Tool
AAPT2 — аббревиатура (Android Asset Packaging Tool) — компилирует манифест и файлы ресурсов в один APK.
Этот процесс разделен на два шага компиляцию и линковку Это улучшает производительность так как если вы поменяете один файл, вам нужно компилировать только его и прилинковать к остальным файлам командой ‘link’
AAPT2 может компилировать все типы андроид ресурсов, таких как drawables и XML файлы.
При вызове AAPT2 для компиляции, туда передается по одному ресурсному файлу на каждый вызов
Затем APPT2 парсит файл и генерирует промежуточный бинарный файл с расширением .flat
Фаза линковки склеивает все промежуточные файлы сгенерированные в фазе компиляции и дает нам на выход один .apk файл. Вы также можете сгенерировать R.java файл и правила для proguard в это же время.
resources.arsc
Полученный на выходе .apk файл не включает в себя DEX файл, APK не подписан и не может быть запущен на устройстве.
APK содержит AndroidManifest, бинарные XML файлы и resources.arsc
resource.arsc содержит всю мета информацию о ресурсах, такую как индексы всех ресурсов в пакете
Это бинарный файл и APK который может быть запущен. APK который вы обычно создаете и запускаете не сжат и может быть использован просто посредством размещения в памяти.
R.java файл это выходной файл вместе с APK ему назначен уникальный id, который позволяет Java коду использовать ресурсы во время компиляции.
arsc это индекс ресурса который используется во время запуска приложения
D8 и R8
Начиная с андроид студии 3.1 и далее, D8 был сделан дефолтным компилятором.
D8 производит более маленькие dex файлы с лучшей производительностью, если сравнивать со старым dx.
R8 используется для компиляции кода. R8 это оптимизированная версия D8
D8 играет роль конвертера класс файлов в Dex файлы, а также производит дешугаринг функций из Java 8 в байткод, который может быть запущен на андроиде
R8 оптимизирует dex байткод. Он предоставляет такие фичи как оптимизация, обфускация, удаление ненужных классов.
Обфускация уменьшает размер вашего приложения укорачивая названия классов, методов и полей.
Обфускация имеет и другие преимущества для предотвращения реверс инжиниринга, но основная цель уменьшить размер.
Оптимизация уменьшает размер Dex файла путем переписывания ненужных частей кода и инлайнинга.
С помощью дешугаринга мы можем использовать удобные фичи языка Java 8 на андроиде.
Dex and Multidex
R8 дает на выходе один DEX файл, который называется classes.dex
Если количество методов приложения переваливает за 65,536, включая подключенные библиотеки, то произойдет ошибка при билде
Источник
Приложения-эмуляторы Java для Android
Полноценное функционирование веб-страниц требуется как на компьютере, так и на планшетах и смартфонах. Поэтому важно скачать плагин Java на телефон Android и знать его функции. Рассмотрим популярные эмуляторы, используемые на мобильных устройствах.
Возможности Java на Android
Мобильный телефон на ОС Андроид работает только на языке Java. Приложения, программы, игры и даже сама система написаны на Джаве. Разработчики, которые знают этот синтаксис, способны работать с компаниями, создающими мобильные устройства и ПО для них.
Вот основные причины этого:
- платформа для программирования предлагает большие библиотеки и открытый код для инструментов;
- помогает бороться с утечкой памяти и другими проблемами встроенного кода;
- разработка последних версий приложений нацелена на сохранение стабильности телефона;
- безопасность настолько высока, что, скачав вирусные приложения на телефон, пользователь не передаст злоумышленникам управление ядром ОС;
- перекомпилировать код и переписывать файлы не придется – новое оборудование будет поддерживать возможности языка.
Скачать Java на Андроид нужно из-за того, что эмуляторы позволяют запустить старые игры и приложения, которые не переведены в формат .apk. Расширение не было актуально до появления смартфонов.
Загрузка эмулятора на Android
Скачать приложение-эмулятор Java для Андроид можно бесплатно на этой странице. Просто кликните по кнопке нужной программы под описанием.
Java в формате .apk следует устанавливать на смартфоны с помощью стандартных средств ОС. Чтобы скачать эмулятор, в дополнительных настройках безопасности устройства разрешите установку приложений из неизвестных источников.
Общие требования:
Операционная система | Android 4.0 и выше |
Язык интерфейса | Русский, Английский |
Размер | От 1 до 24 Мб |
Возрастное ограничение | 3+ |
Java Manager: Emulate для телефона
Позволяет проводить разработку под Android на телефоне, создавая искусственную среду. Пользователь сможет компилировать код или запускать программы, написанные на языке Java.
Установка приложения на мобильный не требует получения root-прав, поэтому дополнительных инструкций по «взлому» Андроида нет.
J2ME Loader
Приложение для запуска 2D-игр на устройствах с ОС Андроид. Эмулятор Java 2 Micro Edition поддерживает 3D с небольшими ограничениями, но это редко требуется пользователям. Присутствует возможность масштабирования и виртуальная клавиатура.
Скачайте приложение J2ME Loader с помощью официального магазина Google Play или с нашего сайта.
J2ME Runner
Еще один эмулятор, запускающий файлы, написанные на языке Java, но не реализованные в формате .apk. Из недостатков – неработоспособность на Андроид 4.0 и несовместимость с экранами планшетов. Переводит программы из расширения .jar в .apk.
Установочный файл можно скачать на специализированном форуме 4PDA . Получение root-прав не требуется.
Видео: Как запустить Java-игры на Android с помощью J2ME Runner.
Использование эмулятора Java
Рассмотрим использование эмуляторов Java на ОС Android на примере J2ME Loader.
- Запустите приложение – вас встретит белый фон и кнопка «+». Сделано так, чтобы искать контент по вкусу, а не загромождать смартфон ненужными играми или программами.
- Разработчики добавили JAR ReMart – магазин, где в свободном доступе находятся интересные приложения. Скачайте их и запустите через «+».
- Необязательно активировать весь арсенал кнопок и опций. Оставьте на экране те элементы управления, которые актуальны для определенной игры.
Масштаб и перемещение настраиваются без ограничений.
Источник
Virtual Machine in Android: Everything you need to know
Aug 4, 2019 · 6 min read
Virtual Machine?
A virtual machine is based on computer architectures to provide functionality of a computer.
There are 2 main types of Virtual Machine (VM):
- System virtual machines (full virtualization VMs) provide a substitute for a real machine.
- Process virtual machines are designed to execute computer programs in a platform-independent environment.
Java Virtual Machine
Follow “write once, run anywhere” principle, JVM allows programs — written in Java/Kotlin — to run on any device or operating system.
How it works?
IDEs — like IntelliJ / Android Studio — use Java Compiler ( javac ) to compile Java code ( .java ) into Java bytecode ( .class ).
Then on runtime environments (Web, PC, Android), JVM translates it into machine specs instruction set that this environment can understand.
- Start JVM.
- Start main thread. Load .class into memory using Classloader.
- Verify bytecode is valid and not violate Java’s security restrictions.
- Translate bytecode into machine instructions and execute them.
- Unload classes. Terminate main thread.
- Shutdown JVM.
Note that: It’s possible to compile Java code to native code ahead-of-time, then run. And it’s also possible to interpret Java code directly.
Android OS
Android is an open source, Linux-based software stack created for a wide array of devices and form factors. For example, the Android Runtime (ART) relies on the Linux kernel for underlying functionalities: networking, multi-threading and low-level memory management.
Why Android use virtual machine?
There are many reason that Google engineers decide to use Android with VM, but two main reason is:
- Security: In theory, app code is totally isolated by the VM and cannot even “see” the host OS. So app code that contains malware cannot affect system directly, make app and system more robust and reliable.
- Platform independent: Android platform can run on different devices with different architectures (ARM, MIPs, x86). To abstract out the need to compile binaries for each architecture, VM comes into play.
Dalvik Virtual Machine
Dalvik Virtual Machine (DVM) is a Process virtual machine for Android.
DVM is a virtual machine that optimized for mobile environment (memory, battery life, performance. )
Dalvik EXecutable
Dalvik EXecutable ( .dex ) is Dalvik bytecode which translated from Java bytecode using dx tool (replaced by D8 tool since API 28). This format was designed for systems that have constrained memory and processor speed.
Multiple classes are included in a single .dex file:
Compare with Java VM
The DVM was built specifically for Android, to address the battery life, processing speed. Moreover, the Java tools are free but the JVM is not, so Google engineers made their own VM and made it as free.
Unlike JVM, which are simple stack machines, the DVM uses a register-based — which requires fewer instructions, fewer code units, avoid unnecessary memory access — resulting in better performance code.
Android Runtime
Android Runtime (ART) is the managed runtime used by apps and system services on Android. Replacing the predecessor Dalvik, ART performs the translation of the app’s bytecode into native instructions that are later executed by the device’s runtime environment.
The ART is written to run multiple VMs on low-memory devices. To maintain backward compatibility, ART also uses the same input bytecode as Dalvik — the standard Dalvik EXecutable ( .dex ) files — which also designed for Android to minimize memory footprint.
From Android 5.0, each app runs in its own process, with its own instance of ART. But prior to this, it use Dalvik. If your app runs well on ART, then it should work on Dalvik as well, but the reverse may not true.
Just-In-Time vs Ahead-Of-Time
Just-In-Time (JIT) added in Android 2.2. It dynamically compiles bytecode into native machine code at run-time to make app runs faster. It does all this while app is running, and that’s where the “Just-In-Time” comes from.
Ahead-Of-Time (AOT) added in Android 4.4. It statically compiles bytecode into machine code at install-time — using on-device dex2oat tool — and stores data in the device’s storage, to improve run-time performance.
Compare with Dalvik VM
Dalvik is a JIT compilation based engine.
The ART includes a JIT compiler (with code profiling). The JIT compiler complements new AOT compiler and improves runtime performance, speed up apps and system updates.
Furthermore, ART has many more advantage:
- Optimized garbage collector: one GC pause instead of two.
- Loop optimizations: Bounds check, Induction variable is eliminated.
- Faster native calls using @FastNative and @CriticalNative annotations.
- Improve battery life.
- Reduce startup time as native code is directly executed.
- Faster runtime performance because AOT compile at install-time.
- From API 28, convert APK’s DEX files to more compact machine code.
- Better debugging support (dedicated sampling profiler, detailed exceptions reporting, and ability to set watchpoints to specific fields).
Optimized Garbage Collector
Garbage Collector (GC) can impact app’s performance with “stop-the-world” events, which resulting in frozen frames, poor UI responsiveness. The default GC plan is the CMS (concurrent mark sweep).
The ART improves GC in several ways:
- The number of pauses is reduced from 2 to 1 compared to Dalvik. Dalvik’s first pause — which mostly root Marking — is done concurrently in ART by getting the threads to mark their own roots.
- Parallelized processing in the second pause (before Sweeping phase).
- Increased GC throughput enabled by the sticky CMS collector.
- Reduce total time when clean up recently-allocated, short-lived objects.
- Performs heap compaction — when app changes process state to background or cached — to reduce background memory usage.
In Conclusion
Before Android 5.0 (API 21), Android use Dalvik Virtual Machine (DVM) — a Process virtual machine — that optimized for mobile environment (memory, battery life, performance. ).
After that, each Android app runs in its own process and with its own instance of the Android Runtime (ART) — an app runtime environment used by Android OS. Replacing Dalvik, ART performs the translation of the app’s bytecode into native instructions that are later executed by the device’s runtime environment.
Источник