我有一个.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编码