2015-01-04 3 views
13

Es sieht aus wie ich flirte mit dem Dex Limit von 65K, Wenn ich ein paar neue Methoden schreibe ich habe einen Dex-Fehler, wenn ich einige ältere Dinge entfernen, ist es weg.Überprüfen Sie, wie viele Methoden Sie in Android Studio haben

Gibt es eine Möglichkeit zu überprüfen, wie viele Methoden Sie derzeit in Android Studio verwenden?

+0

Sie können überprüfen, die Anzahl der Methoden jeder Abhängigkeit in Ihrem Projekt ein Android Studio-Plugin verwendet, überprüfen Sie bitte die Antwort http://StackOverflow.com/Questions/30648172/Gradle-Library-Duplicates-in-dependencies/36056607#36056607 – darwin

+0

gut gibt es eine Möglichkeit, herauszufinden, wie viele Methoden eine Abhängigkeit enthält? – CoDe

Antwort

7

Ich kann einen zerbrechlichen Weg finden, es zu tun, was vielleicht besser ist als gar nicht. Kopieren und fügen Sie den folgenden auf den Grund Ihres Moduls build.gradle Datei ersetzt ANDROID_HOME mit dem Pfad Ihres Android-SDK-Installation und BUILD_TOOLS_VERSION mit der gleichen Version angegeben in der buildToolsVersion Spezifikation des android Block:

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" 
} 

Dies lädt den dex-Code selbst, um die dex-Dateien auszuwerten und die Anzahl der Methoden zu zählen; Es fügt seine Arbeit dem Ende der assemble Aufgabe im Build-Skript hinzu, so dass Sie es in Befehlszeilen-Builds sehen oder wenn Sie es tatsächlich von Android Studio aus ausführen (wo es in der Gradle-Konsole angezeigt wird).

Ich habe versucht, es widerstandsfähiger zu machen und die Umgebungsvariable ANDROID_HOME zu verwenden, anstatt den Pfad hardcodieren zu müssen, aber die Verwendung von Umgebungsvariablen beim Erstellen von Android Studio ist problematisch (funktioniert aber über die Befehlszeile). In ähnlicher Weise habe ich versucht, die Build-Tool-Version von der anderen Stelle im Build-Skript abrufen zu lassen, auf die verwiesen wird, und ich habe auch versucht, eine globale Konstante zu definieren, konnte aber nicht das Scoping und die Reihenfolge der Ausführung vornehmen. Wenn jemand dies verbessern kann, bitte die Antwort kommentieren oder bearbeiten.

Dies ist von etwas angepasst, das von Carlos Sobrinho geschrieben wurde; Ich kann keine vom Web zugängliche Referenz zum Original finden.

+0

Nützlich, danke.Musste die dx.jar-Datei lokal installieren, um den Buildscript-Klassenpfad zu erkennen. Auch als Hinweis, wenn Sie dies in einer Bibliothek benötigen, ändern Sie android.applicationVariants zu android.testVariants, so dass es auf dem Dex Ihrer Test-APK läuft. – JCricket

+0

Ich versuche, dies zu verwenden, aber es sagt "Unfähig, Klasse com.android.dex.Dex zu lösen" ... Kann mir jemand helfen oder mich führen? Danke im Voraus. –

+3

https://plus.google.com/+JahirFiquitivaJDev/posts/8VXJzyLUiYs Ich fand Jahir Thema hier – Phuong

5

habe ich zwei verschiedene Werkzeuge Reihe von Methoden zu finden:

1) einfaches Werkzeug, das Verfahren zählt und zeigt Menge von Methoden in verschiedenen Paketen: https://github.com/mihaip/dex-method-counts

Es wird Ihnen einfache Daten wie folgt zeigen:

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) und hier ein weiteres Werkzeug, das noch einfacher zu bedienen ist, haben Sie eine Abhängigkeit zu einem Projekt hinzuzufügen, und es wird auf jedem Build Ihnen Methoden zeigt. Sie können einfach diese Abhängigkeit Linie kommentieren, wenn Sie es nicht benötigen, sind: 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

APK Analyzer DEX-Datei-Viewer Sie sofortigen Zugriff auf die zugrunde liegenden Informationen in der DEX-Datei (en) gibt in Ihrem App Klassen-, Paket-, Gesamtreferenz- und Deklarationszählungen werden im Viewer bereitgestellt, was bei der Entscheidung helfen kann, ob Multi-DEX verwendet werden soll oder wie Abhängigkeiten entfernt werden, um unter das 64.000-DEX-Limit zu kommen.

Abbildung 4 zeigt eine mittelgroße App, die sich dem 64-k-DEX-Limit nähert.