처음에 React Native 를 했을때를 기억을 되살려보면서 안드로이드 디버그와 릴리즈모드를 구분해서 진행하기로 했다.
근데 React Native에서 모드를 구분했을때랑은 약간 다른 느낌을 받았다.
React Native는 크로스 플랫폼으로써 필요 부분만 설정해 놓은 점을 느꼈다면, AOS / IOS 각각의 설정들은 역시 네이티브라서 보다 섬세하고 세심하게 설정을 해야하는 작업을 해야했다.

땀이 주르륵....
우선 순차적으로 구분하는 방법을 설명해주겠다.
1. Debug / Main / Release 폴더 구분하기

Debug / Main / Release
이렇게 3가지 구조로 나눈다.

Debug / Release 에 values , json 파일들 넣어놨는데 저기에 해당된 데이터들은 모두 적용이 되고 나머지 해당되지 않는 데이터는 main 에서의 폴더 및 파일이 자동으로 채워진다. 그래서 반드시 Release 폴더안에 res/values/strings.xml 파일에 무조건 해당되는 데이터를 무조건 넣어야만 적용되는게 아니라 Release 폴더안에 안넣는다면 main 폴더안에 있는 strings.xml 파일 내용을 기준으로 자동으로 Release 버전에 적용이 되는 것이다.

위와 같은 사진을 보자면 applicationIdSuffix = ".debug" 라고 해놓아야한다.
그래야지 앱을 설치할때 패키지 이름이 다르게 인식되어져서 2개 따로 설치할 수 있다.
2. google-services.json 데이터 수정
그리고 google-services.json 데이터 안에

.debug 서픽스를 추가 시켜준다. 보통 Debug / Release 모드를 구분할때 우리는 파이어베이스 설정작업을 하곤 한다. 그래서 파이어베이스 설정작업을 한다면 google-services.json 파일을 안에 넣어야 하는데 그 파일 안의 내용은 우리의 패키지 이름을 인식하고 있다.
이걸 안해준다면 앱 실행시, 멀쩡히 작동했던 FCM 기능이 이상해지거나 앱 실행이 안될 수도 있다.
그래서 반드시 이부분은 필수적으로 진행해야 한다 !!!

패키지 내용의 코드들을 살펴보면
{
"project_info": {
"project_number": "",
"project_id": "",
"storage_bucket": ""
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "",
"android_client_info": {
"package_name": "com.example.app.debug",
}
},
"oauth_client": [
{
"client_id": "",
"client_type": 1,
"android_info": {
"package_name": "com.example.app.debug",
"certificate_hash": ""
}
},
{
"client_id": "",
"client_type":
}
],
"api_key": [
{
"current_key": ""
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "",
"client_type":
}
]
}
}
}
],
"configuration_version": "1"
}
이렇게 나오는데 여기에서

이 부분을 잘 살펴보면 com.example.app.debug 라고 되어있는것을 확인할 수 있다.
이렇게 설정을 해야 디버그 모드에도 fcm 기능이 제대로 작동한다.
Release 모드도 당연히 저렇게 바꾸어야 한다.

3. Gradle buildTypes 설정 변경
그래서 Admob , <string name /> 등 디버그와 릴리즈가 분리되어 있는 고유 키값들은 Debug / Release 이 2개의 폴더에 넣어놓기만 하고 나머지 변수들은 일반 main 에 적용시킨 데이터를 자동으로 끌어와서 적용시켜준다.

Build.gradle 를 저렇게 설정을 해준다 .

그리고 실행시 빌드 유형을 구분해주고 실행한다면 작동이 될 것이다. 위와 같이 설정을 바꾸면서 디버그로 실행할지 , 릴리즈로 실행할지를 선택하면 된다.

에서 살펴보면 buldConfigField 라고 되어 있고 "BASE_URL" 이라고 설정되어 있는데 이는
BuildConfig.BASE_URL

이런식으로 Debug 모드에서 설정해 놓은 URL 과 Release 모드에서 설정해 놓은 URL 을 자동으로 구분해주는 역할을 해준다.
이렇게 간단하게 각 모드를 구분하는 방법을 알아보았다.
그럼 대략적으로 어떻게 구분하는지 정리해볼께 !!
별책부록
✅ Android 프로젝트에서 빌드 타입 설정 (Gradle)
Android 프로젝트에서는 build.gradle에서 빌드 타입을 설정할 수 있어.
android {
...
buildTypes {
debug {
applicationIdSuffix ".debug" // 디버그 버전 구분 (예: com.example.app.debug)
debuggable true // 디버깅 활성화
}
release {
minifyEnabled true // 코드 난독화 활성화
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release // 서명 설정
}
staging {
applicationIdSuffix ".staging"
debuggable true
minifyEnabled false // 난독화 비활성화
}
}
}
📌 빌드 타입에 따른 API 설정
flavorDimensions "version"
productFlavors {
dev {
dimension "version"
applicationIdSuffix ".dev"
buildConfigField "String", "BASE_URL", "\"https://dev-api.example.com\""
}
staging {
dimension "version"
applicationIdSuffix ".staging"
buildConfigField "String", "BASE_URL", "\"https://staging-api.example.com\""
}
prod {
dimension "version"
buildConfigField "String", "BASE_URL", "\"https://api.example.com\""
}
}
📌 Java 코드에서 빌드 타입 확인
if (BuildConfig.DEBUG) {
Log.d("DEBUG", "This is a debug build");
}
Log.d("API", "Base URL: " + BuildConfig.BASE_URL);
✅ 순수 Java 프로젝트에서 빌드 타입 관리
Java 프로젝트에서는 빌드 타입을 직접 정의해서 관리해야 해.
📌 1) Gradle 사용
apply plugin: 'application'
application {
mainClassName = "com.example.Main"
}
ext {
buildType = project.hasProperty('buildType') ? project.getProperty('buildType') : 'debug'
}
task printBuildType {
doLast {
println "Current Build Type: $buildType"
}
}
- 실행 시 빌드 타입 지정 가능
./gradlew build -PbuildType=release
이렇게 조금 상세하게 정리해봤어 !!!
'개발 > Java' 카테고리의 다른 글
AOS_ Python 연동 (0) | 2025.02.28 |
---|---|
Java_ google social Login (1) | 2024.10.18 |
Java_ 지역변수 , 인스턴스 변수 차이 (0) | 2024.09.12 |
Java & Swift _ runOnUiThread , view.post , handler, DispatchQueue.... 의 차이 (0) | 2024.09.12 |
Java_ Rxjava blockingGet , subscribe ... (0) | 2024.08.25 |