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

时间:2012-07-05 11:28:26

标签: java android class dex dx

我有一个.dex文件,称之为classes.dex

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

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

5 个答案:

答案 0 :(得分:98)

使用Android-SDK中的命令行工具dexdump。它在$ANDROID_HOME/build-tools/<some_version>/dexdump。它打印的信息比您想要的要多得多。我找不到让dexdump更简洁的方法,但是

dexdump classes.dex | grep 'Class descriptor'

应该有用。

答案 1 :(得分:12)

您可以使用dexlib2 library作为独立库(available in 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类文件中)。要进行转换,只需删除第一个和最后一个字母,然后将/替换为。

答案 2 :(得分:11)

您可以使用dex2jar实用程序将.dex转换为.jar.

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

然后您可以提取.jar文件。

此外,您可以使用此框架

Dedexer

答案 3 :(得分:2)

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

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

答案 4 :(得分:-1)

dxshow mydexfile.dex

dxshow:

字符串-a $ 1 | grep“ ^ L。* /” | grep -v“ Ljava” | grep -v“ Landroid” | sed“ s / ^ L \(。* \); / \ 1 /” | sed“ s:/:。:g”

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