49

我有一个.dex文件,调用它classes.dex

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

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

4

5 回答 5

118

使用 Android-SDK 中的命令行工具dexdump。它在$ANDROID_HOME/build-tools/<some_version>/dexdump。它打印的信息比您可能想要的要多得多。我没有找到dexdump减少冗长的方法,但是

dexdump classes.dex | grep 'Class descriptor'

应该管用。

于 2013-08-25T11:32:55.583 回答
16

您可以将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 类文件)中的存储方式。要转换,只需删除第一个和最后一个字母,并将 / 替换为 .

于 2012-07-05T18:54:51.490 回答
12

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

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

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

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

德克斯

于 2012-07-05T11:37:03.993 回答
5

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

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

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

于 2017-09-11T18:22:29.323 回答
-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编码

于 2020-04-20T22:26:48.117 回答