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


110

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

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

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


2
BuildConfig.javaは、Androidビルドツールによって自動的に生成され、genフォルダーに配置されます。署名済みAPKにはBuildConfig.DEBUG = falseが必要です。それはあなたにとって問題ではないはずです。そのファイルを手動で操作する必要はありません...
IgorGanapolsky 2013年

1
Gradleを使用してこのフラグを解放する場合、100%信頼できます。ですから、。/ gradlewをアセンブルするときはtrueに、アセンブルするときはfalseにしてください。
スロット

回答:


56

現在、「Build Automatically」を無効にしてプロジェクトをクリーンアップし、「Android Tools-> Export Signed Application Package」でエクスポートすることで、正しい動作を得ることができます。アプリケーションを実行すると、BuildConfig.DEBUGfalseになります。


壊れた。これは、このフラグによって省略されるべきすべてのLog.dメッセージを表示する結果になります。ps。バグレポートを提出する場所は?
tomi

私がデバッグしているときでも、常にfalseです
behelit

39

Eclipseの、リリースでアプリをエクスポートする前に、私は常に無効にする「ビルドの自動」オプションを選択します。次に、プロジェクトをクリーンアップしてエクスポートします。それ以外の場合は、デバッグモードでコンパイルを開始し、BuildConfig.DEBUGの値が間違っている可能性があります。

Androidのメーカー、私は単に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
}

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


1
このソリューションは、リガード値を持つ定数を生成するため、proguardを使用する場合に最適です。リリースモードでは、デバッグコードがバイナリから完全に削除されます。
Victor Laerte

33

それは正しく機能しません:

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

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


9
これを修正したい場合は、上記の問題へのリンクにアクセスして「スター」を付けてください。
ガイ

11

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

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

テスト中、私のLogステートメントは出力を生成しなくなりました。


1
あなたは正確に何をしましたか?
pbhowmick 2013年

2
BuildConfig.DEBUGのインスタンスをcom.mypackage.BuildConfig.DEBUGに変更してから、アプリを再実行したところ、常にtrueが返されました。多分私はあなたの提案を誤解しました。
Chris Rae 2013年

1
私が言っているのは、コードは変更されないということです。ただし、com.mypackage.BuildConfig.DEBUGはFalseポストコンパイルに設定されます。上記のようにテストログステートメントを試し(任意の文字列を選択してログに記録)、エクスポートを実行します。adbがログステートメントを表示するかどうかを確認します。DEBUGがfalseに設定されていることを示すadbがそのロギングステートメントを報告しないことに賭けます。
pbhowmick 2013年

1
「コード」の意味がわからない...しかし、APKをエクスポートする前にクリーンアップを実行すると(承認された回答で提案)、BuildConfig.DEBUGとcom.mypackage.BuildConfigの両方が作成されたと言います.DEBUGは期待どおりにfalseを報告します。
Chris Rae 2013年

了解しました。これが予想される動作です。
pbhowmick 2013年

10

を確認しimportsます。BuildConfigがライブラリの任意のクラスから誤ってインポートされることがあります。例えば:

import io.fabric.sdk.android.BuildConfig;

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

import com.yourpackagename.BuildConfig;

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

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


1
ええ、私にとっては誤ってからインポートされましたandroid.support.compat。これが、独自のフィールドを別の名前で定義するもう1つの理由だと思います。
arekolek 2017

5

リリースの準備から:

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

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

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

詳細はリンク先をご覧ください。


1
このプロセスはビルド時に自動的に行われるようになりました:developer.android.com/tools/sdk/tools-notes.html
IgorGanapolsky 2013年

コンパイル時エラーの原因:«デバッグモードをハードコーディングしないでください。省略した場合、デバッグビルドとリリースビルドで自動的に割り当てられます»
Nikita Bosik 2015

5

私のための解決策:

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

r20で動作します


1
これはちょうど私のために働いた(私が推測する最新のADTを使用して)。多分クリーニングはそれを修正しました、確かではありません。
Jonny

3

APKのエクスポート中にプロガードを使用する場合、簡単な回避策を提案したいと思います。

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

Build Automaticallyこれはビルダーの個々のIDE設定に依存しないが、開発者間で共有されるコミットされたファイルとして維持されるため、オプションを無効にするよりもこれを使用することを好みます。


1

私が理解している限り、正しく機能しません(Androidの問題22241

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

それがうまくいくのを聞きたいです


1
これはr17で修正されているはずで、バグトラッカーでそのようにマークされています。
smith324 2012年

1
実際、libsはエクスポート時にADTのリリースモードでコンパイルされません(Antで動作)。code.google.com/p/android/issues/detail?id=27940
Xavier Ducrohet

1
@Xavそれを調べてくれてありがとう、私は今約束するあなたへのスパムをやめます。それは実際に私が問題を抱えていた主なプロジェクトでした(依存ライブラリを調べませんでした)。具体的なテストケースを作成できる場合は、同じ問題の下でバグトラッカーに投稿します。
smith324 2012年

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

}

12
このメソッドの問題は、DEBUGがfalseの場合でも、javaが各文字列を計算してカスタムクラスに渡すことです。if(DEBUG)Log.d(...)はエレガントではありませんが、より効率的です。
ジェレミファ2013

0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.