Подтвердить что ты не робот

Проверьте, сколько у вас методов в Android Studio

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

Есть ли способ проверить, сколько методов вы используете в настоящее время в Android Studio?

4b9b3361

Ответ 1

Я могу найти хрупкий способ сделать это, что может быть лучше, чем вообще нет. Скопируйте и вставьте следующее в конец файла build.gradle модуля, заменив ANDROID_HOME на путь установки Android SDK и BUILD_TOOLS_VERSION с той же версией, указанной в спецификации buildToolsVersion вашего блока android:

buildscript {
    dependencies {
        classpath files("/Users/sbarta/sdk/build-tools/21.0.2/lib/dx.jar")
    }
}

android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        variant.assemble.doLast {
            // Show the dex count after the assemble task is finished
            showDexCount(
                    [filename: output.outputFile],
            )
        }
    }
}

def showDexCount(Map... files) {
    def maxReferences = (int) Math.pow(2, 16);
    def buffer = 5000 // that for safety, because you can't burn maxReferences

    println "\n\n***********************************************************************************"
    println "* DEX COUNTS                                                                      *"
    println "***********************************************************************************"
    files.each {
        def dex = new com.android.dex.Dex(it.filename)
        def count = dex.tableOfContents.methodIds.size
        if ((maxReferences - count - buffer) >= 0)
            println String.format('* %1$5d                 (there are still %2$5d references to burn...)             *',
                    count, maxReferences - count - buffer)
        else
            println String.format('* %1$5d  !!!WARNING!!!  Too many references, please decrease by %2$4d!             *',
                    count, -(maxReferences - count - buffer))
    }
    println "***********************************************************************************\n"
}

Это загружает сам код dex для оценки файлов dex и подсчета количества методов; он добавляет свою работу в конец задачи assemble в сборке script, поэтому вы увидите ее в строках командной строки или если вы действительно запустите ее из Android Studio (где она будет отображаться в Gradle консоль).

Я попытался сделать его более устойчивым и использовать переменную окружения ANDROID_HOME вместо того, чтобы требовать от вас жесткого кода пути, но использование переменных среды при создании из Android Studio проблематично (оно работает из командной строки, хотя). Аналогично, я попытался заставить его использовать версию инструментов сборки из другого места в сборке script, на которую он ссылается, и я также попытался определить глобальную константу, но не смог сделать обзор и порядок выполнения работы. Если кто-то может улучшить это, прокомментируйте или отредактируйте ответ.

Это приспособлено из чего-то, написанного Карлосом Собриньо; Я не могу найти ссылку на оригинал, доступную в Интернете.

Ответ 2

Я использовал два разных инструмента, чтобы найти количество методов:

1) Простой инструмент, который подсчитывает методы и показывает количество методов в разных пакетах: https://github.com/mihaip/dex-method-counts

Он покажет вам простые данные:

Read in 65490 method IDs.
<root>: 65490
    : 3
    android: 6837
        accessibilityservice: 6
        bluetooth: 2
        content: 248
            pm: 22
            res: 45
        ...
    com: 53881
        adjust: 283
            sdk: 283
        codebutler: 65
            android_websockets: 65
        ...
    Overall method count: 65490

2) И вот еще один инструмент, который еще проще в использовании, вам нужно добавить зависимость к вашему проекту, и он покажет вам методы для каждой сборки. Вы можете просто прокомментировать эту линию зависимостей, когда вам это не нужно: https://github.com/KeepSafe/dexcount-gradle-plugin

methods  fields   package/class name
5037     1103     android.support.v4
29       1        android.support.v4.accessibilityservice
57       16       android.support.v4.animation

Ответ 3

https://developer.android.com/studio/build/apk-analyzer.html#view_dex_files

Средство просмотра файлов APX Analyzer DEX обеспечивает немедленный доступ к базовой информации в файлах DEX в приложении. Оценки класса, пакета, общего количества ссылок и деклараций предоставляются в средстве просмотра, что может помочь решить, использовать ли multi-DEX или как удалить зависимости, чтобы опуститься ниже предела 64x DEX.

На рисунке 4 показано приложение среднего размера, приближающееся к пределу 64x DEX.