Posted at

Azure DevOps (旧VSTS) の Android Signing で Zipalign を ON にしよう


【問題】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 / ZipalignON に変えたら解決しました :smile:


愚痴

タスク 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 のままでもよさそうじゃないですか :angry:


【ハズレ】署名を疑う

はじめは署名を疑っていました。 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 ファイルを何度かアップロードし直したりしたのに :cry:


参照