Androidでcocos2dxを使ったアプリを作るには、create-android-project.shで自動生成されたプロジェクトを使うのが一般的なやり方だと思うんだけど、いざリリースしようとしたときにソースの難読化を行うProguardを適用したら、できあがったapkをインストールしたものを起動しようとすると強制終了が発生してしまうようになってしまった。その解決方法。

Proguardは難読化として、クラスのメソッド名とかを単純な1文字とかの名前に置き換える。しかし外から呼び出されるメソッドは名前を変えられてしまうと困るので、置き換えないように設定を書く必要がある。

Proguardを有効にするには、proj.android/project.propertiesの proguard.config=... の行頭の#を取り除いてproguardの設定ファイルを指定する:

proguard.config=proguard-project.txt

設定ファイル proj.android/proguard-project.txt には以下の設定を追加する:

# Cocos2dx
-keep class org.cocos2dx.lib.* { *; }

-keepclasseswithmembers class * {
  native ;
}

# ADMOB
-keep public class com.google.ads.**
-dontwarn com.google.ads.**
-keepclassmembers class com.google.ads.AdView {
  (...);
  public void *(...);
}
-keepclassmembers class com.google.ads.AdSize {
  public static ;
}
-keepclassmembers class com.google.ads.AdRequest {
  (...);
  public void *(...);
}
-keepclassmembers class com.google.ads.AdListener {
  (...);
  public void *(...);
}

org.cocos2dx.lib以下すべてと、ネイティブのものはkeepする。自分の場合はAdmobも使っているので、そのクラスやメソッドも難読化しないようにする必要があった。

またProguardとは関係ないけど、AdmobのAdViewをアプリのonDestroy時にdestroyしてやらないと、次回起動時に強制終了する場合があったので注意。

追記