2012年1月14日土曜日

今更ながらAntでAndroidアプリをビルドしてみる

件名の通り、今更ながらAntでビルドして見ました。
AntでAndroidをビルドしたことない人向けです。つまり俺。

AndroidSDKやらADTはver16です。

流れ
・とりあえずビルドする(デバッグビルド)
・リリースビルドで署名まで済ませる
・NDKでのビルドも含める

このあたり参照
http://developer.android.com/guide/developing/building/building-cmdline.html

流石にAntやJDKはインストール済みでパスが通っていることは前提


とりあえずデバッグビルド


とりあえず既にあるeclipseのプロジェクトと共存することが前提なので、
対象プロジェクトはeclipseで作ります。
ここではHelloAntという名前で作った前提となっています。

そうするとこんなディレクトリ構成かと

HelloAnt
├── AndroidManifest.xml
├── assets
├── bin
├── gen
├── proguard.cfg
├── project.properties
├── res
└── src

とりあえず上記HelloAntディレクトリに移動
で、以下コマンドを実行

android update project -p ./

すると以下の結果となる

Updated local.properties
No project name specified, using Activity name 'HelloAntActivity'.
If you wish to change it, edit the first line of build.xml.
Added file ./build.xml
Updated file ./proguard.cfg

build.xmlとlocal.propertiesという2つのファイルが増えているはず

HelloAnt
├── AndroidManifest.xml
├── assets
├── bin
├── build.xml
├── gen
├── libs
├── local.properties
├── proguard.cfg
├── project.properties
├── res
└── src

これでAntプロジェクトとして作成されました。


おもむろに以下コマンドを叩きます

ant debug

binディレクトリに行くと「HelloAntActivity-debug.apk」として出来ているはず。

以上でデバッグビルドは終わり。


リリースビルドに署名まで済ませる


まずkeystoreを作成する(略)

次に「ant.properties」というファイルを作成し以下の内容を書く
key.store=hoge.keystore //(へのパス)
key.store.password=hogehoge
key.alias=hoge
key.alias.password=hugahuga

key.storeの右辺にはkeystoreファイルのパスを記載すればOK
ここではhoge.keystoreという名前でHelloAntディレクトリ直下に居る前提なので
単に「hoge.keystore」と書かれています。

HelloAnt
├── AndroidManifest.xml
├── ant.properties
├── assets
├── build.xml
├── hoge.keystore
├── libs
├── local.properties
├── proguard.cfg
├── project.properties
├── res
└── src

おもむろに以下コマンドを叩く

ant release

binディレクトリに行くと「HelloAntActivity-release.apk」として出来ているはず。

以上でリリースビルドは終わり。


一旦キレイにする


ant clean

binとかgenディレクトリが消えるよ!


proguardを使う


通常eclipseで使うのと一緒
project.propertiesに以下の一行を追加

proguard.config=proguard.cfg //(へのパス)

昔はantでproguardは大変だったらしい。

追加で記入したら「ant release」でprogurardがapkに使われます。


NDKでのビルドも含める


ndkにもパスが通っていることが前提です。

ついにbuild.xmlを開きます。
そして51行目付近を見ます



上記部分をこんな感じに書き換えます

    
        
            
            
        
    


これで実行!と言いたいのですが、そもそもNDKのソースが無いのでsampleの「hello-jni」から
jniディレクトリごとコピーしてきます。

HelloAnt
├── AndroidManifest.xml
├── ant.properties
├── assets
├── build.xml
├── hoge.keystore
├── jni
│   ├── Android.mk
│   └── hello-jni.c
├── libs
├── local.properties
├── proguard.cfg
├── project.properties
├── res
└── src
hello-jni.cの関数名修正を忘れずに。
あと呼び出し元も無いので適当に作ってください。

めんどければhello-jniごとコピーで、antプロジェクト作成でもOKです。

ant release/debug
と叩けば-pre-buildの項目がこんな感じで出力されます

-pre-build:
     [exec] Compile thumb  : hello-jni <= hello-jni.c
     [exec] SharedLibrary  : libhello-jni.so
     [exec] Install        : libhello-jni.so => libs/armeabi/libhello-jni.so



NDKでのビルドも含める その2


NDKだけ常にリリースビルドじゃ芸がないのでさっき修正した場所を下記のようにして見ました。

    
        
            
        
    

    
        
            
                rel!
                
                    
                    
                
            
            
                dev!
                
                    
                    
                
            
        
    

これでdebug指定時はNDK_DEBUG=1でビルドされます。

なお、ant releaseなのかdebugなのかは
android-sdk/tools/ant/build.xml
を見て、${build.target}に直接文字列入れていたのでそれで判定しましたが…
いいのかな…

あとはコンパイル失敗をsoファイルができたかどうかとかでチェックしてやればより良いかも?

そういやndk-buildをオプション無しで叩いてもリリースビルドでチョットびっくり。
r4ぐらいの時、デフォルトはデバッグビルドじゃなかったでしたっけ?


おまけ


ant clean
ant release -v > tmp.txt
で詳細をよく見てみたら…

-compile:
Property "tested.project.absolute.dir" has not been set
Property "tested.project.absolute.dir" has not been set
    [javac] jp/omokageru/dnk/helloant/HelloAntActivity.java added as jp/omokageru/dnk/helloant/HelloAntActivity.class doesn't exist.
    [javac] /Users/dnk/personal/android/HelloAnt/gen/R.java.d skipped - don't know how to handle it
    [javac] jp/omokageru/dnk/helloant/R.java added as jp/omokageru/dnk/helloant/R.class doesn't exist.
    [javac] Compiling 2 source files to /Users/dnk/personal/android/HelloAnt/bin/classes
    [javac] Using modern compiler
    [javac] Compilation arguments:
    [javac] '-d'
    [javac] '/Users/dnk/personal/android/HelloAnt/bin/classes'
    [javac] '-classpath'
    [javac] '/Users/dnk/personal/android/HelloAnt/bin/classes:/Users/dnk/personal/android/HelloAnt'
    [javac] '-sourcepath'
    [javac] '/Users/dnk/personal/android/HelloAnt/src:/Users/dnk/personal/android/HelloAnt/gen'
    [javac] '-target'
    [javac] '1.5'
    [javac] '-bootclasspath'
    [javac] '/Users/dnk/app/android-sdk/platforms/android-8/android.jar'
    [javac] '-encoding'
    [javac] 'UTF-8'
    [javac] '-g'
    [javac] '-source'
    [javac] '1.5'


ん?1.5?
確か今ってビルドの指定は1.6じゃなかったでしたっけ?

ということで
android-sdk/tools/ant/build.xmlで、1.5指定のところ2ヶ所を1.6に書き換えて動作させて見ましたが、
問題なく動いているきがしました。

ant testとかあるけど、そのへんはきっとtest部の方々が総掛かりでまとめてくれることを勝手に期待しております。


リリースが頻発するとか、NDKを含めたコンパイルが多いとかだとAntの方が楽?
普段のデバッグビルド状態だとEclipseが吐き出したもので困ることはありませんが、
準備しておけば楽っぽいですね。

あと、複数人で開発しててちゃんとビルドサーバっつーかCIサーバみたいなのが有るところだと必須なんでしょう。

そういうところだとどんなAndroid開発なのか凄く気になる…



0 件のコメント:

コメントを投稿