resources 類の場合
通常は src/main
にファイルが置かれていると思いますが、debug ビルド用のファイルは src/debug
ディレクトリを作成して配置します。
main
と debug
で同じ定義(上図でいうとapp_name
)がある場合、debug ビルド時は main
のソース < debug
のソース の優先度で適用してくれます(定義が上書きされる)。debug
のファイルでは、main
の全ての定義を上書きする必要はありません(debug で上書きしたい定義とういうか、その行だけ書けばいい)。
layout
や drawable
の場合はファイル単位で debug ビルド用のものを用意します。
debug でなく release ビルド時のソースを分ける場合も同様な考えで。
Java のソースの場合
Java のソースの場合は、main
のソースは debug
とも release
とも共存できません。もし debug
ビルド時のみのソースを用意するなら、Java 的なエラーにならないよう release
の方にもソースを用意(空の public メソッド等を実装)する必要があります。
ほか debug ビルドあれこれ
debug ビルドのみライブラリを読み込む
dependencies {
// ...
debugCompile 'com.facebook.stetho:stetho:1.2.0'
// ...
}
同様に releaseCompile
では release ビルド時のみ読み込まれます。
debug ビルド時のアプリケーションIDを変える
アプリケーションIDが debug/release で一緒だと、同じ端末上でアプリが共存できませんし、Fabric(Crashlytics) でアプリを debug/release で別に管理しづらかったりします。
そういう場合は、次のようにすると debug ビルド時のアプリケーションIDの末尾に .debug
が付与されるので、release ビルドと別にすることが出来ます。
android {
// ...
buildTypes {
debug {
applicationIdSuffix = ".debug"
}
release {
// ...
}
}
// ...
}
コード上で debug ビルドか否かを判定
上記で説明してきたように、ソースやビルドで分けるほどでもないよっていう時は、普通にコードで if
文で分岐すればよいと思います。最近?の Android Studio ベースのプロジェクトでは、ビルド時に BuildConfig
クラスが自動で生成されるはずなので、
例えば debug ビルド時のみに処理したい場合は次のように書けます。
if (BuildConfig.DEBUG) {
// ...
}
おわりに
ちなみに debug / release ビルドは Android Studio の Build Variants タブで切り替えることが出来ます。
また上記のこと全般について、Product Flavor も同じような感じでいけると思います。