2015-01-04 3 views
13

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

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

+0

Вы можете проверить количество методов каждой зависимости, используемой в вашем проекте, плагина для Android-версии, пожалуйста, проверьте ответ http://stackoverflow.com/questions/30648172/gradle-library-duplicates-in-dependencies/36056607#36056607 – darwin

+0

Хорошо, есть ли способ выяснить количество методов, которые содержит зависимость? – CoDe

ответ

7

Я могу найти хрупкий способ сделать это, что может быть лучше, чем вообще нет. Скопируйте и вставьте следующий код в нижней части файла 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's 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 в сценарии сборки, поэтому вы увидите его в строках командной строки или если вы действительно запустите его из Android Studio (где он появится в консоли Gradle).

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

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

+0

Полезно, спасибо.Если бы mvn установил файл dx.jar локально, чтобы путь classsString для его распознать. Также как примечание, если вам это нужно в библиотеке, измените android.applicationVariants на android.testVariants, чтобы он работал на dex вашего тестового apk. – JCricket

+0

Я пытаюсь использовать это, но он говорит: «Невозможно разрешить класс com.android.dex.Dex» ... Может кто-нибудь помочь мне или вести меня? Заранее спасибо. –

+3

https://plus.google.com/+JahirFiquitivaJDev/posts/8VXJzyLUiYs Я нашел тему Jahir здесь – Phuong

5

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

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 
0

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

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

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