[Android] Android.mkでapkファイルを作ってみる

Androidのソースツリー内のツールを使って、SDKで配布するapkパッケージを作ってみる。
まずは、サンプルのHelloActivityを参考に、Android.mkを作成する。

$ pwd
/home/kinami/mydroid/development/samples
$ mkdir HelloAndroid
$ cd HelloAndroid/
$ activitycreator jp.hews.hello.HelloAndroid
Package: jp.hews.hello
Output directory: /home/kinami/mydroid/development/samples/HelloAndroid
Activity name: HelloAndroid
...
$ cp ../HelloActivity/Android.mk .
$ vi Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := samples

# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := HelloAndroid  <== ここを変更

LOCAL_SDK_VERSION := current

include $(BUILD_PACKAGE)

# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

この状態で、makeしてみる

$ mm
make: ディレクトリ `/home/kinami/mydroid' に入ります
build/core/product_config.mk:229: WARNING: adding test OTA key
build/core/main.mk:177: implicitly installing apns-conf_sdk.xml
============================================
TARGET_PRODUCT=generic
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
TARGET_OS=linux
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=TC3
============================================
target R.java/Manifest.java: HelloAndroid (out/target/common/obj/APPS/HelloAndroid_intermediates/src/R.stamp)
/home/kinami/mydroid/development/samples/HelloAndroid/res/layout/main.xml:7: ERROR Error: This attribute must be localized. (at 'text' with value 'Hello World, HelloAndroid').
make: *** [out/target/common/obj/APPS/HelloAndroid_intermediates/src/R.stamp] エラー 1
make: ディレクトリ `/home/kinami/mydroid' から出ます

ということで、Viewに直接テキストを書いているとローカライズできないのでだめよというチェックが入っている。正しいチェック!
strings.xmlとmain.xmlを変更

strings.xmlに以下を追加
    Hello, Android
main.xmlで以下を変更
    android:text="@string/hello"

これで、再度make。showcommandsで何をやっているのかをチェック

$ mm showcommands
make: ディレクトリ `/home/kinami/mydroid' に入ります
============================================
TARGET_PRODUCT=generic
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
TARGET_OS=linux
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=TC3
============================================
target R.java/Manifest.java: HelloAndroid (out/target/common/obj/APPS/HelloAndroid_intermediates/src/R.stamp)
# マニフェストとリソースをコンパイル
out/host/linux-x86/bin/aapt package  -m -z  -M /home/kinami/mydroid/development/samples/HelloAndroid/AndroidManifest.xml /home/kinami/mydroid/development/samples/HelloAndroid/
... \

# javacでコンパイルして、dxで変換
target Java: HelloAndroid (out/target/common/obj/APPS/HelloAndroid_intermediates/classes)

javac  -target 1.5 -bootclasspath out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar -classpath out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes.jar -g  \@out/target/common/obj/APPS/HelloAndroid_intermediates/classes/java-source-list-uniq 
jar -cf out/target/common/obj/APPS/HelloAndroid_intermediates/classes.jar  -C out/target/common/obj/APPS/HelloAndroid_intermediates/classes .
target Dex: HelloAndroid
out/host/linux-x86/bin/dx -JXms16M  -JXmx1280M --dex --output=out/target/common/obj/APPS/HelloAndroid_intermediates/classes.dex    out/target/common/obj/APPS/HelloAndroid_intermediates/classes.jar

# aaptで、apkファイルの作成。zipでファイルを追加していく。
target Package: HelloAndroid (out/target/product/generic/obj/APPS/HelloAndroid_intermediates/package.apk)
...
out/host/linux-x86/bin/aapt package -z -u   -M /home/kinami/mydroid/development/samples/HelloAndroid/AndroidManifest.xml -S /home/kinami/mydroid/development/samples/HelloAndroid/res  -I out/target/common/obj/APPS/framework-res_intermediates/package-export.apk -F out/target/product/generic/obj/APPS/HelloAndroid_intermediates/package.apk
zip -qj out/target/product/generic/obj/APPS/HelloAndroid_intermediates/package.apk out/target/common/obj/APPS/HelloAndroid_intermediates/classes.dex
mv out/target/product/generic/obj/APPS/HelloAndroid_intermediates/package.apk out/target/product/generic/obj/APPS/HelloAndroid_intermediates/package.apk.unsigned

# signapk.jarで署名。証明書を指定しなければ、testkey。
# LOCAL_CERTIFICATE := platformとすると、プラットフォームの秘密鍵で署名
java -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8 out/target/product/generic/obj/APPS/HelloAndroid_intermediates/package.apk.unsigned out/target/product/generic/obj/APPS/HelloAndroid_intermediates/package.apk.signed

# zipalign
out/host/linux-x86/bin/zipalign -f 4 out/target/product/generic/obj/APPS/HelloAndroid_intermediates/package.apk.unaligned out/target/product/generic/obj/APPS/HelloAndroid_intermediates/package.apk.aligned
...
make: ディレクトリ `/home/kinami/mydroid' から出ます

これで、とりあえず、パッケージは作成さえた。