список ссылок на методы, которые вызывают DexIndexOverflowException

Я столкнулся с проблемой, которая вызывает com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536.

Я знаю, как использовать multiDexEnabled, но я не хочу реализовывать или использовать его, поскольку у него есть некоторые ограничения.

Один из них:

Приложения, использующие multidex, могут не запускаться на устройствах с более ранними версиями платформы, чем Android 4.0 (уровень API 14), из-за ошибки Dalvik linearAlloc (ошибка 22586). Если вы ориентируетесь на уровни API ниже 14, обязательно выполните тестирование с этими версиями платформы, так как ваше приложение может иметь проблемы при запуске или при загрузке определенных групп классов. Сокращение кода может уменьшить или, возможно, устранить эти потенциальные проблемы.

на которые ссылается Google ссылка

Я хочу знать способ, который может показать мне список ссылок на методы, вызывающие эту проблему, чтобы я мог удалить такие модули при импорте библиотеки, которая уже есть в моем проекте.

Пример :

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

person Vipul Asri    schedule 05.10.2015    source источник
comment
github.com/mihaip/dex-method-counts может оказаться полезным.   -  person fadden    schedule 06.10.2015


Ответы (1)


Я бы порекомендовал временно использовать multi-dex, а затем использовать baksmali для создания аннотированного шестнадцатеричного дампа полученных файлов dex. Аннотированный шестнадцатеричный дамп будет включать справочный список методов.

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

Вам нужно найти раздел «method_id_item» в двух файлах дампа. В этом разделе есть полный список ссылок на методы, используемые в файле dex. Это будет выглядеть примерно так

                           |-----------------------------
                           |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
...

Альтернативным подходом было бы написать небольшой инструмент, использующий dexlib2 для чтения файла dex и печати. из ссылки на метод.

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)));
        }
    }
}

Это распечатает ссылки на методы в простом списке:

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
...
person JesusFreke    schedule 05.10.2015