我的应用程序使用类 android.view.ViewGroup,当我在 Eclipse 中开发时(我知道它很旧)似乎来自 android.jar。 android.jar 由 SDK 管理器下载。我的项目的构建目标是 Android 5.1.1,API 级别 22。
该应用已安装并运行在运行 Android 7.0 Nougat API 级别 24 的 Samsung Galaxy Tab 2 上。 (似乎您可以构建到一个 API 级别并针对不同的级别运行。)
像 android.view.ViewGroup 这样的类在平板设备上的实现在哪里? 用 apktool 解码 .apk 显示 android.jar 类不是翻译成dex传入jar中的classes.dex文件。所以这些平台类的实现肯定已经在手机/平板上了。环顾四周(在 Root设备上使用“查找”),我在/system/framework 中看到一些看起来不正确的 .jar 文件。我没有看到太多 .dex 文件。
我想调试/跟踪对 ViewGroup 和 View 的一些调用,我在主机上拥有的 android.jar 源与平板电脑上运行的任何东西(行号)都不匹配。我想知道与我在 Eclipse 中(来自 SDK 管理器)中的 android.jar 文件相匹配的平板电脑上的代码。或许我可以找到源代码或对其进行反编译之类的。
getClassLoader() 似乎无法帮助找到它。在调试器中,我查看了表达式 ((View)vw).getClass() 和 vw.getClass().getClassLoader() 类对象包含一个 'dexCache' 字段和一个引用/system/framework 的 'location' 子字段/framework.jar——这只是一个 jar 的 stub ( list 条目,但没有实际内容)。我认为 getClassLoader() 在某种程度上与 Java 兼容,但并未真正使用。
最佳答案
自引入 ART 以来,框架文件以优化格式存储。从那时起,我将检查所有版本。
Android 5 (Lollipop) 到 Android 7 (Nougat)
直到 Android 8 (Oreo),优化后的 dex 文件以 oat
格式发布(为简单起见,可以将其视为多个 dex 文件的容器)。
baksmali支持使用 minor limitation 反汇编 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.
bakmali 的 documentation includes detailed examples了解如何反汇编框架类。在三星 S7 设备(带有牛轧糖)上,我必须首先从 /system/framework/arm/
中提取所有 oat
文件,然后执行以下命令:
$ 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 (Oreo)
自 Android 8 (Oreo) 以来,格式已更改,根据 vdexExtractor documentation :
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)然后是 baksmali (用于将 dex 反汇编成 smali 文件)。
注意:如前所述here ,Android 9(或更高版本)的文件需要一些额外的工作:
The Android 9 (Pie) release has introduced a new type of Dex file, the Compact Dex (Cdex).
因此我不得不使用 vdexExtractor 的 tools/deodex/run.sh
脚本,而转换 Oreo 的 vdex 文件应该直接使用 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 源代码,则可以使用(即)jadx 反汇编 dex 文件。 (而不是 baksmali)。
关于android - 手机或平板电脑上的 android.jar 平台类/dex 文件在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57171989/