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