[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.mkLOCAL_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' から出ます
これで、とりあえず、パッケージは作成さえた。