AdMob 광고를 넣은 앱을 개발할 때 테스트 광고 ID실제 광고 ID를 수동으로 바꿔가며 빌드하고 있다면, 빌드 변형(Build Variant)별 리소스 분리를 사용해서 이 과정을 자동화할 수 있습니다.

수동 교체의 문제점

코드에 광고 ID를 직접 하드코딩하면 이런 실수가 생기기 쉽습니다:

  • 테스트 ID를 그대로 둔 채 릴리스 빌드를 올림 -> 수익 발생 안 함
  • 실제 ID를 넣고 디버그 빌드를 돌림 -> AdMob 정책 위반 가능성

해결 방법: Build Variant별 리소스 파일 분리

Android 빌드 시스템은 debug, release 등 빌드 타입별로 별도의 소스셋(source set)을 지원합니다. 같은 리소스 이름을 각 소스셋에 다른 값으로 정의하면, 빌드 타입에 따라 자동으로 올바른 값이 선택됩니다.

디렉토리 구조

app/src/
├── debug/
│   └── res/
│       └── values/
│           └── ads.xml    ← 테스트 광고 ID
├── release/
│   └── res/
│       └── values/
│           └── ads.xml    ← 실제 광고 ID
└── main/
    └── ...                ← 공통 코드 및 리소스

debug/release/ 디렉토리가 없으면 직접 생성하면 됩니다.

debug용 리소스 (테스트 광고 ID)

app/src/debug/res/values/ads.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Google에서 제공하는 테스트 광고 단위 ID -->
    <string name="banner_ad_unit_id">ca-app-pub-3940256099942544/6300978111</string>
    <string name="interstitial_ad_unit_id">ca-app-pub-3940256099942544/1033173712</string>
</resources>

release용 리소스 (실제 광고 ID)

app/src/release/res/values/ads.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 본인의 AdMob 광고 단위 ID -->
    <string name="banner_ad_unit_id">ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX</string>
    <string name="interstitial_ad_unit_id">ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX</string>
</resources>

두 파일의 string name반드시 동일해야 합니다.

코드에서 사용

광고를 로드하는 코드에서는 빌드 타입을 신경 쓰지 않고 리소스를 참조하면 됩니다:

val adUnitId = context.getString(R.string.banner_ad_unit_id)
  • Debug 빌드(Android Studio에서 Run 버튼) -> debug/res/values/ads.xml의 테스트 ID 사용
  • Release 빌드(서명된 APK/AAB 생성) -> release/res/values/ads.xml의 실제 ID 사용

주의사항

  • main/res/values/에 같은 이름의 리소스가 있으면 충돌이 발생합니다. 광고 ID는 main에 정의하지 말고 debugrelease에만 정의해야 합니다.
  • 새로운 광고 단위를 추가할 때는 debugrelease 양쪽 모두에 추가해야 합니다. 한쪽만 추가하면 다른 빌드 타입에서 컴파일 오류가 발생합니다.

Updated: