Xamarin
Xamarin.Android
VSTS
AzureDevOps

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:

参照