2015-01-04 12 views
13

Sembra che sto flirtando con il limite di dex di 65K, se scrivo alcuni metodi nuovi ho un errore di dex, se rimuovo alcune cose più vecchie, è sparito.Controlla quanti metodi hai in Android Studio

C'è un modo per verificare quanti metodi stai utilizzando al momento in Android Studio?

+0

È possibile controllare il conteggio dei metodi di ciascuna dipendenza utilizzata nel progetto un plug-in Android Studio, si prega di consultare la risposta http://stackoverflow.com/questions/30648172/gradle-library-duplicates-in-dependencies/36056607#36056607 – darwin

+0

bene c'è un modo per capire il numero di metodi contenuti in una dipendenza? – CoDe

risposta

7

Posso trovare un modo fragile per farlo, che è forse meglio di niente affatto. Copiare e incollare il seguente alla parte inferiore del file di build.gradle del vostro modulo, sostituendo ANDROID_HOME con il percorso della vostra installazione di Android SDK e BUILD_TOOLS_VERSION con la stessa versione specificata nel buildToolsVersion specifiche della vostra android blocco:

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

Carica il codice dex stesso per valutare i file dex e contare il numero di metodi; aggiunge il suo lavoro alla fine dell'attività dello assemble nello script di build, quindi lo vedrai in build da riga di comando o se lo esegui effettivamente da Android Studio (dove verrà mostrato nella console di Gradle).

Ho cercato di renderlo più resiliente e utilizzare la variabile di ambiente ANDROID_HOME invece di richiedere l'hardcode del percorso, ma l'utilizzo di variabili di ambiente durante la creazione da Android Studio è problematico (funziona comunque dalla riga di comando). Allo stesso modo, ho cercato di far entrare la versione degli strumenti di compilazione dall'altra parte nello script di build a cui è stato fatto riferimento, e ho anche provato a definire una costante globale, ma non sono riuscito a far funzionare l'ambito e l'ordine di esecuzione. Se qualcuno può migliorare su questo, si prega di commentare o modificare la risposta.

Questo è adattato da qualcosa scritto da Carlos Sobrinho; Non riesco a trovare un riferimento accessibile dal Web all'originale.

+0

Utile, grazie.Ho dovuto installare mvn il file dx.jar localmente per il classpath di buildscript per riconoscerlo. Inoltre, se hai bisogno di questo su una libreria, modifica android.applicationVariants in android.testVariants in modo che venga eseguito sul dex del tuo apk di test. – JCricket

+0

Sto cercando di usarlo ma dice 'Impossibile risolvere la classe com.android.dex.Dex' ... Qualcuno potrebbe aiutarmi o guidarmi? Grazie in anticipo. –

+3

https://plus.google.com/+JahirFiquitivaJDev/posts/8VXJzyLUiYs Ho trovato l'argomento Jahir qui – Phuong

5

ho usato due strumenti diversi per trovare il numero di metodi:

1) strumento semplice che conta i metodi e mostra quantità di metodi in diversi pacchetti: https://github.com/mihaip/dex-method-counts

che vi mostrerà i dati semplici come questo:

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) e qui è un altro strumento che è ancora più facile da usare, è necessario aggiungere una dipendenza al progetto e vi mostrerà i metodi su ogni generazione. Si può semplicemente lasciare un commento, questa linea di dipendenza quando non lo si avesse bisogno: 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

visualizzatore di file DEX di APK Analyzer consente l'accesso immediato alle informazioni di base nel file DEX (s) nella tua app. Classe, pacchetto, conteggio totale di riferimento e dichiarazione sono forniti all'interno del visualizzatore, che può aiutare a decidere se utilizzare multi-DEX o come rimuovere le dipendenze per ottenere un limite di 64k DEX.

La figura 4 illustra un'applicazione di medie dimensioni che si avvicina al limite di 64 k DEX.

Problemi correlati