【问题标题】:Where are the android.jar platform class/dex files on a phone or tablet?手机或平板电脑上的 android.jar 平台类/dex 文件在哪里?
【发布时间】: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 兼容,但并没有真正使用。

【问题讨论】:

    标签: android apk dex apktool


    【解决方案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 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      相关资源
      最近更新 更多