2015-10-05 1 views
0

Je suis confronté à un problème qui provoque com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536.liste des références de méthode qui provoquent DexIndexOverflowException

Je connais l'utilisation de multiDexEnabled mais je ne veux pas l'implémenter ou l'utiliser car il a quelques limitations.

L'une d'elle est la suivante:

Les applications qui utilisent multidex peut ne pas démarrer sur les appareils qui exécutent versions de la plate-forme plus tôt que Android 4.0 (niveau de l'API 14) en raison à un bug Dalvik linearAlloc (numéro 22586). Si vous ciblez les niveaux API antérieurs à 14, veillez à effectuer des tests avec ces versions de la plate-forme car votre application peut rencontrer des problèmes au démarrage ou lorsque des groupes particuliers de classes sont chargés. Le code peut réduire ou éventuellement éliminer ces problèmes potentiels.

référencé par Google link

Je veux savoir d'une manière qui peut me montrer la liste des références de méthode qui sont à l'origine de cette question. afin que je puisse supprimer de tels modules tout en important la bibliothèque que j'ai déjà dans mon projet.

Exemple:

compile('org.apache.httpcomponents:httpmime:4.3.6') { 
     exclude module: 'httpclient' 
    } 
compile 'org.apache.httpcomponents:httpclient-android:4.3.5' 
+1

https://github.com/mihaip/dex-method-counts peut être utile. – fadden

Répondre

2

Je recommanderais d'utiliser temporairement multi-dex, et ensuite utiliser baksmali pour faire une décharge hexagonale annotée des fichiers dex résultant. Le vidage hexadécimal annoté inclura la liste de référence de méthode.

baksmali -N -D out.dump -e classes.dex myapp.apk 
baksmali -N -D out2.dump -e classes2.dex myapp.apk 

Vous devez rechercher "section method_id_item" dans les deux fichiers de vidage. Cette section contient la liste complète des références de méthode utilisées dans le fichier dex. Il ressemblera à quelque chose comme

      |----------------------------- 
          |method_id_item section 
          |----------------------------- 
          | 
          |[0] method_id_item 
003c38: 0500    | class_idx = type_id_item[5]: Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable; 
003c3a: b000    | proto_idx = proto_id_item[176]: (I)V 
003c3c: 1900 0000   | name_idx = string_id_item[25]: <init> 
          |[1] method_id_item 
003c40: 0500    | class_idx = type_id_item[5]: Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable; 
003c42: d500    | proto_idx = proto_id_item[213]: (Landroid/graphics/Canvas;)V 
003c44: df02 0000   | name_idx = string_id_item[735]: draw 
          |[2] method_id_item 
003c48: 0500    | class_idx = type_id_item[5]: Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable; 
003c4a: a400    | proto_idx = proto_id_item[164]:()V 
003c4c: 4103 0000   | name_idx = string_id_item[833]: generatePatternBitmap 
          |[3] method_id_item 
003c50: 0500    | class_idx = type_id_item[5]: Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable; 
003c52: 4500    | proto_idx = proto_id_item[69]:()Landroid/graphics/Rect; 
003c54: 4e03 0000   | name_idx = string_id_item[846]: getBounds 
          |[4] method_id_item 
003c58: 0500    | class_idx = type_id_item[5]: Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable; 
003c5a: 0c00    | proto_idx = proto_id_item[12]:()I 
003c5c: 8403 0000   | name_idx = string_id_item[900]: getOpacity 
... 

Une autre approche serait d'écrire un petit outil en utilisant dexlib2 pour lire le fichier dex et imprimer la méthode refereneces.

public class DumpMethods { 
    public static void main(String[] args) throws IOException { 
     DexBackedDexFile dexFile = DexFileFactory.loadDexFile(args[0], 15); 

     for (int i=0; i<dexFile.getMethodCount(); i++) { 
      System.out.println(ReferenceUtil.getMethodDescriptor(new DexBackedMethodReference(dexFile, i))); 
     } 
    } 
} 

Cela affichera les références de méthode dans une liste simple:

Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable;-><init>(I)V 
Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable;->draw(Landroid/graphics/Canvas;)V 
Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable;->generatePatternBitmap()V 
Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable;->getBounds()Landroid/graphics/Rect; 
Lafzkl/development/mColorPicker/drawables/AlphaPatternDrawable;->getOpacity()I 
...