android.jar 平台 class/dex 文件在 phone 或平板电脑上在哪里?

Where are the android.jar platform class/dex files on a phone or tablet?

我的应用程序使用 class android.view.ViewGroup,当我在 Eclipse 中开发时(我知道它很旧)似乎来自 android.jar. android.jar 由 SDK 管理器下载。我的项目的构建目标是 Android 5.1.1,API 级别 22

该应用程序已安装并 运行 在 Samsung Galaxy Tab 2 运行ning Android 7.0 Nougat API 级别 24. (似乎你可以构建一个 API 级别并 运行 对抗另一个级别。)

平板设备上android.view.ViewGroup等class的实现在哪里?解码.带有 apktool 的 apk 显示 android.jar classes 没有被翻译成 dex 并传入 jar 中的 classes.dex 文件。所以这些平台 classes 的实现必须已经在 phone/tablet 上。环顾四周(在有根设备上使用 'find')我在 /system/framework 中看到一些看起来不正确的 .jar 文件。我没有看到太多 .dex 文件。

我想 debug/trace 对 ViewGroup 和 View 进行一些调用,并且主机上 android.jar 的源代码与 运行 的(行号)不匹配]宁在平板电脑上。我想知道与我在 Eclipse 中(来自 SDK 管理器)中的 android.jar 文件匹配的代码在平板电脑上的位置。也许我可以找到源代码或者反编译它什么的。

getClassLoader() 好像没法帮忙找。在调试器中,我查看了表达式 ((View)vw).getClass() 和 vw.getClass().getClassLoader() class 对象包含一个 'dexCache' 字段和 'location' 引用 /system/framework/framework.jar 的子字段——这只是一个 jar 的存根(清单条目,但没有实际内容)。我认为 getClassLoader() 在某种程度上与 Java 兼容,但并未真正使用。

自引入 ART 以来,框架文件以优化格式存储。从那时起,我将检查所有版本。


Android 5(棒棒糖)到 Android 7(牛轧糖)

直到 Android 8 (Oreo),优化的 dex 文件以 oat 格式发布(为简单起见,可以将其视为多个 dex 文件的容器)。
baksmali supports disassembling oat files with a minor limitation:

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 的 documentation includes detailed examples 关于如何反汇编框架 classes。在三星 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>=Android8(奥利奥)

自 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 class 存储在 /system/framework/boot-framework.vdex 优化的 dex 文件中。从设备中拉取此文件后,我们可以使用 vdexExtractor (for transforming vdex into dex) and then 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(而不是 baksmali)反汇编 dex 文件。