ADTの最新バージョン(r17)では、ビルドタイプに応じて設定されるBuildConfig.DEBUG
生成された定数が追加されました。私が抱えている問題は、決してfalseに設定されないことです。「Androidツール->署名済みアプリケーションパッケージのエクスポート」を実行すると変更されると予想していましたが、私にはそうではありません。
ビルドタイプを変更するにはどうすればよいですか?
デバッグモードでのみ一部のコードを実行できる機能が追加されました。ビルドは、ビルドタイプに従って自動的に設定されるDEBUG定数を含むBuildConfigというクラスを生成するようになりました。コード内の(BuildConfig.DEBUG)定数を確認して、デバッグ専用関数を実行できます
現在、「自動的にビルド」を無効にし、プロジェクトをクリーンアップし、「Androidツール->署名済みアプリケーションパッケージをエクスポート」でエクスポートすることで、正しい動作を得ることができます。アプリケーションを実行すると、BuildConfig.DEBUG
はfalseになります。
Eclipseを使用すると、リリースでアプリをエクスポートする前に、「自動的にビルド」オプションを常に無効にします。次に、プロジェクトをクリーンアップしてエクスポートします。そうでない場合は、デバッグモードでコンパイルを開始し、BuildConfig.DEBUGの値が間違っている可能性があります。
Android Studioを使用して、build.gradleに独自のカスタム変数を追加するだけです。
buildTypes {
debug {
buildConfigField "Boolean", "DEBUG_MODE", "true"
}
release {
buildConfigField "Boolean", "DEBUG_MODE", "false"
}
}
プロジェクトをビルドすると、BuildConfig.Javaが次のように生成されます。
public final class BuildConfig {
// Fields from build type: debug
public static final Boolean DEBUG_MODE = true;
}
次に、私のコードで使用できます:
if (BuildConfig.DEBUG_MODE) {
// do something
}
デバッグ/リリースビルドを切り替えた後、クリーンにすることをお勧めします。
動作しますが、署名済みファイルをエクスポートする場合でも、コードファイルは変更されないことに注意してください。 export processは、この変数の値をfalseに変更します。これにより、変数が機能していないという誤った印象を与える可能性があります。私は次のようなロギングステートメントでこれをテストしました
if (com.mypackage.BuildConfig.DEBUG)
Log.d(TAG, location.getProvider() + " location changed");
テスト時に、Logステートメントで出力が生成されなくなりました。
imports
を確認します。時々BuildConfigが意図せずにライブラリのクラスからインポートされます。例えば:
import io.fabric.sdk.Android.BuildConfig;
この場合、BuildConfig.DEBUGは常にfalseを返します。
import com.yourpackagename.BuildConfig;
この場合、BuildConfig.DEBUGは、実際のビルドバリアントを返します。
p.sここに私の答えからこれをコピーします: gradleでライブラリプロジェクトをビルドするときは、BuildConfig.DEBUGは常にfalse
From リリースの準備 :
ロギングとデバッグをオフにします
リリース用にアプリケーションをビルドする前に、必ずロギングを無効にし、デバッグオプションを無効にしてください。ソースファイルのLogメソッドへの呼び出しを削除することにより、ログを無効にできます。マニフェストファイルのタグからAndroid:debuggable属性を削除するか、マニフェストファイルのAndroid:debuggable属性をfalseに設定することにより、デバッグを無効にできます。また、プロジェクトで作成されたログファイルまたは静的テストファイルを削除します。
また、startMethodTracing()およびstopMethodTracing()メソッド呼び出しなど、コードに追加したすべてのデバッグトレース呼び出しを削除する必要があります。
詳細については、リンクを参照してください。
私にとっての解決策:
R20で動作します
APKエクスポート中にproguardを使用する場合、簡単な回避策を提案したいと思います。
Proguardは、リリースモードで特定の関数への呼び出しを削除する方法を提供します。 proguard-project.txt
で次の設定を行うと、デバッグログの呼び出しを削除できます。
# Remove debug logs
-assumenosideeffects class Android.util.Log {
public static *** d(...);
public static *** v(...);
}
project.properties
の最適化設定。
proguard.config=${sdk.dir}/tools/proguard/proguard-Android-optimize.txt:proguard-project.txt
これにより、@ Jeremyfaがポイントしたデバッグログに渡される不要な文字列計算を心配する必要はありません。計算はリリースビルドで削除されました。
したがって、BuildConfig.DEBUGの回避策は、次のようなproguardの同じ機能を使用します。
public class DebugConfig {
private static boolean debug = false;
static {
setDebug(); // This line will be removed by proguard in release.
}
private static void setDebug() {
debug = true;
}
public static boolean isDebug() {
return debug;
}
}
そして、proguard-project.txt
の次の設定。
-assumenosideeffects class com.neofect.rapael.client.DebugConfig {
private static *** setDebug();
}
これは、ビルダーの個々のIDE設定に依存せず、開発者間で共有されるコミット済みファイルとして維持されるため、Build Automatically
オプションを無効にするためにこれを使用することをお勧めします。
私が理解した限りでは正しく動作しません( Android issue 22241 )
プロジェクト(Eclipseでの作業)で問題が発生しました。プロジェクトの署名済みAPKをエクスポートするときに、その定数がtrueに設定されていませんでした:(
それが動作するのを聞いてみたい
良い方法は、独自のクラスを作成することです:
public class Log {
public static void d(String message) {
if (BuildConfig.DEBUG)
Android.util.Log.d(
"[" + (new Exception().getStackTrace()[1].getClassName()) + "]",
"{" + (new Exception().getStackTrace()[1].getMethodName()) + "} "
+ message
);
}
}
BuildConfigの値が最終値に設定されている場合に関係する奇妙な動作を見てきました。これはあなたの問題と関係があるかもしれません。
簡単な説明は、デフォルト値はProguardの実行前に最初に設定され、Proguardの実行後にBuildConfigファイルが適切な値で再生成されるということです。ただし、Proguardはすでにこの時点でコードを最適化しているため、問題があります。
これは私がGradleに対して作成したバグです。 https://code.google.com/p/Android/issues/detail?id=182449