65Kのdex制限でいちゃつくようです。新しいメソッドをいくつか作成すると、dexエラーが発生します。古いものをいくつか削除すると、それはなくなります。
Android Studioで現在使用しているメソッドの数を確認する方法はありますか?
Android Studioには、これを行うための組み込みの方法が用意されています。 「プロジェクト」ビューに変更し、/ app/build/outputs/apk /パスに移動してフレーバー/タイプapkに移動します。 APKをダブルクリックします。これにより、エディターでapkが起動し、ウィンドウの上半分にさまざまなライブラリとそれに関連するサイズが表示されます。このウィンドウを下にスクロールして、classes.dexが見つかるまで(または、classes2.dexなどが複数ある場合)。これをクリックすると、ウィンドウの下部にパッケージごとのメソッド参照が表示されます。複数のフレーバーまたはビルドタイプを使用している場合は、このビューを使用して、構築されたAndroidマニフェストを分析することもできます。詳細については、 Android開発者サイト
私は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
私はそれを行うための壊れやすい方法を見つけることができます、それはおそらくまったく方法がないよりはましです。以下をコピーしてモジュールの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からビルドするときに環境変数を使用するのは問題があります(コマンドラインからは機能しますが) )同様に、それが参照されているビルドスクリプトの他の場所からビルドツールバージョンをプルさせようとしました。また、グローバル定数を定義しようとしましたが、スコープと実行順序を機能させることができませんでした。誰かがこれを改善できる場合は、コメントするか、回答を編集してください。
これは、CarlosSobrinhoによって書かれたものを基にしています。オリジナルへのWebアクセス可能な参照が見つかりません。
https://developer.Android.com/studio/build/apk-analyzer.html#view_dex_files
APKアナライザーのDEXファイルビューアーを使用すると、アプリのDEXファイルの基になる情報にすぐにアクセスできます。クラス、パッケージ、合計参照数、および宣言数がビューア内で提供され、マルチDEXを使用するかどうか、または依存関係を削除して64kDEX制限を下回る方法を決定するのに役立ちます。
図4は、64kDEXの制限に近づいている中規模のアプリを示しています。