2016-04-12 15 views
3

次のコードを使用して、特定のパッケージに含まれるすべてのクラスをインスタンス化しています。Android StudioとGradleの2.0バージョンのDexFile

DexFile df = new DexFile(getPackageCodePath()); 
for (Enumeration<String> iter = df.entries(); iter.hasMoreElements();) { 
    String className = iter.nextElement(); 
    if (className.contains(packageName) && !className.contains("$")) { 
     myClasses.add(Class.forName(className).newInstance()); 
    } 
} 

残念ながら、もう正しく動作しません。 Android Studio 2およびGradle 2.0.0以降、DexFileエントリにはアプリケーション内のすべてのクラスは含まれず、com.android.toolsパッケージに属するクラスのみが含まれます。

これは既知の問題ですか?

答えて

6

この問題は、Androidプラグインfor Gradle 2.0.0の新しいInstantRun機能に関連しています。

getPackageCodePath()は、Androidファイルシステムのbase.apkファイルを指す文字列を取得します。そのapkを解凍すると、ルートフォルダの中に1つまたは複数の.dexファイルがあります。メソッドdf.entries()から得られたエントリは、そのコンパイルされたすべてのクラスを取得するために、そのルートフォルダにある.dexファイルを反復処理します。私たちはGradleのための新しいAndroidのプラグインを使用している場合

しかし、我々は唯一のAndroidランタイムとインスタント実行(パッケージcom.tools.android.fd.runtimecom.tools.android.fd.commoncom.tools.android.tools.ir.api)に関連.dexがあります。他のすべてのクラスは、いくつかの.dexファイルでコンパイルされ、instant-run.zipというファイルに圧縮され、apkのルートフォルダに配置されます。

これは、質問に投稿されたコードがアプリ内のすべてのクラスを一覧表示できないためです。それでも、リリースビルドにはInstantRunが含まれていないため、これはDebugビルドにのみ影響します。

+0

私のアプリは理想的にこれを頼りにしており、デバッグは現在自分のアプリケーションを完全に破壊することを意味します。 InstantRunを無効にする方法はありませんか? –

+1

Androidスタジオでそれを無効にする方法があることが判明しました。それは、アプリがそれをサポートできないように自分自身を設定するgradleに書き込めないのは残念です。http://stackoverflow.com/questions/35168753/instant- run-in-android-studio-2-0-how-to-turn-off –

関連する問題