はたはたのメモ

主に勉強したことについてのメモ用ブログです。PHPerを目指しています。Pythonはまりかけ。GitHub: https://github.com/a-japonicus

cocos2d-xによるantのreleaseビルド設定

cocos2d-xでreleaseビルドするためのメモ。

前回でdebugビルドを作れるようになったが、releaseビルドをインストールしようとしてもエラーが出て失敗する。
ログを見てみると

C:\adt-bundle-windows\sdk\tools\ant\build.xml:1410: File C:\adt-bundle-windows\cocos2dx-test
\projects\TestProject\proj.android\bin\TestProject-release.apk does not exist.

TestProject-release.apk がありませんよ、と怒られている。
binディレクトリを見てみると TestProject-release-unsigned.apk はあるが TestProject-release.apk は無い。
unsigned というのは未署名という意味で、android端末にアプリをインストールするためにはapkに署名をする必要がある。

さらにログを見てみると

-release-nosign:
     [echo] No key.store and key.alias properties found in build.properties.
     [echo] Please sign E:\project\Bitbucket\cocos2dx-test\projects\TestProject\proj.android\bin\TestProject-release-unsigned.apk manually

keystoreの設定がないので手動で署名してください、と書かれている。
apkに手動で署名するにはJDKのjarsignerを使えばいいが、antに任せたいのでkeystoreの設定を追加する。

keystoreはJDK付属の keytool で作成することができるが、今回はdebug用のkeystoreを使用する*1
debugビルドを行うと自動で C:\Users\ユーザ名\.android に debug.keystore が作成されているはずなので、local.propertiesに以下の設定を記述する

key.store=C:\\Users\\ユーザ名\\.android\\debug.keystore
key.store.password=android
key.alias=androiddebugkey
key.alias.password=android

*.properiesは設定を書くファイルで、local.propertiesはコミットせずにローカル専用の設定を書くファイルになる。
debug.keystoreはPCごとに変わるため今回はここに書くが、例えばkeystoreもコミットしている場合はant専用プロジェクト設定の ant.properties に書いてもいい。

keystoreを記述した状態で ant clean release install を実行するとインストールに成功する。

インストールしたreleaseビルドを実行すると強制終了される。
ddms を実行し、LogCatで実行ログを確認してみると

01-26 13:59:06.151: E/AndroidRuntime(2329): FATAL EXCEPTION: main
01-26 13:59:06.151: E/AndroidRuntime(2329): java.lang.UnsatisfiedLinkError: b
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at a.a.a.x.b(Native Method)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at a.a.a.x.a(Unknown Source)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at a.a.a.b.onCreate(Unknown Source)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at jp.co.testproject.TestProject.onCreate(Unknown Source)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at android.os.Handler.dispatchMessage(Handler.java:99)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at android.os.Looper.loop(Looper.java:123)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at java.lang.reflect.Method.invoke(Method.java:507)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
01-26 13:59:06.151: E/AndroidRuntime(2329): 	at dalvik.system.NativeStart.main(Native Method)
01-26 13:59:06.171: W/ActivityManager(246):   Force finishing activity jp.co.testproject/.TestProject

とエラーで強制終了されている。

release指定でビルドすると難読化ツールのproguardが実行されるため、メソッド名を変更されたり、未使用と判断したクラスを削除され、ビルドに失敗したり上記のように実行時にエラーが発生したりする。
そのため、難読化しないクラス設定などをproguard-project.txtに書く必要がある。
ひとまずcocos2d-xのライブラリを難読化対象外とするために

-keepclasseswithmembers class org.cocos2dx.lib.* { *; }

を追加しておく。
ほかにライブラリ等を追加した場合には随時記述していく必要がある。

これでreleaseビルドを作成できるようになったはず。

*1:実際にはリリース用のkeystoreを作成し使用する必要がある