有没有一种方法可以从.dex文件中获取所有类的列表?

53

我有一个名为classes.dex的文件。

是否有一种方法可以“读取”classes.dex的内容,并获取其中所有类的完整类名(包括它们的包名)列表,例如com.mypackage.mysubpackage.MyClass

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

5个回答

125

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

dexdump classes.dex | grep 'Class descriptor'

应该可以工作。


25
我不确定这是OSX的问题还是因为我使用了不同版本的ADT...但是对我来说,dexdump工具在sdk/build-tools/<一些版本>/中,而不是在platform-tools/下面。 - Troy
7
在Windows系统下,使用命令dexdump classes.dex | findstr 'Class descriptor'。该命令用于输出classes.dex文件中所有类的描述符。 - naXa stands with Ukraine
1
@MortenHolmgaard,在当前目录中,classes.dex被打包在apk文件中。提取它,cd到你提取它的目录,并在PowerShell中执行命令。 - naXa stands with Ukraine
1
用法:dexdump:[-c] [-d] [-f] [-h] [-i] [-l layout] [-m] [-t tempfile] dexfile...-c:验证校验和并退出 -d:反汇编代码部分 -f:显示文件头中的摘要信息 -h:显示文件头详细信息 -i:忽略校验和失败 -l:输出布局,可以是“plain”或“xml” -m:转储寄存器映射(仅此而已) -t:临时文件名(默认为/sdcard/dex-temp-*) - Atishay
@csmu 这是一种有趣的方式将目录追加到 PATH 中。 - TWiStErRob
显示剩余6条评论

17

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

实际上,.class 文件与其中类的命名方式不一致。有时它们采用 "L...;" 的形式,有时只是名称(但使用斜杠而不是点)。 - danfuzz
有趣!不知道那个。 - JesusFreke
嘿,JesusFreke,您有一个字符错误:应该是classdef.getType()而不是classDef.getType()。谢谢! - Alex Lipov

12

3
我不需要(也不想)物理反编译和提取.dex文件。我只需要一组完整的类名(字符串)。 - ioreskovic
您也可以使用“tar -xvf <apk_file>”解压缩“apk”文件。 - Dan Borza

5

0

dxshow mydexfile.dex

dxshow:

strings -a $1 | grep "^L.*/" | grep -v "Ljava" | grep -v "Landroid" | sed "s/^L\(.*\);/\1/" | sed "s:/:.:g"

ezpz hack... 不想花费一生的时间来编写Java代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接