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

标签 android apk dex apktool

我的应用程序使用类 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/

相关文章:

java - Kotlin 内联函数和 Android 方法计数

android - 如何通过 Hook 在android中获取上下文

android - 限制分享android应用apk

android - React Native ScrollView 在 Android APK 上崩溃

android - 越来越失败 [INSTALL_FAILED_TEST_ONLY : installPackageLI] in Android studio 3. 0

java - 多个dex文件定义Lcom/google/android/gms/ads/identifier/AdvertisingIdClient$Info;

android - 资源 ID 在 AGP 7.0 中将不是最终的

android - 在 Android 应用程序中使用 viber 发送短信

c# - Xamarin.Forms 实现 AndHud 和 BTProgressHud

java - .apk 怎么可能不包含 classes.dex 但有效?