2015-01-04 8 views
13

私はdexの制限が65K、 のように見えます。古いメソッドを削除すると、デクスエラーが発生しました。あなたがAndroidスタジオに持っているメソッドの数を確認してください

Androidスタジオで現在使用しているメソッドの数を確認する方法はありますか?

+0

あなたのプロジェクトで使用されている各依存関係のメソッド数をAndroidスタジオプラグインで確認できます。回答を確認してください。http://stackoverflow.com/questions/30648172/gradle-library-duplicates-in-dependencies/36056607#36056607 – darwin

+0

よく依存関係に含まれるメソッドの数を把握する方法はありますか? – CoDe

答えて

7

私はそれを行う壊れやすい方法を見つけることができます。これはまったく良い方法ではないかもしれません。コピーしてandroidブロックのbuildToolsVersion仕様で指定されたものと同じバージョンであなたのAndroid SDKのインストールとBUILD_TOOLS_VERSIONのパスでANDROID_HOMEを交換し、あなたのモジュールのbuild.gradleファイルの最後に次を貼り付けます。

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スタジオからGradleコンソールに表示されます(実際にはGradleコンソールに表示されます)。

パスをハードコードする代わりに、ANDROID_HOME環境変数を使用するようにしましたが、Android Studioからビルドするときに環境変数を使用すると問題があります(コマンドラインからは問題ありません)。同様に、ビルド・ツール・バージョンでビルド・スクリプトの別の場所からビルド・ツール・バージョンを取得しようとしましたが、グローバル・定数を定義しようとしましたが、実行の有効範囲と順序はできませんでした。誰かがこれで改善できる場合は、コメントを書き留めてください。

これはCarlos Sobrinhoによって書かれたものから適合しています。私は元のWebへのアクセス可能な参照を見つけることができません。

+0

便利、ありがとうございます。ビルドスクリプトのクラスパスが認識できるように、mxnでdx.jarファイルをローカルにインストールしなければなりませんでした。またメモとして、ライブラリ上でこれ​​を必要とする場合は、android.testVariantsにandroid.applicationVariantsを変更して、テストapkのdexで実行するようにしてください。 – JCricket

+0

私はこれを使用しようとしていますが、「クラスcom.android.dex.Dexを解決できません」と言われています...誰かが私を助けたり案内したりしますか?前もって感謝します。 –

+3

https://plus.google.com/+JahirFiquitivaJDev/posts/8VXJzyLUiYsここでJahirのトピックが見つかりました – Phuong

5

私は、多くの方法を見つけるために、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 
0

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

APKアナライザのDEXファイルビューアは、あなたの中にDEXファイル(複数可)での基本的な情報への即時アクセスを提供しますアプリ。ビューアにはクラス、パッケージ、総参照数、宣言数が用意されています。マルチDEXを使用するかどうかの判断や、64K DEXの制限を下回るように依存関係を削除する方法を決定できます。

図4は、64k DEXの限界に近い中サイズのアプリを示しています。

関連する問題