Android 기반 Application Ant 빌드 방법

by digipine posted Oct 29, 2017
?

Shortcut

PrevPrev Article

NextNext Article

ESCClose

Larger Font Smaller Font Up Down Go comment Print

일단 Android Application을 Ant 스크립트 기반으로 빌드를 하는 법에 대해서는

아래 사이트를 참조했습니다.

 

http://code.google.com/p/autoandroid/wiki/AndroidAnt

 

 

다만 위 위키에 있는 내용만으로는 제가 지원하고 있는 플랫폼 버전에는 잘 되지 않았었고

그래서 일부 다른 방식으로 하여서 APK 패키징하는 부분까지 성공했네요.

 

 

혹시 위 사이트 보시면서 하시다가 잘 안되시는 분이 있으면 참고하시라고 블로깅합니다.

(지극히 개인적으로 해본 사례에 대한 내용이지 이렇게 하는게 정답이야!! 라고 하는게 아니니 태클은 정중히 사절하겠습니다.)

 

 

ps. 이클립스에 ADT를 설치하면 알아서 다 해주는데 필요없지 않나요? 라는 말을 하실수도 있겠는데

    그러면 조용히 뒤로가기 버튼을 눌러주시기 바랍니다. 그런분들을 대상으로 포스팅한게 아닙니다.

    혼자 또는 두명이서 개발을 하는게 아니고 다수의 인원이 Product를 개발하고 있는 상황이라면

    당연히 별도의 빌드환경을 구성해서 통합빌드를 수행해야되지 않을까요?

 

 

 

0. 참고할만한 자료

 

Android SDK를 설치하신 후, 아래 경로에 가보시면 Ant 스크립트 파일들이 존재합니다.

 

잘 안될때 참고하시면 많은 도움이 되실겁니다.

 

1. 준비 

 

- android-ant.jar 파일 다운로드

http://autoandroid.googlecode.com/svn/trunk/samples/notepad/lib/android-ant.jar

 

- Ant 설치

머 알아서 받아서 설치해 주십니다. 전 1.8.1 버전으로 했습니다.

 

- 환경 변수 설정

ANT_HOME, ANDROID_HOME, JAVA_HOME, path 등 필요한 것들 빼먹지 말고 지정해 주십니다.

 

저는

ANDROID_HOME : C:\dev\AndroidSDK\platforms\android-7

path : %ANDROID_HOME%\tools

 

요렇게 추가했네요

 

위처럼 설정하는거 때문에 나중에 문제가 하나 발생하기는 했는데 별도의 대안을 찾지못해서 그냥그렇게 했습니다.

(잉? 무슨소리지 ;; ㅋ aapt.exe, dx.bat 파일들은 위 경로에 있는데, apkbuilder.bat는 다른 경로에 존재해서 발생하는

문제였습니다.)

 

 

2. 빌드 스크립트 작성

 

이제 두서없이 쭈욱 스크립트작성했던 부분들을 적어볼게요. build.properties는 따로 소개하지 않겠습니다.

몇개 없어서요. workspace, jdk_home, root, root.build, root.lib, root.src 정도?

 

 

 
Ant Proejct 태그 정의

 

<project name="Android App Sample" default="all" basedir="." xmlns:android="antlib:com.googlecode.autoandroid.ant">

 

 

 

 

 

 
Android Home 경로 지정

 

<android:home />

 

요렇게 정의하면 ANDROID_HOME 또는 ANDROID_SDK 환경 변수를 읽어와서 잡아줍니다.

 

 

 

 

 

 
R.java파일 generate하기

 

<target name="resource-src" depends="init" description="Generate the R.java file for this project's resources.">
  <android:aapt>
    <arg value="package" />
     <arg value="-m" />
     <arg value="-J" />
     <arg file="${root}/gen" />
   <!--  Create R.java in the source directory   -->
     <arg value="-M" />
     <arg file="${root}/AndroidManifest.xml" />
     <arg value="-S" />
    <arg file="${root}/res" />
     <arg value="-I" />
     <arg file="${android-home}/android.jar" />
   </android:aapt>
 </target>

 

위 스크립트가 돌면 project root 아래 gen 폴더를 만들면서 그 아래 R.java 파일을 생성합니다. (패키지 구조는 개발하신 App의 패키지 구조를 따라갑니다.

 

위 태그가 실행되면서 aapt.exe 를 찾을 수 없다는 식으 메세지가 뜨면 Android Home 이 제대로 잡히지 않은 겁니다.

 

 

 

 

 

 
자바소스 컴파일

 

<target name="compile_gen" depends="resource-src" description="Compile R.java source">
  <javac
   encoding="utf-8"
   target="1.5"
   srcdir="${root}/gen"
   destdir="${root.build}/"
   debug="true"
   includes="**/*.java"
   bootclasspath="${android-home}/android.jar"
   fork="true"
   includeantruntime="false">
   <classpath refid="src.classpath" />
  </javac>
 </target>
   
 <target name="compile" depends="compile_gen" description="Compile java sources" >
  <javac
   encoding="utf-8"
   target="1.5"
   srcdir="${root.src}"
   destdir="${root.build}/"
   debug="true"
   includes="**/*.java"
   bootclasspath="${android-home}/android.jar"
   fork="true"
   includeantruntime="false">
   <classpath refid="src.classpath" />
  </javac>
 </target>

 

 

요건 평소에 쓰는 Ant 스크립트와 동일합니다. 저의 경우, generate 된 R.java 컴파일과 App의 자바소스 컴파일을 구분해서 만들었습니다.

 

 

 

 

 

 

 
Dex 파일 생성

 

저는 첨에 여기서 막혔었네요. 위 구글 코드에 있는 샘플 대로면 아래와 같이 하면 된다고 되어있습니다.  그런데 실제로 해보니 에러가 발생하더군요. EndofArgs 어쩌구 저쩌구.. 아마도 아래 Task에서 데이터를 읽어다가 dx.bat 실행 명령어에 매개변수로 던져서 실행되도록 하는거 같은데.. 파라메터가 이상하게 잡히면서 발생하는 에러로 보였습니다.

 

<target name="dex" depends="compile" description="Convert the .class files into .dex files.">

  <property name="classes.dex" location="${root.build}/classes.dex" />
  <android:dx inputref="main.jars">
     <arg value="-/-dex" />
     <arg value="-/-output=${classes.dex}" />
     <arg path="${root.build}" />
    </android:dx>

</target>

 

 

그래서 저는 아래와 같이 변경해서 구성했습니다. 직접 dx.bat를 실행하도록 Task를 짠 것이죠. 직접 dx.bat를 커맨드라인에서 실행해보신 후 정상적으로 동작하는 것을 확인하시고 작성하시는 것도 한 방법입니다.

 

 <target name="dex" depends="compile" description="Convert the .class files into .dex files.">
    <echo>Converting compiled files and external libraries into ${root.build}/classes.dex...</echo> 
    <property name="classes.dex" location="${root.build}/classes.dex" />
         <sequential>
   <apply executable="dx.bat" failonerror="true" parallel="true">
      <arg value="--dex" />
                <arg value="--output=${classes.dex}" />
                <arg path="${root.build}" />
                <fileset dir="${root.lib}" includes="IpcBridge.jar" /> 

                 <!-- 위 부분은 Library로 쓰시는게 있으면 추가하시는부분입니다. -->

   </apply>
  </sequential>
 </target>

 

 

 

 

 

 
resource 패키징 하기

 

<target name="package-res" depends="dex" description="Put the project's resources into the output package file.">
  <echo>Put the project's resources into the output package file. - resources.ap_ </echo>
  <android:aapt>
   <arg value="package" />
   <arg value="-f" />
   <arg value="-M" />
   <arg file="${root}/AndroidManifest.xml" />
   <arg value="-S" />
   <arg file="${root}/res" /> 
     <arg value="-I" />
     <arg file="${android-home}/android.jar" />
     <arg value="-F" />
     <arg file="${root.build}/resources.ap_" />
    </android:aapt>
   </target>

 

위 Task는 문제없이잘 실행이 되더군요.

 

 

 

 

 

 
APK 패키징 하기

 

이 부분이 가장 잘 안되던 부분이었는데.. 그 이유가 실행파일의 경로가 위에서 사용해왔던 dx.bat, aapt.exe와는 다르다는 것이었습니다. dx.bat, aapt.exe 등은 Android SDK 플랫폼 버전별로 들어가 있는데, apkbuilder.bat 와 관련 파일들은 Android SDk 루트 쪽에 존재하더군요..

 

그래서 아래 Task를 실행하면 apkbuilder.bat를 찾을 수 없다면서 실행이 되지 않았습니다.

 

 <android:apk-builder>
     <arg file="${root.build}/AndroidApp.apk" />
     <arg value="-z" />
     <arg file="${root.build}/resources.ap_" />
     <arg value="-f" />
     <arg file="${root.build}/classes.dex" />
     <arg value="-rf" />
     <arg file="src" />
     <arg value="-rj" />
     <arg file="libs" />
    </android:apk-builder>

 

 

AndroidAnt가 이 부분을 고려하지 않은 것인지, 아니면 이렇게 갈라지기 전에 만들어진 건지.. 경로 문제로 잘 실행이 되지 않아서 또 저만의 방법으로 했습니다. 그 스크립트가 아래입니다.

 

이를 위해서는 apkbuilder.bat가 있는 경로가 path 상에 잡혀있어야 합니다. 여기서 다시 제가 환경 변수 잡은 것eh 다시 소개할게요

 

ANDROID_HOME : C:\dev\AndroidSDK\platforms\android-7

ANDROID_SDK : C:\dev\AndroidSDK\

path : %ANDROID_SDK%\tools;%ANDROID_HOME%\tools

 

 

<target name="package-apk" depends="package-res" description="Package the application and sign it with a debug key.">
    <echo>Package the application and sign it with a debug key. - AndroidApp.apk</echo>   
    <sequential>
   <apply executable="apkbuilder.bat" failonerror="true" parallel="true">
      <arg file="${root.build}/AndroidApp.apk" />
      <arg value="-z" />
      <arg file="${root.build}/resources.ap_" />
      <arg value="-f" />
      <arg file="${root.build}/classes.dex" />
      <arg value="-rf" />
      <arg file="${root}/src" />
      <arg value="-rj" />
      <arg file="${root}/libs" />
      <arg value="-nf" />
      <arg file="${root}/libs" />
      <fileset file="${root}/libs" />
     <!-- <arg file="${root}/libs" />  -->
   </apply>
  </sequential>

   </target>

 

 

 

 

 

 

 
이 외에도..

 

이 후에도 에뮬레이터를 실행해서 테스트, 에뮬레이터 정지 등 많은 Task들이 지원됩니다. 관련 내용들은 제일 위에 소개한 사이트에서 확인해보시기 바랍니다. 저는 거기까지는 아직 해볼 필요가 없어서 안해봤어요.

 

 

 

 

요렇게 작성해서 저는 빌드하는데 성공했습니다.

 

그리고 일단위 빌드가 돌도록 Hudson에 구성까지 했습니다. 지금까지는 정상적으로 잘 돌고 있네요.

 

TAG •

Articles

1 2