Где находятся файлы class/dex платформы android.jar на телефоне или планшете?

В моем приложении используется класс android.view.ViewGroup, который, когда я разрабатываю в Eclipse (я знаю, что он старый), кажется, исходит из android.jar. android.jar был загружен диспетчером SDK. У моего проекта была цель сборки Android 5.1.1, уровень API 22.

Приложение установлено и работает на Samsung Galaxy Tab 2 под управлением Android 7.0 Nougat API уровня 24. (Кажется, вы можете создать один уровень API и работать с другим.)

Где реализация класса типа android.view.ViewGroup на планшетном устройстве? Декодирование .apk с помощью apktool показывает, что тогда классы android.jar не транслировались в dex и передавались в файлеclass.dex в банке. Таким образом, реализация этих классов платформы уже должна быть на телефоне/планшете. Оглядевшись (с помощью «найти» на корневом устройстве), я вижу некоторые файлы .jar в /system/framework, которые выглядят неправильно. Я не вижу ничего особенного в файлах .dex.

Я хочу отлаживать/отслеживать некоторые вызовы в ViewGroup и View, а источник, который у меня есть для android.jar на хосте, не совпадает (номера строк) с тем, что работает на планшете. Я хотел бы знать, где на планшете находится код, соответствующий файлу android.jar, который у меня есть в Eclipse (из диспетчера SDK). Возможно, я смогу найти источник или декомпилировать его или что-то в этом роде.

получитькласслоадер(), похоже, не помогает его найти. В отладчике я посмотрел на выражение ((View)vw).getClass() и vw.getClass().getClassLoader() Объект класса содержал поле «dexCache» с подполем «местоположение», которое ссылалось на /system/framework /framework.jar — это просто заглушка jar (запись манифеста, но без реального содержимого). Я думаю, что getClassLoader() был там для некоторой степени совместимости с Java, но на самом деле не использовался.

3
0
1 504
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С момента появления ART файлы фреймворка хранятся в оптимизированном формате. Я пройдусь по всем выпускам с тех пор.


Android 5 (леденец) до Android 7 (нуга)

До Android 8 (Oreo) оптимизированные файлы dex поставлялись в формате oat (который для простоты можно рассматривать как контейнер для нескольких файлов dex).
баксмали поддерживает дизассемблирование oat файлов с незначительное ограничение:

As of v2.1.0, baksmali now supports deodexing ART oat files. The minimum supported oat version is 56, which should generally correspond to Android 6.0/Marshmallow. oat files earlier than this (e.g. Lollipop) are explicitly not supported, due to some potential issues related to field ordering.

документация включает подробные примеры от baksmali о том, как дизассемблировать классы фреймворка. На устройстве Samsung S7 (с Nougat) мне пришлось сначала извлечь все файлы oat из /system/framework/arm/, а затем выполнить следующие команды:

$ baksmali list dex boot-framework.oat
/system/framework/framework.jar
/system/framework/framework.jar:classes2.dex
/system/framework/framework.jar:classes3.dex
$ baksmali x boot-framework.oat
$ baksmali x boot-framework.oat/system/framework/framework.jar:classes2.dex
$ baksmali x boot-framework.oat/system/framework/framework.jar:classes3.dex
$ ls -l out/android/view/ViewGroup.smali
-rw-r--r-- 1 alex staff 506K Jul 24 12:53 out/android/view/ViewGroup.smali


Android> = Android 8 (Орео)

Начиная с Android 8 (Oreo) формат изменился в соответствии с документация vdexExtractor:

Vdex file format has been introduced in the Oreo (API-26) build. More information is available here.


На устройстве Pixel 3 (с Android Pie) класс android.view.ViewGroup хранится в /system/framework/boot-framework.vdex оптимизированном файле dex. После извлечения этого файла из устройства мы можем использовать vdexExtractor (для преобразования vdex в dex), а затем баксмали (для дизассемблирования dex в файлы smali).

Примечание: как уже упоминалось здесь, файлы Android 9 (или более поздней версии) требуют дополнительной работы:

The Android 9 (Pie) release has introduced a new type of Dex file, the Compact Dex (Cdex).

Поэтому мне пришлось использовать скрипт vdexExtractor tools/deodex/run.sh, а для преобразования файлов vdex Oreo bin/vdexExtractor следует использовать напрямую:

~/vdexExtractor-0.5.2$ mkdir output
~/vdexExtractor-0.5.2$ tools/deodex/run.sh -i boot-framework.vdex -o output
[INFO]: Processing 1 input Vdex files
[INFO]: 1 binaries have been successfully deodexed
~/vdexExtractor-0.5.2$ ls output/vdexExtractor_deodexed/boot-framework/
boot-framework_classes.dex boot-framework_classes2.dex boot-framework_classes3.dex
~/vdexExtractor-0.5.2$ baksmali d output/vdexExtractor_deodexed/boot-framework/boot-framework_classes.dex
~/vdexExtractor-0.5.2$ baksmali d output/vdexExtractor_deodexed/boot-framework/boot-framework_classes2.dex
~/vdexExtractor-0.5.2$ baksmali d output/vdexExtractor_deodexed/boot-framework/boot-framework_classes3.dex
~/vdexExtractor-0.5.2$ ls -l out/android/view/ViewGroup.smali
-rw-r--r-- 1 alex staff 502K Jul 24 08:19 out/android/view/ViewGroup.smali


Если вы предпочитаете исходники Java, вы можете дизассемблировать файлы dex, используя (т.е.) Джадкс (вместо baksmali).

Другие вопросы по теме