自 ART 引入以来,框架文件以优化的格式存储。从那时起,我将回顾所有版本。
Android 5(棒棒糖)到 Android 7(牛轧糖)
在 Android 8 (Oreo) 之前,优化的 dex 文件以 oat 格式提供(为简单起见,可以将其视为多个 dex 文件的容器)。
baksmali 支持反汇编 oat 文件一个minor limitation:
从 v2.1.0 开始,baksmali 现在支持对 ART oat 文件进行脱编。这
最低支持的oat版本是56,一般应该对应
到 Android 6.0/棉花糖。 oat 文件早于此(例如
Lollipop) 明确不支持,由于一些潜在的问题
与字段排序有关。
baksmali 的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(奥利奥)
自 Android 8 (Oreo) 以来,格式发生了变化,按照vdexExtractor documentation:
Oreo (API-26) 版本中引入了 Vdex 文件格式。更多的
信息可用here。
在 Pixel 3(使用 Android Pie)设备上,android.view.ViewGroup 类存储在 /system/framework/boot-framework.vdex 优化的 dex 文件中。从设备中拉出这个文件后,我们可以使用vdexExtractor(用于将vdex转换为dex)然后baksmali(用于将dex反汇编为smali文件)。
注意:如here 所述,Android 9(或更高版本)的文件需要一些额外的工作:
Android 9 (Pie) 版本引入了一种新型的 Dex 文件,即
紧凑型 Dex (Cdex)。
因此我不得不使用 vdexExtractor 的 tools/deodex/run.sh 脚本,而对于转换 Oreo 的 vdex 文件应该直接使用 bin/vdexExtractor:
~/vdexExtractor-0.5.2$ mkdir 输出
~/vdexExtractor-0.5.2$ tools/deodex/run.sh -i boot-framework.vdex -o 输出
[INFO]:处理 1 个输入 Vdex 文件
[INFO]: 1 个二进制文件已成功解译
~/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 输出/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(而不是 baksmali)来反汇编 dex 文件。