去年末にTitanium Studio と Titanium SDK / CLI を 3.2.0 にあげてから初のAndroid署名付きのDistribution な apk をビルドをしてGoogle Playに公開したんですけど、「パッケージファイルに正しく署名されていません」となって実機にインストール出来なくて焦りました。OSはMac OS X Marvericks です。

ググってみるとJDK 7 だと署名がダメとかいう情報(後述しますが無関係でした)を見つけて、自分のMacのJDKを確認したら確かに 1.7.0_13 でした。

慌てて既にある JDK1.7.0_13をアンインストール(しないと6系が入らないので)して、

sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.7.0_13.jdk

そして6系を再インストールして、もう一度ビルドしてみました。

・・・が、変わらず。署名したapk を公開する前に実機転送してみましたが、インストール出来ませんでした的なメッセージが出ます。

Titanium Studioのログを見ると、いままでも実はビルドは1.6.0でされているっぽいです。

(つまりJDKを入れなおす必要は特に無かった)

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/ はどうやって入れた記憶が無です。

[INFO] : Signing apk: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/jarsigner "-sigalg" "SHA256withRSA" "-digestalg" "SHA1" "-keystore" "/path/to/mykeystore" "-storepass" "************" "-signedjar" "/path/to/project/build/android/bin/myapp.apk" "/path/to/project/build/android/bin/app-unsigned.apk" "mykeystore"

色々ググって見ると、この SHA256withRSA がいけないらしく、jdk 1.6.0 では SHA1withRSAでないとダメなようです。

知りませんでした。

念のため、前回リリースと同様に、Apple純正?の JDK 1.6.0_65 の jarsigner で、SHA1withRSA で署名します。

/usr/bin/jarsigner "-sigalg" "SHA1withRSA" "-digestalg" "SHA1" "-keystore" "/path/to/mykeystore" "-storepass" "******" "-signedjar" "/path/to/project//build/android/bin/myapp.apk" "/path/to/project/build/android/bin/app-unsigned.apk" "mykeystore"

その後アラインを設定し、

zipalign -v 4 /path/to/project/build/android/bin/myapp.apk ~/path/to/output/myapp.apk

アラインが正しく設定されたか確認します。

zipalign -c -v 4 ~/path/to/output/myapp.apk

これでなんとか公開しなおしました。

諸事情で Google Play のAPKを前のバージョンに戻す事もできなかった事もあり、まあまあ焦りました。

 


参考にさせて頂いたサイト達

[#TIDOC-1464] The guide to generate an Android keystore requires more information – Appcelerator

[#TIMOB-16213] CLI: Packaging – CLI should throw a warning if you are using a SHA256withRSA signa…

[#TIMOB-15817] CLI: Java 1.7 on Mavericks will cause packaged app to fail on install to Android d…

Androidアプリの署名<KeyStore Keytool AndroidDebugKey> | android manifest configChanges

MacOSX – Mac OS X MavericksでJava6(JDK1.6)を(再)インストールする方法 – Qiita [キータ]

Android – 手動でZipalignを行う方法 – Qiita [キータ]

JDK7でAndroidアプリをリリースビルドする方法 — KaoriYa