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 も同じような感じでいけると思います。


