5

私の Android アプリケーションでは、次のような条件付きコードを使用しています。

if(BuildConfig.DEBUG) {
    // do something...
}

そして、ProGuradBuildConfig.DEBUGが false と評価された場合、 内のコード ブロックはif最終的なバイトコードから取り除かれます。これは意図したとおりに機能しています。

しかし、Android 向けの新しいビルド システムの導入により、以前にはなかった多くの機能が利用できるようになりました。私はそれをQAbuildTypeと呼ぶ新しいものを作成することで利用しています。これで、ビルド タイプに応じて true または false になる定数を追加しました。BuildConfig.QA

DEBUGこれで、次のように、ビルドかQAビルドかをテストする必要があるコードがいくつかあります。

if(BuildConfig.DEBUG || BuildConfig.QA) {
    // do something...
}

しかし、これをあちこちに書くのは面倒です。代わりに、次のように、utils クラスに静的メソッドを作成することにしました。

public static boolean isDevelopmentBuild() {
    return BuildConfig.DEBUG || BuildConfig.QA;
}

問題は、このアプローチでは、以前のように条件付きコードが削除されないことです。以前は、ProGuard はこれらの定数を false と評価し、コードを削除することができました。ここで、メソッドを呼び出して戻り値を確認する必要があります。

しかし、そのメソッドの戻り値は定数であるため、ProGuard は、戻り値が常に (実行時に) 定数値であることを認識し、最終的なバイトコードからコードを削除する方法でメソッド呼び出しを評価できますか?

4

2 に答える 2