-----------------------------------------------------------------------------------------------
출처: http://blog.naver.com/gigar/60115056299
-----------------------------------------------------------------------------------------------
보통 안드로이드 프로젝트를 apk파일로 만들어 에뮬레이터에서 구동 할 시에 이클립스 개발 툴을 사용한다. 그러나 ant를 사용하면 이클립스를 사용하지 않고도 해당 프로젝트를 apk 파일로 만들수가 있다. ant를 이용하여 안드로이드 프로젝트를 빌드하려면 우선 다음과 같은 준비물이 필요하다.
- JDK (Java Development Kit) ( http://www.oracle.com/technetwork/java/javase/downloads/index.html )
- Android SDK ( http://developer.android.com/sdk/index.html )
- Apache Ant ( http://ant.apache.org/ )
각각 다운받아서 설치 후 패스 및 환경 설정을 해 놓는다.
그 후 테스트를 위한 안드로이드 프로젝트를 준비한다.
여기에서는 간단한 메세지를 띄우는 프로젝트를 생성하였다.
이제 Ant를 사용하여 빌드를 하기 위한 정보를 담고 있는 xml 파일이다.
Build.xml파일은 프로젝트 폴더 바로 밑에 생성했으며, 이를 기준으로 설정하였다.
<?xml version="1.0" encoding="euc-kr"?> <project name="HelloWorld" default="debug" basedir=".">
<property name="sdk-folder" value="C:/DEV/android-sdk-windows/platforms/android-8" />
<!-- Application Package Name --> <property name="application-package" value="com.ahope" />
<!-- Android Project Build Result Folder --> <property name="outdir" value="bin" /> |
안드로이드 SDK관련 폴더 정보와 프로젝트의 패키지 정보, 빌드 후 출력물과 관련된 폴더 정보를
설정한다.
<property name="android-tools" value="${sdk-folder}/tools" /> <property name="android-framework" value="${android-tools}/lib/framework.aidl" />
<!-- Input directories --> <property name="resource-dir" value="${basedir}/res" /> <property name="asset-dir" value="${basedir}/assets" /> <property name="srcdir" value="src" />
<!-- folder for the 3rd party java libraries --> <property name="external-libs" value="libs" />
<!-- folder for the native libraries --> <property name="native-libs" value="${basedir}/libs" />
<!-- Output directories --> <property name="outdir-classes" value="${outdir}/classes" />
<!-- Create R.java in the source directory --> <property name="outdir-r" value="src" />
<!-- Intermediate files --> <property name="dex-file" value="classes.dex" /> <property name="intermediate-dex" value="${basedir}/${outdir}/${dex-file}" />
<!-- The final package file to generate --> <property name="resources-package" value="${outdir}/${ant.project.name}.ap_" /> <property name="out-debug-package" value="${basedir}/${outdir}/${ant.project.name}-debug.apk" /> <property name="out-unsigned-package" value="${basedir}/${outdir}/${ant.project.name}-unsigned.apk" /> |
안드로이드 관련 tool과 frame워크정보, 필요한 자원의 정보 및 생성 될 결과물에 대한 정보를
설정한다.
<!-- Tools --> <property name="aapt" value="${android-tools}/aapt.exe" /> <property name="aidl" value="${android-tools}/aidl.exe" /> <property name="dx" value="${android-tools}/dx.bat" /> <property name="adb" value="C:/DEV/android-sdk-windows/tools/adb.exe" /> <property name="apk-builder" value="C:/DEV/android-sdk-windows/tools/apkbuilder.bat" /> <property name="android-jar" value="${sdk-folder}/android.jar" /> |
- aapt.exe : apk는 Android Package를 가리키며 binary로 컴파일 된 자바 코드와 어플리케이션
에서 필요한 여러 여러 가지 데이터와 리소스를 포함하고 있다. 안드로이드 SDK는
aapt tool을 통해 .apk파일을 생성한다.
- aidl.exe : AIDL은 Android Interface description language의 약자로 인터페이스를 정의하는
언어이다.
- dx.exe : 안드로이드 용 응용 프로그램으로 만들어주는 컴파일러이며, 컴파일이 완료되면
*.dex 확장자를 가진 파일이 생성된다. 안드로이드는 Java VM이 아닌 Dalvik VM을
사용하기에, 이런 형식을 사용한다.
- apkbuilder.bat : apk 빌드와 관련된 파일.
- adb : 장치 (폰이나 에물레이터 등)에 연결하여 매우 다양한 명령을 수행한다.
Application의 설치/제거와 에뮬레이터로 파일을 넣고 빼는 등의 작업을 할 수 있다.
- android.jar : android 관련 jar 파일
현재 windows에 설치된 sdk를 기준으로 사용하고 있기 때문에 만약 linux 환경에서 작업을 하고
있다면 linux에 설치된 안드로이 sdk 정보에 맞게 수정해야 한다.
(상세 정보는 http://www.androidside.com/docs/docs1.1/guide/developing/tools/index.html 를 참조)
<!-- Delete Old bin Folder Before Build. --> <target name="clean" description="Delete old build"> <echo>Delete bin Folder Befode Build...</echo> <delete dir="${basedir}/bin"/> </target>
<!-- Create the output directories. --> <target name="dirs" depends="clean"> <echo>Creating output directories </echo> <mkdir dir="${outdir}" /> <mkdir dir="${outdir-classes}" /> </target> |
빌드를 하기 전에 앞서, 기존에 빌드 된 정보가 남아 있는 폴더를 삭제하고 새로운 폴더를 생성 하도록 하였다.
<!-- Generate the R.java file for this project's resources. --> <target name="resource-src" depends="dirs"> <echo>Generating R.java / Manifest.java from the resources...</echo> <exec executable="${aapt}" failonerror="true"> <arg value="package" /> <arg value="-m" /> <arg value="-J" /> <arg value="${outdir-r}" /> <arg value="-M" /> <arg value="AndroidManifest.xml" /> <arg value="-S" /> <arg value="${resource-dir}" /> <arg value="-I" /> <arg value="${android-jar}" /> </exec> </target>
<!-- Generate java classes from .aidl files. --> <target name="aidl" depends="dirs"> <echo>Compiling aidl files into Java classes...</echo> <apply executable="${aidl}" failonerror="true"> <arg value="-p${android-framework}" /> <arg value="-I${srcdir}" /> <fileset dir="${srcdir}"> <include name="**/*.aidl"/> </fileset> </apply> </target>
<!-- Compile this project's .java files into .class files. --> <target name="compile" depends="dirs, resource-src, aidl"> <javac encoding="ascii" target="1.6" debug="true" extdirs="" srcdir="." destdir="${outdir-classes}" bootclasspath="${android-jar}"> <classpath> <fileset dir="${external-libs}" includes="*.jar"/> </classpath> </javac> </target>
<!-- Convert this project's .class files into .dex files. --> <target name="dex" depends="compile"> <echo>Converting compiled files and external libraries into ${outdir}/${dex-file}...</echo> <apply executable="${dx}" failonerror="true" parallel="true"> <arg value="--dex" /> <arg value="--output=${intermediate-dex}" /> <arg path="${basedir}/${outdir-classes}" /> <fileset dir="${external-libs}" includes="*.jar"/> </apply> </target>
<!-- Put the project's resources into the output package file. --> <target name="package-res-and-assets"> <echo>Packaging resources and assets...</echo> <exec executable="${aapt}" failonerror="true"> <arg value="package" /> <arg value="-f" /> <arg value="-M" /> <arg value="AndroidManifest.xml" /> <arg value="-S" /> <arg value="${resource-dir}" /> <arg value="-A" /> <arg value="${asset-dir}" /> <arg value="-I" /> <arg value="${android-jar}" /> <arg value="-F" /> <arg value="${basedir}/${resources-package}" /> </exec> </target>
<!-- Same as package-res-and-assets, but without "-A ${asset-dir}" --> <target name="package-res-no-assets"> <echo>Packaging resources...</echo> <exec executable="${aapt}" failonerror="true"> <arg value="package" /> <arg value="-f" /> <arg value="-M" /> <arg value="AndroidManifest.xml" /> <arg value="-S" /> <arg value="${resource-dir}" /> <!-- No assets directory --> <arg value="-I" /> <arg value="${android-jar}" /> <arg value="-F" /> <arg value="${resources-package}" /> </exec> </target>
<!-- Invoke the proper target depending on whether or not an assets directory is present. --> <!-- TODO: find a nicer way to include the "-A ${asset-dir}" argument only when the assets dir exists. --> <target name="package-res"> <available file="${asset-dir}" type="dir" property="res-target" value="and-assets" /> <property name="res-target" value="no-assets" /> <antcall target="package-res-${res-target}" /> </target> |
R.java파일을 생성하고 관련 java파일들을 클래스파일로 컴파일 후, 컴파일 된 클래스 파일을 다시 dex파일로 변환하고 관련 리소스들을 옮기는 등의 apk파일을 만들기 위한 일련의 과정을 설정한다.
각각에 해당되는 사항들은 소스코드의 주석을 참조한다.
<!-- Package the application and sign it with a debug key. This is the default target when building. It is used for debug. --> <target name="debug" depends="dex, package-res"> <echo>Packaging ${out-debug-package}, and signing it with a debug key...</echo> <exec executable="${apk-builder}" failonerror="true"> <arg value="${out-debug-package}" /> <arg value="-z" /> <arg value="${basedir}/${resources-package}" /> <arg value="-f" /> <arg value="${intermediate-dex}" /> <arg value="-rf" /> <arg value="${basedir}/${srcdir}" /> <arg value="-rj" /> <arg value="${basedir}/${external-libs}" /> <arg value="-nf" /> <arg value="${native-libs}" /> </exec> </target>
<!-- Package the application without signing it. This allows for the application to be signed later with an official publishing key. --> <target name="release" depends="dex, package-res"> <echo>Packaging ${out-unsigned-package} for release...</echo> <exec executable="${apk-builder}" failonerror="true"> <arg value="${out-unsigned-package}" /> <arg value="-u" /> <arg value="-z" /> <arg value="${basedir}/${resources-package}" /> <arg value="-f" /> <arg value="${intermediate-dex}" /> <arg value="-rf" /> <arg value="${basedir}/${srcdir}" /> <arg value="-rj" /> <arg value="${basedir}/${external-libs}" /> <arg value="-nf" /> <arg value="${native-libs}" /> </exec> <echo>It will need to be signed with jarsigner before being published.</echo> </target> |
debug 용 빌드와 release 용 빌드 설정이다.
debug가 붙은 apk파일은 특정 에뮬레이터의 전자서명 키로 전자서명 된 것을 뜻한다.
-unsigned를 포함한 apk파일은 release 빌드이지만, 정식 전자서명 키와 jarsigner를 이용해
전자서명 하여야 최종 릴리즈 가능 하다.
예제 코드에서는 debug를 기본값으로 실행하도록 설정하였다.
<!-- Install the package on the default emulator --> <target name="install" depends="debug"> <echo>Installing ${out-debug-package} onto default emulator...</echo> <exec executable="${adb}" failonerror="true"> <arg value="install" /> <arg value="${out-debug-package}" /> </exec> </target>
<target name="reinstall" depends="debug"> <echo>Installing ${out-debug-package} onto default emulator...</echo> <exec executable="${adb}" failonerror="true"> <arg value="install" /> <arg value="-r" /> <arg value="${out-debug-package}" /> </exec> </target>
<!-- Uinstall the package from the default emulator --> <target name="uninstall"> <echo>Uninstalling ${application-package} from the default emulator...</echo> <exec executable="${adb}" failonerror="true"> <arg value="uninstall" /> <arg value="${application-package}" /> </exec> </target> </project> |
생성된 apk를 안드로이드 에뮬레이터에 설치 / 제거 하는 설정부분이다.
이제 cmd 창에서 위의 build.xml 설정 파일을 토대로 ant를 실행시켜보겠다.
이제 생성된 apk 파일을 확인하면 된다.
[출처] ant를 이용한 안드로이드 빌드|작성자 gigar
'IT_Programming > Android_Java' 카테고리의 다른 글
[펌] 안드로이드 구글맵 구현 시 주의사항 (0) | 2011.08.17 |
---|---|
Android Multithreading For Performance (0) | 2011.08.10 |
Parcelable을 사용한 오브젝트 전달 (Object serialization using Parcelable) (0) | 2011.08.02 |
[android] 애니메이션 - 비밀번호창 좌우로 7번 흔들기 (0) | 2011.08.01 |
[펌] ViewFlipper와 ScrollView, ListView 를 함께 사용할때 생기는 문제 해결책 (0) | 2011.07.22 |