안드로이드 스투디오나 인텔리제이에서는 자동 빌드를 위해 Gradle을 권하고 있지만, 아직까지 많이 사용되는 빌드 스크립트는 단연 Ant다.
안드로이드 SDK의 tools\android.bat를 이용하면 Ant용 빌드 파일을 만들 수 있다. 보통은 IDE에서 안드로이드 프로젝트를 만들다가 Ant 빌드 파일을 만들 것이다. 프로젝트의 최상위 폴더에 들어간 후에, 아래와 같이 입력하면 쉽게 build.xml이 만들어 진다.
>android update project --path .
폴더를 확인해보면 build.xml이 생겼다. 이 파일에는 기본적으로 몇가지 타겟(target)이 만들어져 있다. 대표적으로 clean, debug, release 같은 것이다. 이 타겟들은 아래와 같이 실행해볼 수 있다.
>ant release
여러개의 타겟을 실행할 수도 있다.
>ant clean release
release 타겟의 경우는 키스토어를 이용해 사인까지 할 수 있는데, 빌드스크립트가 참조할 수 있도록 키스토어의 위치와 alias, alias password, keystore password를 알려주어야 한다. 이는 ant.properties 라는 프로퍼티 파일을 만들고 build.xml과 같은 폴더에 넣어두는 방법으로 쉽게 전달할 수 있다. ant.properties 파일에 보통 넣는 값은 아래와 같다.
key.store=[키스토어의 파일 위치와 이름] key.alias=[alias 이름] key.store.password=[스토어 비밀번호] key.alias.password=[alias 비밀번호]
예를 들면,
key.store=/keystore/my-keystore.keystore key.alias=my-alias key.store.password=store-password key.alias.password=alias-password
와 같이 저장할 수 있다. 미리 키스토어를 만들었다면 이것만으로 release용 apk를 자동으로 만들 수 있다.
추후 안드로이드 SDK의 업데이트나 다른 환경과의 호환성을 유지하기위해서는 build.xml을 함부로 고치는 것은 지양할 일이다. 하지만 꼭 수정해야한다면 어떻게 해야할까? 이 때는 custom_rules.xml 을 이용해 보자. 안드로이드의 build.xml은 clean, debug, release 같은 잘 알려진 타겟 이외에 선언만 되고 내부적으로 작업이 없는 몇가지 타겟들을 가지고 있다. 그리고 그 타겟들을 custom_rules.xml 파일을 통해 재정의하면 빌드시에 실행된다.
예를 들어 -pre-build 라는 타겟은 앱을 빌드되기에 앞서 실행이 되는 타겟으로 이 타겟을 재정의 하면, 모든 빌드 작업 전에 공통 작업을 처리할 수 있다. 내 경우는 아래 그림 처럼 사인된 앱들의 파일 이름에 버전이 포함된다면 좋겠다고 생각했다.
그래서 -pre-build 타겟 단계에 AndroidManifest.xml 에서 version을 추출한 후에, -set-release-mode 타겟을 오버라이드 해 사용자가 release 타겟을 실행한 경우에만, 앱의 이름에 버전이 포함되도록 수정했다. 아래는 custom_rules.xml의 전문이다.
<?xml version="1.0" encoding="UTF-8"?> <project> <target name="-pre-build"> <copy file="AndroidManifest.xml" todir="." overwrite="true" encoding="utf-8"> <filterset> <filter token="CONFIG.APP_VERSION" value="${app.version}"/> <filter token="CONFIG.APP_VERSION_CODE" value="${app.versioncode}"/> </filterset> </copy> </target> <target name="rename-release-with-version-number"> <xmlproperty file="AndroidManifest.xml" prefix="themanifest" collapseAttributes="true"/> <!-- see ${sdk.dir}/tools/ant/build.xml -set-release-mode --> <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-${themanifest.manifest.android:versionName}-release-unsigned.apk"/> <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-${themanifest.manifest.android:versionName}-release.apk"/> <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-${themanifest.manifest.android:versionName}-release-unaligned.apk"/> </target> <target name="-set-release-mode" depends="rename-release-with-version-number,android_rules.-set-release-mode"> <echo message="target: ${build.target}"></echo> </target> </project>
위의 내용을 가진 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.dir=c:\\Java\\android-sdk
처음에 안드로이드 SDK를 통해 build.xml을 만들 때 local.properties라는 프로퍼티 파일도 자동으로 생성되었을텐데, 아래와 같이 그 파일 안에 위 프로퍼티가 들어있다.
# This file is automatically generated by Android Tools. # 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 Ant # For customization when using a Version Control System, please read the # header note. sdk.dir=c:\\Java\\android-sdk
이 프로퍼티는 키스토어 정보를 담아두는 ant.properties에 함께 넣어두어도 된다.
스택오버플로우나 안드로이드 사이트에 잘 정리된 내용이 많은데, 이상하게 한글 자료는 적절한게 없어 필요한 사항 위주로 정리해보았다. 더 자세하고 친절한 좋은 글들은 아래의 참조에서 확인하자.
그 밖에
좋은 글은 시간이 지나도 영원한 것 같다. 킹오리님의 무심한 것 같지만 사실은 따뜻한 Ant 빌드 자료도 참고하자.
참조
- http://developer.android.com/tools/projects/projects-cmdline.html#UpdatingAProject
- http://stackoverflow.com/questions/5572304/building-android-sample-project-using-ant
- http://developer.android.com/tools/publishing/app-signing.html
핑백: Android 참고 사이트 | 피노키오