去年末に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 [キータ]