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 文件。
我的应用程序使用 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 文件。