2014년 12월 17일 수요일

안드로이드 앱을 앤트로 빌드하기

안드로이드 스투디오나 인텔리제이에서는 자동 빌드를 위해 Gradle을 권하고 있지만, 가장 보편적으로 사용되는 빌드 스크립트는 단연 Ant다. 게다가, 안드로이드 스투디오의 Gradle이 IDE, Gradle 자체 그리고 Gradle 플러그인 간의 불협화음으로 종종 불편함을 초래하기 때문에 안드로이드 프로젝트 빌드에 있어서 나는 아직 Ant를 선호한다. (구글에서 그렇게 밀고 있으니 언젠가는 Gradle을 쓰겠지만)
안드로이드 SDK의 tools\android.bat를 이용하면 Ant용 빌드 파일을 만들 수 있다. 보통은 IDE에서 안드로이드 프로젝트를 만들다가 Ant 빌드 파일을 만들 것이다.  프로젝트의 최상위 폴더에 들어간 후에, 아래와 같이 입력하면 쉽게 build.xml이 만들어 진다.
폴더를 확인해보면 build.xml이 생겼다. 이 파일에는 기본적으로 몇가지 타겟(target)이 만들어져 있다. 대표적으로 clean, debug, release 같은 것이다.  이 타겟들은 아래와 같이 실행해볼 수 있다.
여러개의 타겟을 실행할 수도 있다.
release 타겟의 경우는 키스토어를 이용해 사인까지 할 수 있는데, 빌드스크립트가 참조할 수 있도록 키스토어의 위치와 alias, alias password, keystore password를 알려주어야 한다. 이는 ant.properties 라는 프로퍼티 파일을 만들고 build.xml과 같은 폴더에 넣어두는 방법으로 쉽게 전달할 수 있다. ant.properties 파일에 보통 넣는 값은 아래와 같다.
예를 들면,
와 같이 저장할 수 있다. 미리 키스토어를 만들었다면 이것만으로 release용 apk를 자동으로 만들 수 있다.
추후 안드로이드 SDK의 업데이트나 다른 환경과의 호환성을 유지하기위해서는 build.xml을 함부로 고치는 것은 지양할 일이다. 하지만 꼭 수정해야한다면 어떻게 해야할까? 이 때는 custom_rules.xml 을 이용해 보자. 안드로이드의 build.xml은 clean, debug, release 같은 잘 알려진 타겟 이외에 선언만 되고 내부적으로 작업이 없는 몇가지 타겟들을 가지고 있다. 그리고 그 타겟들을 custom_rules.xml 파일을 통해 재정의하면 빌드시에 실행된다.
예를 들어 -pre-build 라는 타겟은 앱을 빌드되기에 앞서 실행이 되는 타겟으로 이 타겟을 재정의 하면, 모든 빌드 작업 전에 공통 작업을 처리할 수 있다.  내 경우는 아래 그림 처럼 사인된 앱들의 파일 이름에 버전이 포함된다면 좋겠다고 생각했다.
version_with_file_name
그래서 -pre-build 타겟 단계에 AndroidManifest.xml 에서 version을 추출한 후에, -set-release-mode 타겟을 오버라이드 해 사용자가 release 타겟을 실행한 경우에만, 앱의 이름에 버전이 포함되도록 수정했다. 아래는 custom_rules.xml의 전문이다.
위의 내용을 가진 custom_rules.xml 파일을 build.xml과 같은 폴더에 넣어두면 build.xml 파일을 수정하지 않고도 추가작업을 처리할 수 있다.
마지막으로, 어떤 프로퍼티나 타겟이 있는지 보고 싶다면, 위에서 android.bat 명령어를 통해 생성한 로컬의 build.xml이 아닌 [안드로이드 SDK 폴더]/tools/ant/build.xml 를 살펴보아야 한다. 왜냐하면, 방금 생성된 build.xml 파일이 위의 파일을 그대로 상속 후에 일부 값만 로컬에 맞게 변경하여 실행되기 때문이다. 아마도, 추후 새로운 타겟을 추가하거나 빌드 스크립트에 문제가 발생되었을 때 사용자가 안드로이드 SDK만 업데이트하면 경우 변경된 사항이 반영될 수 있도록 한 조치가 아닌가 싶다. 참고로, 위에 언급된 custom_rules.xml은 SDK의 초기버전에서는 지원되지 않는 기능이었다.
잘 빌드가 되려면 sdk의 위치를 빌드 스크립트에게 알려주어야 하는데, sdk.dir 프로퍼터를 통해 빌드스크립트가 참조한다. 예는 아래와 같다.
처음에 안드로이드 SDK를 통해 build.xml을 만들 때 local.properties라는 프로퍼티 파일도 자동으로 생성되었을텐데, 아래와 같이 그 파일 안에 위 프로퍼티가 들어있다.
이 프로퍼티는 키스토어 정보를 담아두는 ant.properties에 함께 넣어두어도 된다.
스택오버플로우나 안드로이드 사이트에 잘 정리된 내용이 많은데, 이상하게 한글 자료는 적절한게 없어 필요한 사항 위주로 정리해보았다. 더 자세하고 친절한 좋은 글들은 아래의 참조에서 확인하자.
그 밖에
좋은 글은 시간이 지나도 영원한 것 같다. 킹오리님의 무심한 것 같지만 사실은 따뜻한 Ant 빌드 자료도 참고하자.