Общеизвестно, что приложения для Android распространяются в форме файлов пакета приложений для Android или файлов APK для краткости. Тем не менее, большинство людей смотрят на APK как на черный ящик и понятия не имеют, как он создан или что внутри него. Даже большинство разработчиков приложений имеют только поверхностное понимание анатомии APK. В интегрированных средах разработки, таких как Android Studio, все, что нужно, — это всего лишь один клик, чтобы превратить проект Android в APK.
В этом уроке мы рассмотрим приложение для Android. Другими словами, мы собираемся открыть его APK и взглянуть на его содержимое. Кроме того, поскольку APK — это двоичный файл, предназначенный только для чтения на компьютерах, я также собираюсь познакомить вас с несколькими инструментами, которые можно использовать для перевода его содержимого в более удобочитаемую форму.
Предпосылки
Чтобы следовать, вам нужно:
- последняя версия Android SDK
- Android-устройство или эмулятор под управлением Android 4.4 или выше
1. Зачем искать внутри APK?
Многие люди делают это из чистого любопытства. Другие пользуются возможностью прямого доступа к изображениям, звукам и другим ресурсам своих любимых игр или приложений. Есть, однако, более важные причины, по которым вы хотели бы заглянуть внутрь APK.
Учусь
Если вы только начали изучать разработку приложений для Android, вы можете многому научиться, просматривая APK-файлы популярных приложений или приложений, созданных профессионалами. Например, взглянув на файлы макетов XML приложения, которое хорошо выглядит на экранах нескольких размеров, вы можете улучшить свои собственные навыки создания макетов.
Безопасность
Приложения, загруженные из ненадежных источников, могут содержать вредоносный код. Если вы уже являетесь опытным разработчиком приложений, разбирая такие приложения, вы можете посмотреть на их код, чтобы лучше понять, что они на самом деле делают под капотом.
2. Как создается APK?
Вы не можете многому научиться у APK без базового понимания того, как он создается. Фактически, наиболее важными инструментами, используемыми для анализа APK, являются также инструменты, используемые для его создания.
Проекты Android в основном состоят из исходного кода Java, макетов XML, метаданных XML и ресурсов, таких как изображения, видео и звуки. Прежде чем операционная система Android сможет использовать все эти файлы, их необходимо преобразовать в понятную им форму. Это преобразование включает в себя множество промежуточных задач, которые обычно называют процессом сборки Android. Окончательный результат процесса сборки — пакет приложений APK или Android .
В проектах Android Studio плагин Android для Gradle обрабатывает все промежуточные задачи процесса сборки.
Одной из первых важных задач является создание файла с именем R.java . Это файл, который позволяет разработчикам легко получать доступ к макету проекта и доступным для рисования ресурсам в своем коде Java с помощью числовых констант. Для генерации файла используется инструмент под названием aapt , что сокращенно от Android Asset Packaging Tool . Инструмент также преобразует все ресурсы XML вместе с файлом манифеста проекта в двоичный формат.
Все файлы Java, включая R.java , затем преобразуются в файлы классов с помощью компилятора Java , Как вы, возможно, уже знаете, файлы классов состоят из байт-кода, который может интерпретироваться движком Java. Тем не менее, Android использует специальный тип среды выполнения, называемый Android runtime (ART), который оптимизирован для мобильных устройств. Поэтому, как только все файлы классов были сгенерированы, для преобразования байт-кода в байт- код Dalvik используется формат с именем dx , формат, который понимает ART.
После обработки ресурсов и файлов Java они помещаются в архивный файл, который очень похож на файл JAR . Архивный файл затем подписывается с использованием закрытого ключа, который принадлежит разработчику приложения. Эти две операции выполняются плагином Gradle без использования каких-либо внешних инструментов. Ключ разработчика, однако, получен из хранилища ключей, управляемого keytool .
Наконец, несколько оптимизаций были внесены в файл архива с использованием инструмента zipalign , чтобы убедиться, что память, используемая приложением во время работы, сведена к минимуму. На данный момент файл архива является действительным APK, который может использоваться операционной системой Android.
3. Анализ содержимого APK
Теперь, когда вы понимаете, как создаются и используются файлы APK, давайте откроем один и посмотрим на его содержимое. В этом руководстве мы используем APK приложения Sample Soft Keyboard , которое предварительно установлено на эмуляторе Android. Однако, если вы предпочитаете использовать физическое устройство, вы также можете легко использовать APK любого приложения, установленного на нем.
Шаг 1. Перенос APK на компьютер
Чтобы просмотреть содержимое APK, сначала необходимо перенести его с эмулятора на компьютер. Прежде чем сделать это, вам нужно знать имя пакета и абсолютный путь к APK. Используйте adb
чтобы открыть сеанс оболочки на вашем эмуляторе.
1
|
adb shell
|
Когда вы увидите приглашение оболочки, используйте команду pm list
чтобы вывести список имен всех установленных приложений.
1
|
pm list packages
|
Название пакета интересующего нас приложения — com.example.android.softkeyboard . Вы должны быть в состоянии увидеть это в списке. Передав имя пакета в команду pm path
, вы можете определить абсолютный путь к APK.
1
|
pm path com.example.android.softkeyboard
|
Вывод вышеприведенной команды выглядит следующим образом:
1
|
package:/data/app/SoftKeyboard/SoftKeyboard.apk
|
Теперь, когда вы знаете его путь, вы можете выйти из оболочки и перенести APK на свой компьютер с помощью команды adb pull
. Команда ниже передает его в каталог / tmp вашего компьютера:
1
|
adb pull /data/app/SoftKeyboard/SoftKeyboard.apk /tmp
|
Шаг 2: Извлечение содержимого APK
Ранее в этом уроке вы узнали, что APK — это не что иное, как сжатый архивный файл. Это означает, что вы можете использовать менеджер архивов вашей операционной системы по умолчанию для извлечения его содержимого. Если вы используете Windows, вам, возможно, придется сначала изменить расширение файла с .apk на .zip . После извлечения содержимого APK вы сможете увидеть файлы внутри APK.
Если вы разработчик приложения, многие файлы в APK должны выглядеть знакомо. Однако, кроме изображений в папке res , файлы имеют формат, с которым вы не сможете работать без помощи нескольких инструментов.
Шаг 3: Расшифровка двоичных файлов XML
Android SDK включает в себя все инструменты, необходимые для анализа содержимого APK. Ранее вы узнали, что aapt
используется для упаковки ресурсов XML во время процесса сборки. Он также может быть использован для чтения большого количества информации из APK.
Например, вы можете использовать опцию dump xmltree
для чтения содержимого любого двоичного XML-файла в APK. Вот как вы можете прочитать файл макета с именем res / layout / input.xml :
1
|
aapt dump xmltree /tmp/SoftKeyboard.apk res/layout/input.xml
|
Вывод должен выглядеть примерно так:
1
2
3
4
5
6
|
N: android=http://schemas.android.com/apk/res/android
E: com.example.android.softkeyboard.LatinKeyboardView (line=21)
A: android:id(0x010100d0)=@0x7f080000
A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
A: android:layout_height(0x010100f5)=(type 0x10)0xfffffffe
A: android:layout_alignParentBottom(0x0101018e)=(type 0x12)0xffffffff
|
Это не XML, но благодаря отступам и меткам, таким как N для пространства имен, E для элемента и A для атрибута, вы сможете прочитать его.
Шаг 4: Расшифровка строк
На предыдущем шаге вы увидели, что расшифрованный XML имеет шестнадцатеричные числа вместо строк. Эти числа являются ссылками на строки в файле resources.arsc , который представляет таблицу ресурсов приложения.
Вы можете использовать опцию dump resources
aapt
для просмотра таблицы ресурсов. Вот как:
1
|
aapt dump —values resources /tmp/SoftKeyboard.apk
|
Исходя из вывода команды, вы можете определить точные значения строк, используемых в приложении. Вот запись для одного из шестнадцатеричных чисел в XML:
1
|
resource 0x7f080000 com.example.android.softkeyboard:id/keyboard: t=0x12 d=0x00000000 (s=0x0008 r=0x00)
|
Шаг 5: Разборка байт-кода Dalvik
Самый важный файл в APK — это classes.dex . Этот файл используется средой выполнения Android при запуске приложения. Он содержит байт-код Dalvik, сгенерированный в процессе сборки.
Разобрав этот файл, вы можете получить информацию о классах Java, используемых в приложении. Для этого вы можете использовать инструмент под названием dexdump . С помощью следующей команды вы можете перенаправить вывод команды dexdump
в файл, который может быть открыт любым текстовым редактором.
1
|
dexdump -d /tmp/classes.dex > /tmp/classes.dasm
|
Если вы откроете classes.dasm , вы увидите, что он содержит сотни строк низкоуровневого кода, который выглядит следующим образом:
Излишне говорить, что понять это очень сложно. К счастью, вы можете изменить формат вывода dexdump
на XML, используя опцию -l
. С помощью следующей команды вы можете перенаправить ее вывод в файл, который вы можете открыть в браузере.
1
|
dexdump -d -l xml /tmp/classes.dex > /tmp/classes.xml
|
Объем информации, доступной в формате XML, меньше, но он дает представление о классах, методах и полях Java, представленных в приложении.
Вывод
В этом уроке вы узнали, как создается APK и что он содержит. Вы также узнали, как использовать инструменты, доступные в Android SDK, для расшифровки содержимого файлов APK. Об этих инструментах не так много документации, но, поскольку они имеют открытый исходный код, вы можете попробовать прочитать их подробно прокомментированный исходный код, чтобы узнать о них больше.
Если вы ищете что-то более простое в работе, вы можете попробовать использовать популярные сторонние инструменты, такие как dex2jar , который генерирует более читаемый дизассемблированный код, или JADX , декомпилятор, который может генерировать код Java.