リリースモードかデバッグモードかをどのように検出しますか?


回答:


770

最も簡単で長期的な解決策は、を使用することBuildConfig.DEBUGです。これは、デバッグビルド用のboolean値ですtruefalseそれ以外の場合:

if (BuildConfig.DEBUG) {
  // do something for a debug build
}

この値はEclipseベースのビルドから100%信頼できるとは報告されていませんが、個人的には問題が発生していないため、実際の問題の程度はわかりません。

Android Studioを使用している場合、またはコマンドラインからGradleを使用している場合は、独自のものを追加するBuildConfigdebugreleaseヘルプをビルドタイプを実行時に、これらの状況を区別する。

Illegal Argumentの解決策android:debuggableは、マニフェストのフラグの値に基づいています。それが「デバッグ」ビルドと「リリース」ビルドを区別する方法である場合、定義上、それが最良のソリューションです。ただし、今後のdebuggableフラグは、Gradle / Android Studioが「デバッグ」ビルドと見なすものからの独立した概念であることを覚えておいてください。どのビルドタイプでも、debuggableフラグをその開発者とそのビルドタイプにとって意味のある値に設定することができます。


34
BuildConfigたとえば、アプリのパッケージにありますimport com.mycompany.myapp.BuildConfig;
Chris Cirefice

10
AndroiStudioのバグのため、これはもう機能しません。デバッグモードであっても、常にfalseです
user387184

1
@ user387184:Android Studio 1.2.2ではpublic static final boolean DEBUG = Boolean.parseBoolean("true");、デバッグビルドを取得します。これはに設定する奇妙な方法ですDEBUGtrue、機能するはずです。これが1.3.0テストリリースの1つで見られる場合、または1.2.2の再現可能なテストケースがある場合は、問題を報告してください。この問題を報告する未解決の問題はありません。
CommonsWare 2015

2
私はv1.2.2を使用していて、BuildConfig.DEBUGは常にfalseです。次に、以下の提案を試してみました-私のためにも機能します-私もあなたのものを試してみます-どうもありがとう!
user387184 2015

3
結局のところ、これはライブラリを使用している場合は機能しません(常にtrueを返します):stackoverflow.com/q/20176284/878126。最善の選択肢は何
アンドロイド開発者

59

以下を試してください:

boolean isDebuggable =  ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );

コトリン:

val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE

こちらからバンデルポストより抜粋


3
この回答は、ライブラリプロジェクトやアプリケーションプロジェクトに関係なく、すべてのケースで機能します。
Lavekush Agrawal 2017

機能するために何をインポートする必要がありgetApplicationInfo().flagsますか?
A1m

1
[OK]をそれだけで静的な文脈での作業は、見ていないstackoverflow.com/questions/10641144/...
A1M

54

はい、使用しても問題はありません。

if (BuildConfig.DEBUG) {
   //It's not a release version.
}

間違ったBuildConfigクラスをインポートしない限り。依存関係ライブラリからではなく、プロジェクトのBuildConfigクラスを参照していることを確認してください。

ここに画像の説明を入力してください


1
「間違ったBuildConfigクラスをインポートしていない限り」...ええ、非常に良い点です:D
Benjamin Piette

ありがとう!これは私のプロジェクトの問題でした。どういうわけか、ライブラリプロジェクトのBuildConfig(Android Studio 3がリリースされるまでは常にリリースモードです)を取得していました
Amit Garg

36

に関するコメントが混在しているためBuildConfig.DEBUG、デバッグモードでcrashlytics(および分析)を無効にするために以下を使用しました。

/app/build.gradleを更新します

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"

    defaultConfig {
        applicationId "your.awesome.app"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 100
        versionName "1.0.0"
        buildConfigField 'boolean', 'ENABLE_CRASHLYTICS', 'true'
    }
    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            buildConfigField 'boolean', 'ENABLE_CRASHLYTICS', 'false'
        }
        release {
            debuggable false
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

次に、コードでENABLE_CRASHLYTICS次のようにフラグを検出します。

    if (BuildConfig.ENABLE_CRASHLYTICS)
    {
        // enable crashlytics and answers (Crashlytics by default includes Answers)
        Fabric.with(this, new Crashlytics());
    }

アプリで同じコンセプトを使用し、ENABLE_CRASHLYTICS好きな名前に変更します。構成でフラグを確認でき、フラグを制御できるため、このアプローチが好きです。


CrashlyticsとAnswersを別々に呼び出すことはできません。ただ使用してください:Fabric.with(this、new Crashlytics()); CrashlyticsとAnswersを含めます。
Mike Bonnell、2016

1
おかげで、@ MikeBonnell、私はコード例にコードを変更しました
Someone Somewhere

これがBuildConfig.DEBUGの使用とどのように異なるのかわかりません-デバッグビルドにBuildConfig.ENABLE_CRASHLYTICSのみを設定した場合、BuildConfig.DEBUGとBuildConfig.ENABLE_CRASHLYTICSは常に同じ値になりますか?
k2col 2017

開発者がライブラリプロジェクトで作業しているときに、BuildConfig.DEBUGを使用してデバッグ/リリースビルドを検出するときに問題が発生したと思います。Android Studioの初期のバグも関係している可能性があります...
Someone Somewhere

13

または、BuildConfig.BUILD_TYPEを使用して区別することもできます。

デバッグビルドを実行している場合、BuildConfig.BUILD_TYPE.equals("debug");true を 返します。リリースビルドでBuildConfig.BUILD_TYPE.equals("release");はtrue を返します。


1
これが正解です。「リリース」を返しますが、BuildConfig.DEBUGは常にを返しますtrue
Minas Mina

6

私のアプリがデバッグバージョンで実行されていることが判明した場合に備えて、このソリューションを使用しています。

if (BuildConfig.BUILD_TYPE.equals("Debug")){
   //Do something
}

1
回答に説明を追加してください。単なるコードよりも役立つでしょう。
Mathews Sunny

if (BuildConfig.DEBUG) {} (もちろん)アプリのbuild.gradleファイルへの参照がなかった依存型Gradleモジュールで使用していたため、デバッグモードが誤って認識されていました。if (BuildConfig.BUILD_TYPE.equals("Debug")){ }問題を修正しました。ありがとう
kosiara-Bartosz Kosarzycki

これは本当の答えです。 "Debug"を "debug"に変更してください
Jetwiz

1

正しいBuildConfigクラスをインポートしていることを確認してください。そうです。使用しても問題はありません。

if (BuildConfig.DEBUG) {
   //It's not a release version.
}

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