とりあえず自分がハマった問題のメモ。
経緯
- 今までCoronaSDKでAndroidアプリを作成していた
- ある時MacOSXを再インストールして開発環境をイチから再構築した。
- その後、CoronaSDKでアプリのアップデートを作成して公開した
- しかし、古いAndroid端末(Android4.0)でインストールエラー103が出るとの報告がきた。
原因の推測
OSX El Capitanをクリーンインストールした時にJava1.7をインストールしていた。古いAndroidをサポートするためにはJava1.6でビルドしないと問題になることが多いっぽい。
対応1
とりあえずJava1.6にダウングレードすることにした。
1.まず、以下のページを参考にJava1.7以降をアンインストール
https://machow2.com/how-to-uninstall-java-from-el-capitan/
$sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
$sudo rm -fr /Library/PreferencePanes/JavaControlPanel.prefpane
$sudo rm -fr /System/Library/Java/JavaVirtualMachines/jdk1.x.x_xx.jdk
or
$sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.x.x_xx.jdk
2.次に、以下からOSX用のJava1.6をダウンロードしてインストール
https://support.apple.com/kb/dl1572?locale=en_US
これで解決すると思ったら・・・
Android build failed (256)!?
CoronaSDKでリリース用のAndroid用ビルドをしようとしたところ「Android build failed (256)」が発生。Corona Terminalのログを見るとどうやら「jarsigner returned: 1」が原因らしい。いろいろ調べたところ、jarsignerは1.6と1.7以降で処理が違うらしく、この辺の処理を考慮する必要があるらしい。
対応2
いろいろ試行錯誤した結果、以下の手順でエラーが消えた・・・?
- Corona SimulatorでAndroid用ビルドをするときにbrowseボタンからkeystoreを再度選択。
- パスワードを入力
- ビルド
なんだかよくわかりませんがパスワードを入力した時のJDKとビルドをするときのJDKのバージョンが異なるとjarsignerがうまく動かないっぽいです。なので、JDKを変更した時は一度keystoreを再選択してパスワードを入力し直しましょう。たぶん。
対応3
上記でOKかとおもいきや、いつの間にかエラー256が復活するようになり、今度はパスワードを入れなおしてもうまくいかない現象に当たりました・・・。
jarsignerがエラーを返すというのまでは同じなので、Corona Simulatorが呼んでいるビルドスクリプトを少し追ってみました。自分の場合は、どうもkeysotoreで使用した暗号化アルゴリズムとbuild.xmlで指定しているアルゴリズムが異なるのが問題っぽいです。JDK1.7のjarsignerだとこの辺を上手く捌いてくれるっぽいのですが、JDK1.6だとなんかエラーになるっぽい?でも昔は上手くビルドできてたような気がするのだが・・・謎。
$keytool -v -list -keystore <アプリのキーストアファイル名>
(略)
署名アルゴリズム名: SHA1withDSA
/Applications/CoronaSDK/Corona Simulator.app/Contents/Resources/build.xml
<exec executable="jarsigner"
dir="${TEMP_DIR}"
failonerror="false"
resultproperty="sign.apk.via.command.line.result">
<arg value="-signedjar"/>
<arg value="${APK_APP_NAME}-signed.apk"/>
<arg value="-keystore"/>
<arg value="${KS}"/>
<arg value="-storepass"/>
<arg value="${KP}"/>
<arg value="-sigalg"/>
<arg value="MD5withRSA"/> <!-- ここ -->
<arg value="-digestalg"/>
<arg value="SHA1"/>
<arg value="${APK_APP_NAME}-unsigned.apk"/>
<arg value="${KA}"/>
</exec>
とりあえず、いいのかどうかわかりませんが、上記build.xmlの-sigalgの引数を署名アルゴリズム名と同じにしてみました(自分の場合はSHA1withDSAで)。そうしたところようやくエラーも消え、古いAndroidでも動くようになりました。ただし、Corona Simulatorではなく、Corona Terminalでないとなぜか上手くいきません・・・。まあ、でも動いたからいいや。ふぅ。