web-dev-qa-db-fra.com

Existe-t-il un moyen d'obtenir une liste de toutes les classes à partir d'un fichier .dex?

J'ai un .dex fichier, appelez-le classes.dex.

Existe-t-il un moyen de "lire" le contenu de ce classes.dex et obtenir une liste de toutes les classes en tant que noms de classe complets, y compris leur package, com.mypackage.mysubpackage.MyClass, par exemple?

Je pensais à com.Android.dx.dex.file.DexFile , mais je n'arrive pas à trouver une méthode pour récupérer un ensemble complet de classes.

46
ioreskovic

Vous pouvez utiliser la bibliothèque dexlib2 comme bibliothèque autonome ( disponible dans maven ), pour lire le fichier dex et obtenir une liste de classes.

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

Notez que les noms de classe seront de la forme "Ljava/lang/String;", qui est la façon dont ils sont stockés dans le fichier dex (et dans un Java). Pour convertir, supprimez simplement la première et la dernière lettre et remplacez/par.

13
JesusFreke

Utilisez l'outil de ligne de commande dexdump à partir du SDK Android. C'est dedans $Android_HOME/build-tools/<some_version>/dexdump. Il imprime beaucoup plus d'informations que vous ne le pensez probablement. Je n'ai pas trouvé de moyen de rendre dexdump moins verbeux, mais

dexdump classes.dex | grep 'Class descriptor'

devrait marcher.

101
jcsahnwaldt

Vous pouvez utiliser dex2jar utilitaire qui convertira .dex à .jar.

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

Ensuite, vous pouvez extraire ce .jar fichier.

Vous pouvez également utiliser ce cadre

Dedexer

11
UVM

baksmali a des fonctionnalités pour ce faire à partir de baksmali v2.2.

baksmali list classes my.dex affichera une liste de toutes les classes dans le fichier dex donné.

3
JesusFreke