본문 바로가기

개발환경 설정/Tools

Android Studio를 배워보자 - (3) Gradle 스크립트를 수정하여 릴리즈 빌드 함께 빌드하기

안드로이드 스튜디오는 그래들(Gradle)을 사용하여 빌드를 수행합니다. 때문에, 스크립트를 수정하면 매 빌드 시마다 디버그 빌드와 릴리즈 빌드를 함께 생성할 수 있습니다.


이 글은 Android Studio 0.5.8을 기준으로 작성되었습니다. 추후 업데이트로 인해 글에서 다룬 내용과 실제 환경이 다를 수 있습니다.


릴리즈 빌드를 함께 생성하기 위한 절차를 다음과 같습니다.


  1. 서명 옵션 설정 (릴리즈 빌드용)
  2. 릴리즈 빌드에 사용할 서명 옵션 지정

생각보다 간단하죠? 바로 알아보도록 하겠습니다.

서명 옵션 (signingConfigs) 설정


릴리즈 빌드는 디버그 빌드와 달리 개발자 고유의 키를 사용하여 서명합니다. 따라서, 릴리즈 빌드를 생성하려면 서명에 사용할 키의 정보가 필요합니다. 이를 위한 설정은 build.gradle 내의 signingConfigs 하위에 선언합니다.


signingConfigs 하위에는 자신이 원하는 이름으로 서명 옵션을 선언하고, 그 아래에 다음 내용을 선언합니다.


  • storeFile : 키스토어(Keystore) 파일 위치
  • storePassword : 키스토어 비밀번호
  • keyAlias : 서명에 사용할 키(Key) 이름
  • keyPassword : 키의 비밀번호

다음은 안드로이드 디버그용 키를 사용하는 서명 옵션을 선언한 예를 보여줍니다. 실제로는 이 부분에 자신이 사용하는 키스토어 및 키를 입력해야 합니다.

[build.gradle]

 signingConfigs {
        release {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }



릴리즈 빌드에 사용할 서명 옵션 지정


서명 옵션을 선언했다면, 릴리즈 빌드를 수행할 때 위에서 선언한 서명 옵션을 사용하도록 지정하면 됩니다. 이는 signingConfig 속성을 사용하여 지정합니다. 다음은 위에서 선언한 서명 옵션(release)를 릴리즈 빌드시 사용하는 서명 옵션으로 지정하는 예를 보여줍니다.


[build.gradle]

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            signingConfig signingConfigs.release
        }
    }


이것으로 모든 설정이 끝났습니다. 콘솔(터미널)에서 빌드 명령(gradle build 혹은 gradlew build)을 수행하면 다음과 같이 디버그 빌드 및 릴리즈 빌드 apk가 동시에 생성됩니다.


서명 키 보안 강화하기 - gradle.properties 사용


위와 같이 빌드스크립트 내에 릴리즈 빌드에 사용하는 키 설정을 선언하는 방법은 상대적으로 보안에 취약합니다. 특히, 오픈소스 프로젝트의 경우 빌드스크립트가 저장소에 공유되므로 자신의 키에 대한 정보가 그대로 노출됩니다.


이러한 문제를 해결하기 위해, gradle.properties 라는 파일 내에 서명에 필요한 키 정보를 저장하고, 빌드스크립트에서는 여기에 저장된 정보를 불러오는 방법을 사용할 수 있습니다. 물론, gradle.properties 파일은 버전 관리에 포함되지 않도록 관리해야겠지요.


gradle.properties 파일은 프로젝트를 생성할 때 프로젝트 최상위 경로에 생성됩니다. 생성되어 있지 않다면, 새 파일을 생성하면 됩니다. 파일을 생성한 후, 다음과 같이 서명에 필요한 키 정보를 기록합니다.


[gradle.properties]

keystore=debug.keystore
keystore_pass=android
key_alias=androiddebugkey
key_pass=android


다음, build.gradle 파일의 signingConfigs에 gradle.properties 내에 선언된 정보를 사용하는 서명 옵션을 선언합니다. (앞에서 만들었던 release 서명 옵션을 아래로 대체하는 것도 가능합니다. 자신이 원하는 대로 하면 됩니다 :))


[build.gradle]

    signingConfigs {

        releaseWithProps {
            storeFile file(keystore)
            storePassword keystore_pass
            keyAlias key_alias
            keyPassword key_pass
        }
    }


마지막으로, 릴리즈 빌드를 사용할 때 사용할 서명 옵션을 변경하면 모든 절차가 완료됩니다.


[build.gradle]

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            signingConfig signingConfigs.releaseWithProps
        }
    }



서명 키 보안 강화하기 - 환경변수(Environment Variable) 사용


프로퍼티 파일 외에도, 환경 변수를 사용하면 조금 더 안전하게 키 정보를 관리할 수 있습니다. 환경 변수를 참조하는 서명 옵션 선언 예는 다음과 같습니다.


[build.gradle]

releaseWithEnv {
            storeFile file(System.getenv("KEYSTORE"))
            storePassword System.getenv("KEYSTORE_PASS")
            keyAlias System.getenv("KEY_ALIAS")
            keyPassword System.getenv("KEY_PASS")
 }


환경 변수를 가져오기 위해 System.getenv() 메서드를 사용하고, 각각 환경변수 이름을 사용하여 저장된 환경변수 내 값을 참조합니다.


환경변수를 사용하는 빌드 환경을 구성할 때의 유의할 점으로는, (당연한 말이지만) 환경변수가 제대로 설정되어 있지 않다면 빌드가 실패합니다. 그런데, 이는 환경 변수를 사용하는 빌드 옵션이 '선언되어 있기만' 해도 해당됩니다. 즉, 환경변수를 사용하는 빌드 옵션을 선언하긴 했지만 사용하지 않는 상태라도 해당 환경 변수가 설정되어 있지 않다면 빌드를 수행하는 과정에서 환경변수 값을 불러오지 못해 빌드가 실패합니다.


이것으로 그래들 빌드스크립트를 수정하여 릴리즈 빌드를 수행하는 방법에 대해 알아보았습니다. 위 글에서 사용한 예제는 다음 경로에서 받을 수 있습니다.