Insert resValue in gradle file

도입

소셜 로그인 라이브러리 (https://github.com/WindSekirun/SocialLogin) 를 업데이트 하면서, 샘플 앱을 구현할 필요가 있었는데 흔히 api 키는 비밀로 유지되어야 할 사항으로 여겨진다.

이를 적당히 우회할 수 있는 방법을 찾아보다가 local.properties 에 적는 형식을 생각해냈고, 이를 사용해서 String.xml 에 새 값을 추가하는 것을 기록해두려 한다.

local.properties에 작성하기

흔히 sdk, ndk 가 설치된 프로젝트의 경우 local.properties 는 다음과 같다.

## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Tue Jan 23 23:17:58 KST 2018
ndk.dir=/Users/Pyxis/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/Pyxis/Library/Android/sdk

이 파일의 마지막 줄에 사용할키=사용할값 순서로 적는다.

default.kakao.api=some_value

build.gradle에서 불러오기

android 블록이 나오기 전에 properties 변수를 불러온다.

def Properties properties = new Properties()
properties.load(project.rootProject.file("local.properties").newDataInputStream())

위 코드를 작성하면 local.properties 에서 속성을 불러올 준비가 다 되었다.
이제 불러오는 코드를 작성하면 되는데, 보통 아래 메서드를 통해 값을 가져온다.
properties.getProperty("default.kakao.api", "")
첫 번째 파라미터는 키, 두 번째 값은 기본값이다.

String.xml에 값 넣기

res 값을 넣기 위해서는 resValue 메서드를 사용한다. 이 메서드는 3개의 파라미터를 가지고 있는데, type 와 name, value 총 3개이다.
name, value 는 이름에서 알 수 있듯이 해당 리소스의 이름, 값이고 type 는 해당 리소스의 속성이다. 흔히 string, color 등이다.
여기에서는 buildType 안에 두는 것이 아닌 defaultConfig 안에 두는데, product flavors 에도 같이 활용이 가능하다.

defaultConfig {
    applicationId "com.github.windsekirun.sociallogintest"
    minSdkVersion 19
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    resValue "string", "kakao_api_key", properties.getProperty("default.kakao.api", "")
}

이제 build gradle sync 를 하면 @string/kakao_api_key 를 사용할 수 있게 된다.


추가 (2018. 07. 12)

해당 방법을 사용하고 CircleCI 로 커밋하면 오류가 나는데, https://pyxispub.uzuki.live/resolve-local-properties-in-circleci/ 이 글을 참고하면 된다.