web-dev-qa-db-ja.com

ADTはBuildConfig.DEBUGをいつfalseに設定しますか?

ADTの最新バージョン(r17)では、ビルドタイプに応じて設定されるBuildConfig.DEBUG生成された定数が追加されました。私が抱えている問題は、決してfalseに設定されないことです。「Androidツール->署名済みアプリケーションパッケージのエクスポート」を実行すると変更されると予想していましたが、私にはそうではありません。

ビルドタイプを変更するにはどうすればよいですか?

デバッグモードでのみ一部のコードを実行できる機能が追加されました。ビルドは、ビルドタイプに従って自動的に設定されるDEBUG定数を含むBuildConfigというクラスを生成するようになりました。コード内の(BuildConfig.DEBUG)定数を確認して、デバッグ専用関数を実行できます

107
smith324

現在、「自動的にビルド」を無効にし、プロジェクトをクリーンアップし、「Androidツール->署名済みアプリケーションパッケージをエクスポート」でエクスポートすることで、正しい動作を得ることができます。アプリケーションを実行すると、BuildConfig.DEBUGはfalseになります。

56
smith324

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
}

デバッグ/リリースビルドを切り替えた後、クリーンにすることをお勧めします。

36
Arnaud SmartFun

正しく動作しません:

問題 2794 :エクスポートされたアプリケーションパッケージのBuildConfig.DEBUGは「true」です

彼らが時々バグのある機能をリリースするのは残念です。

33

動作しますが、署名済みファイルをエクスポートする場合でも、コードファイルは変更されないことに注意してください。 export processは、この変数の値をfalseに変更します。これにより、変数が機能していないという誤った印象を与える可能性があります。私は次のようなロギングステートメントでこれをテストしました

if (com.mypackage.BuildConfig.DEBUG)
            Log.d(TAG, location.getProvider() + " location changed");

テスト時に、Logステートメントで出力が生成されなくなりました。

10
pbhowmick

importsを確認します。時々BuildConfigが意図せずにライブラリのクラスからインポートされます。例えば:

import io.fabric.sdk.Android.BuildConfig;

この場合、BuildConfig.DEBUGは常にfalseを返します。

import com.yourpackagename.BuildConfig;

この場合、BuildConfig.DEBUGは、実際のビルドバリアントを返します。

p.sここに私の答えからこれをコピーします: gradleでライブラリプロジェクトをビルドするときは、BuildConfig.DEBUGは常にfalse

8
Gent Berani

From リリースの準備

ロギングとデバッグをオフにします

リリース用にアプリケーションをビルドする前に、必ずロギングを無効にし、デバッグオプションを無効にしてください。ソースファイルのLogメソッドへの呼び出しを削除することにより、ログを無効にできます。マニフェストファイルのタグからAndroid:debuggable属性を削除するか、マニフェストファイルのAndroid:debuggable属性をfalseに設定することにより、デバッグを無効にできます。また、プロジェクトで作成されたログファイルまたは静的テストファイルを削除します。

また、startMethodTracing()およびstopMethodTracing()メソッド呼び出しなど、コードに追加したすべてのデバッグトレース呼び出しを削除する必要があります。

詳細については、リンクを参照してください。

5
peter

私にとっての解決策:

  1. プロジェクト->自動ビルド
  2. プロジェクト->クリーン
  3. プロジェクト->ビルド
  4. プロジェクトのエクスポートAndroidアプリケーション

R20で動作します

5
e.shishkin

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オプションを無効にするためにこれを使用することをお勧めします。

3
neo.kim

私が理解した限りでは正しく動作しません( Android issue 22241

プロジェクト(Eclipseでの作業)で問題が発生しました。プロジェクトの署名済みAPKをエクスポートするときに、その定数がtrueに設定されていませんでした:(

それが動作するのを聞いてみたい

1

良い方法は、独自のクラスを作成することです:

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
        );
}

}
1

BuildConfigの値が最終値に設定されている場合に関係する奇妙な動作を見てきました。これはあなたの問題と関係があるかもしれません。

簡単な説明は、デフォルト値はProguardの実行前に最初に設定され、Proguardの実行後にBuildConfigファイルが適切な値で再生成されるということです。ただし、Proguardはすでにこの時点でコードを最適化しているため、問題があります。

これは私がGradleに対して作成したバグです。 https://code.google.com/p/Android/issues/detail?id=182449

0
TALE