有没有办法从 .dex 文件中获取所有类的列表



我有一个.dex文件,叫它classes.dex

有没有办法"读取"该classes.dex的内容并获取其中所有类的列表作为完整的类名,包括它们的包,例如com.mypackage.mysubpackage.MyClass

我在考虑com.android.dx.dex.file.DexFile,但我似乎找不到检索整组类的方法。

使用来自 Android-SDK dexdump的命令行工具。它在$ANDROID_HOME/build-tools/<some_version>/dexdump.它打印的信息比您想要的要多得多。我没有找到一种方法dexdump不那么冗长,但是

dexdump classes.dex | grep 'Class descriptor'

应该工作。

您可以将 dexlib2 库用作独立库(在 maven 中可用),以读取 dex 文件并获取类列表。

DexFile dexFile = DexFileFactory.loadDexFile("classes.dex", 19 /*api level*/);
for (ClassDef classDef: dexFile.getClasses()) {
    System.out.println(classDef.getType());
}

请注意,类名的形式为"Ljava/lang/String;",这就是它们在 dex 文件(和 java 类文件)中的存储方式。要转换,只需删除第一个和最后一个字母,并将/替换为 .

您可以使用

dex2jar实用程序将.dex转换为.jar.

http://code.google.com/p/dex2jar/

然后,您可以将该.jar文件解压缩。

另外,你可以使用这个框架

脱度二醇

Baksmali 从 baksmali v2.2 开始具有执行此操作的功能。

baksmali list classes my.dex将打印给定 dex 文件中所有类的列表。

参考:可从此处下载:https://github.com/JesusFreke/smali。

dxshow mydexfile.dex

DX显示:

string -a $1 | grep "^L.*/" | grep -v "Ljava" | grep -v "Landroid" | sed "s/

^L\(.*\);/\1/" | sed "s:/:.:g"

ezpz hack...不想花一辈子的Java编码

最新更新