【問題】Azure DevOps でビルドした .apk が動かない?
Xamarin プロジェクトのビルドを Azure DevOps (当時は VSTS) に乗せたかったのですが、作成された .apk が動かなくて悩んでいました。
- .ipa は動く
- ローカルPCでビルドすれば動く
- インストールはできる
- 起動直後にスプラッシュ スクリーンより前に落ちる
- AppCenter に Crash を記録する前に落ちる
だいぶ長い間ネグっていたのですが、やっと解決したので報告します。
【解決】原因は zipalign
Android Device Monitor でアプリが起動するときの様子を観察したところ、次のようなエラー メッセージが出ていました。Tag は monodroid-assembly
です。
Assembly 'assemblies/hoge.dll' is located at a bad address 0x9e3eb44e
You MUST run 'zipalign' on base.apk
なるほど、どうしてもっと早く Android Device Monitor を見なかったんだ。 Android Signing / Zipalign Options / Zipalign を ON に変えたら解決しました
愚痴
タスク Android Signing の初期状態で Zipalign は OFF になっているし(Sign the APK も OFF ですが)、説明も次のような感じで、
Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app.
別に OFF のままでもよさそうじゃないですか
【ハズレ】署名を疑う
はじめは署名を疑っていました。 Android Signing / Signing Options / Jarsigner arguments は本当に初期値 -verbose -sigalg MD5withRSA -digestalg SHA1
のままでよいのか、という疑いです。
署名に異常が無いか調べます:
jarsigner -verify -verbose -certs hoge.apk
実機にインストールして動作を確認します:
adb install hoge.apk
比較のため、ローカルPCでも Azure DevOps と同じコマンドで署名してみます:
jarsigner -keystore Hoge.keystore -storepass xxx -keypass xxx -verbose -sigalg MD5withRSA -digestalg SHA1 -signedjar hoge.apk hoge-unsigned.apk Hoge
次のような状況でした。
.apk | 署名の verify | アプリの動作 |
---|---|---|
Azure DevOps で署名した .apk | OK | 起動直後に終了してしまう |
ローカルで jarsigner で署名した .apk | OK | 起動直後に終了してしまう |
ローカルで Visual Studio の GUI で署名した .apk | OK | 正常に動作する |
Visual Studio が実行しているであろうコマンドを調べてみると、-digestalg SHA1
と -sigalg md5withRSA
をデフォルトで指定しているようです。
結局、署名の部分は信用して良さそう、ということになりました。というか、途中で気付いたのですが、もし署名に問題があるのならば、起動以前にインストールの時点で失敗するはずです。 .keystore ファイルを何度かアップロードし直したりしたのに