IT_Programming/Dev Tools

[펌_안드로이드 스튜디오] Android 빌드 타입별로 APK 생성하기

JJun ™ 2014. 8. 6. 10:15

 


 출처: 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

 

키 저장소 비밀번호 입력: 
새 비밀번호 다시 입력:
이름과 성을 입력하십시오.
  [Unknown]:  nova
조직 단위 이름을 입력하십시오.
  [Unknown]: 
조직 이름을 입력하십시오.
  [Unknown]: 
구/군/시 이름을 입력하십시오?
  [Unknown]: 
시/도 이름을 입력하십시오.
  [Unknown]: 
이 조직의 두 자리 국가 코드를 입력하십시오.
  [Unknown]: 
CN=nova, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown이(가) 맞습니까?
  [아니오]:  y

다음에 대해 유효 기간이 10,000일인 2,048비트 RSA 키 쌍 및 자체 서명된 인증서(SHA256withRSA)를 생성하는 중
 : CN=nova, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
<nova>에 대한 키 비밀번호를 입력하십시오.
 (키 저장소 비밀번호와 동일한 경우 Enter 키를 누름): 
[test.keystore을(를) 저장하는 중] 

 

 

 

 

 

생성된 keystore 를 안드로이드 프로젝트 안에 복사해줍니다.
전 projectRoot/app/keystore 에 복사해봤습니다.

Copy keystore

 

 

build.gradle 에 Singning 설정 추가하기

빌드툴 20버전에, 안드로이드 그래들 플러그인 0.12를 사용할때 기본적으로 생성되는
build.gradle 의 내용은 아래 코드와 같습니다.

 

 

 apply plugin: 'com.android.application'

 android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "net.novafactory.example.gradle.buildtypes"
        minSdkVersion 15
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
 }

 dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
 }

 

 

이제 buildTypes 의 release 에서 signingConfigs 를 사용할 수 있도록 수정해줍니다.

gradle 의 assemble task 를 실행해 APK의 생성을 확인해줍니다.
Terminal 에서 그래들, 그래들 래퍼를 통해 assemble 을 실행하거나,
Android Studio 우측에 있는 Gradle 탭에서 실행할 수 있습니다.

 

Execute assemble task


 

$ ./gradlew assemble
:app:preBuild                                                             
...            
:app:assemble                
              
BUILD SUCCESSFUL
              
Total time: 8.639 secs 

 

 

APK 파일이름에 날짜와 버전 넣기

APK를 계속해서 생성하다 보면, 빌드후의 결과물인 APK에 대해 날짜와 버전별로 관리하고 싶어집니다.
build.gradle 의 android 블럭에 applicationVariants.all 을 추가하면 파일 이름을 재설정 할 수 있습니다.

 

Multiple Build Type(Deploy phase) 설정 추가하기

build.gradle 에서 BuildConfig 에 접근해서 값을 바꾸기 위해 buildConfigField 를 사용해줍니다.

아래 코드와 같이 type, name, value 를 지정해주면, build 시에 BuildConfig 에 field 로 추가해줍니다.
이 설정을 이용해 buildTypes 에서 각 빌드별로 필요한 값을 변경할 수 있게됩니다.

아마 그래들 플러그인 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 을 만들어서 처리해봤습니다.

이제 이 DeployPhase enum 을 reference 해서 build.gradle 을 수정해줍니다.

코드를 수정한 후, IDE에서 sync 를 하거나 직접 build 를 해주면 BuildConfig 에 DEPLOY_PHASE 라는
필드가 추가된 걸 확인할 수 있습니다.

 /**
 * Automatically generated file. DO NOT MODIFY
 */
package net.novafactory.example.gradle.buildtypes;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String PACKAGE_NAME = "net.novafactory.example.gradle.buildtypes";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Fields from build type: debug
  public static final setting.DeployPhase DEPLOY_PHASE = setting.DeployPhase.Debug;
}

 

위에서 만든 BuildConfig.DEPLOY_PHASE 값을 사용해 Server url 을 초기화 하는 예시입니다. 
아래와 같은 식으로 여러가지 설정, 값들을 바꾸어 주면 assemble task 를 한번 실행하면서
각 buildType 에 맞는 APK 를 생성할 수 있습니다.

 

 

Example repository

References