手机或平板电脑上的 android.jar 平台类/dex 文件在哪里?

Posted

技术标签:

【中文标题】手机或平板电脑上的 android.jar 平台类/dex 文件在哪里?【英文标题】:Where are the android.jar platform class/dex files on a phone or tablet? 【发布时间】:2019-12-01 23:05:52 【问题描述】:

我的应用程序使用类 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文件。所以这些平台类的实现必须已经在手机/平板上。环顾四周(在有根设备上使用“查找”),我在 /system/framework 中看到一些看起来不正确的 .jar 文件。我没有看到太多 .dex 文件的方式。

我想调试/跟踪对 ViewGroup 和 View 的一些调用,而我在主机上的 android.jar 源与平板电脑上运行的任何东西(行号)不匹配。我想知道与 Eclipse 中的 android.jar 文件匹配的代码在平板电脑上的位置(来自 SDK 管理器)。或许我可以找到源代码或者反编译什么的。

getClassLoader() 似乎没有帮助找到它。在调试器中,我查看了表达式 ((View)vw).getClass() 和 vw.getClass().getClassLoader() /framework.jar - 这只是一个 jar 的存根(清单条目,但没有真正的内容)。我认为 getClassLoader() 是为了在一定程度上与 Java 兼容,但并没有真正使用。

【问题讨论】:

【参考方案1】:

自 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 文件。

【讨论】:

以上是关于手机或平板电脑上的 android.jar 平台类/dex 文件在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

直播APP开发助您搭建更高大上的直播平台

如何快速将Windows电脑资料传输到苹果手机?这个方法你必须会

手机上的Python怎么运行操作,代码在电脑上运行的出手机却不行

在电脑上怎么查看、编辑、修改手机上的ES文件浏览器里面的文档?

2021-9-10 Unity Remote5, 发布到Android手机平台上的unity测试必备使用教程(亲身示范,真机测试)

如何查看电脑上的历史操作记录