본문 바로가기
개발/Java

Java_ buildType 활용하여 debug, release 구분하기

by JunsC 2024. 10. 2.
728x90

처음에 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

 

 

이렇게 조금 상세하게 정리해봤어 !!!

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."