출처: http://novafactory.net/archives/3143
안드로이드 애플리케이션을 개발하다 보면, 빌드타입별, 마켓별 APK 를 따로 생성해줘야하는 경우가 많습니다. gradle 빌드를 사용한다면 buildTypes 를 이용해 한번의 빌드로 여러 상황에 맞는 APK 를 생성할 수
있습니다.
Keystore 생성하기
먼저 release 빌드를 위해 keystore 를 생성해줍니다.
이미 사용할 keystore 가 있는 경우에는 따로 생성하지 않아도 됩니다.
Java 가 가지고 있는 keytool 유틸리티로 keystore 를 생성해줍니다.
$ keytool -genkey -v -keystore test.keystore -alias nova -keyalg RSA -keysize 2048 -validity 10000
키 저장소 비밀번호 입력: 다음에 대해 유효 기간이 10,000일인 2,048비트 RSA 키 쌍 및 자체 서명된 인증서(SHA256withRSA)를 생성하는 중
|
생성된 keystore 를 안드로이드 프로젝트 안에 복사해줍니다.
전 projectRoot/app/keystore 에 복사해봤습니다.
build.gradle 에 Singning 설정 추가하기
빌드툴 20버전에, 안드로이드 그래들 플러그인 0.12를 사용할때 기본적으로 생성되는
build.gradle 의 내용은 아래 코드와 같습니다.
apply plugin: 'com.android.application' android { defaultConfig { dependencies {
|
build.gradle 의 android 블럭 안에 signingConfigs 를 추가해줍니다.
보통의 경우 release 에 keystore 로 sign 할 것이므로 release 만 추가해줍니다.
... |
이제 buildTypes 의 release 에서 signingConfigs 를 사용할 수 있도록 수정해줍니다.
buildTypes { |
gradle 의 assemble task 를 실행해 APK의 생성을 확인해줍니다.
Terminal 에서 그래들, 그래들 래퍼를 통해 assemble 을 실행하거나,
Android Studio 우측에 있는 Gradle 탭에서 실행할 수 있습니다.
$ ./gradlew assemble |
APK 파일이름에 날짜와 버전 넣기
APK를 계속해서 생성하다 보면, 빌드후의 결과물인 APK에 대해 날짜와 버전별로 관리하고 싶어집니다.
build.gradle 의 android 블럭에 applicationVariants.all 을 추가하면 파일 이름을 재설정 할 수 있습니다.
// 날짜를 원하는 형식으로 출력하기 위해 import apply plugin: 'com.android.application' ... android { |
Multiple Build Type(Deploy phase) 설정 추가하기
build.gradle 에서 BuildConfig 에 접근해서 값을 바꾸기 위해 buildConfigField 를 사용해줍니다.
아래 코드와 같이 type, name, value 를 지정해주면, build 시에 BuildConfig 에 field 로 추가해줍니다.
이 설정을 이용해 buildTypes 에서 각 빌드별로 필요한 값을 변경할 수 있게됩니다.
buildConfigField "<type>", "<name>", "<value>" |
아마 그래들 플러그인 0.6(?) 정도까지는 buildConfig “public static final boolean release = true;” 와 같은 식으로 쓰다 그래들 플러그인 0.7 이후(그래들 1.9 이후인듯) buildConfigField 로 대체된 것 같습니다. 구글 그룹스 adt-dev 에 Jake Wharton 님이 답변한게 있더군요. https://groups.google.com/d/msg/adt-dev/AJCdoXZT2DY/wIaEFdhjHBIJ
기본적으로 type 에는 primitive type 이나 String 정도만 사용할 수 있는데(import 가 자동으로 안되므로),
package 경로까지 다 붙여주면 직접 만든 Class 도 사용할 수 있습니다.
저는 setting 이라는 package 를 만들고 DeployPhase enum 을 만들어서 처리해봤습니다.
package setting; public enum DeployPhase { int value; DeployPhase(int value) { public static DeployPhase findByValue(int value) { |
이제 이 DeployPhase enum 을 reference 해서 build.gradle 을 수정해줍니다.
... |
코드를 수정한 후, IDE에서 sync 를 하거나 직접 build 를 해주면 BuildConfig 에 DEPLOY_PHASE 라는
필드가 추가된 걸 확인할 수 있습니다.
/** public final class BuildConfig { |
위에서 만든 BuildConfig.DEPLOY_PHASE 값을 사용해 Server url 을 초기화 하는 예시입니다.
아래와 같은 식으로 여러가지 설정, 값들을 바꾸어 주면 assemble task 를 한번 실행하면서
각 buildType 에 맞는 APK 를 생성할 수 있습니다.
package net.novafactory.example.gradle.buildtypes; /** public static final String SERVER_URL = initServerUrl(); private static String initServerUrl() { return null; |
Example repository
References
'IT_Programming > Dev Tools' 카테고리의 다른 글
[펌] Maven 사용자를 위한 Gradle 의 간단 사용법 (0) | 2015.02.10 |
---|---|
Android 빌드 타입별로 APK 생성하기 (0) | 2014.08.08 |
Android Studio를 배워보자 - (1) 주요 특징 및 빌드 시스템 (0) | 2014.05.12 |
custom_rules.xml (0) | 2014.05.07 |
[펌] .gitignore 이 적용되지 않아??? (0) | 2014.04.21 |