web-dev-qa-db-ja.com

Android Studioにあるメソッドの数を確認してください

65Kのdex制限でいちゃつくようです。新しいメソッドをいくつか作成すると、dexエラーが発生します。古いものをいくつか削除すると、それはなくなります。

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

18
TomCB

Android Studioには、これを行うための組み込みの方法が用意されています。 「プロジェクト」ビューに変更し、/ app/build/outputs/apk /パスに移動してフレーバー/タイプapkに移動します。 APKをダブルクリックします。これにより、エディターでapkが起動し、ウィンドウの上半分にさまざまなライブラリとそれに関連するサイズが表示されます。このウィンドウを下にスクロールして、classes.dexが見つかるまで(または、classes2.dexなどが複数ある場合)。これをクリックすると、ウィンドウの下部にパッケージごとのメソッド参照が表示されます。複数のフレーバーまたはビルドタイプを使用している場合は、このビューを使用して、構築されたAndroidマニフェストを分析することもできます。詳細については、 Android開発者サイト

enter image description here

10
Chris Knight

私は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
7
Gaket

私はそれを行うための壊れやすい方法を見つけることができます、それはおそらくまったく方法がないよりはましです。以下をコピーしてモジュールの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アクセス可能な参照が見つかりません。

7
Scott Barta

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

APKアナライザーのDEXファイルビューアーを使用すると、アプリのDEXファイルの基になる情報にすぐにアクセスできます。クラス、パッケージ、合計参照数、および宣言数がビューア内で提供され、マルチDEXを使用するかどうか、または依存関係を削除して64kDEX制限を下回る方法を決定するのに役立ちます。

図4は、64kDEXの制限に近づいている中規模のアプリを示しています。

1
mobiledev Alex