В моем приложении используется класс 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, но на самом деле не использовался.
С момента появления 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).