Xamarinアプリ-Android11エミュレーターにデプロイできません

Aug 22 2020

Android11エミュレーターにデプロイできません。(Android 10エミュレーターにデプロイできます)

ADB0010:  Deployment failed
Mono.AndroidTools.InstallFailedException: The package was not properly signed (NO_CERTIFICATES).
   at Mono.AndroidTools.Internal.AdbOutputParsing.CheckInstallSuccess(String output, String packageName)
   at Mono.AndroidTools.AndroidDevice.<>c__DisplayClass97_0.<InstallPackage>b__0(Task`1 t)
   at System.Threading.Tasks.ContinuationTaskFromResultTask`1.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at AndroidDeviceExtensions.<PushAndInstallPackage>d__11.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at AndroidDeviceExtensions.<PushAndInstallPackage>d__11.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at Xamarin.AndroidTools.AndroidDeploySession.<InstallPackage>d__116.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at Xamarin.AndroidTools.AndroidDeploySession.<RunAsync>d__110.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Xamarin.AndroidTools.AndroidDeploySession.<RunLoggedAsync>d__108.MoveNext()

これはデバッグビルドなので、明示的に署名していません。

しかし、とにかくandroiddebugkeyで自動的に署名されていることに気付きました。

C:\Program Files\Android\Jdk\microsoft_dist_openjdk_1.8.0.25\bin\jarsigner.exe -keystore "C:\Users\$USERNAME$\AppData\Local\Xamarin\Mono for Android\debug.keystore" -storepass android -keypass android -digestalg SHA-256 -sigalg SHA256withRSA -signedjar bin\Debug\$UNSIGNEDAPKNAME$.apk $PATHTOAPK$.apk androiddebugkey 

debug.keystoreが何らかの理由で古くなった場合(私のタイムスタンプは2018-03-26)、削除するとビルドによって再生成されました。(適切なサイズの違いはありますが)、それでも"Mono.AndroidTools.InstallFailedException: The package was not properly signed (NO_CERTIFICATES)."エラーが発生しました。

掃除と再建を試みました。Android 11.0(APIレベル30 -R)をターゲットにしています

更新:

adbを使用して手動でインストールしようとしたときに、もう少し情報を受け取りました。

adb -e install $myapp$.apk

... 
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Scanning Failed.: No signature found in package of version 2 or newer for package $PACKAGE$]

回答

3 Tom Aug 24 2020 at 22:27

APK署名スキームv2が必要になりました:

「現在APK署名スキームv1のみを使用して署名されているAndroid11(APIレベル30)を対象とするアプリは、APK署名スキームv2以降も使用して署名する必要があります。ユーザーはAPK署名スキームのみで署名されたアプリをインストールまたは更新できません。 Android11を実行するデバイス上のv1。」

android 11をターゲットにしている場合、jarsigner.exeを使用した署名では不十分です。apksignerを使用した署名には、v2スキームが含まれています。

たとえば、このように署名し、同じものを使用するとdebug.keystore、apkをAndroid11にインストールできます。

手動で署名する

"C:\Program Files (x86)\Android\android-sdk\build-tools\30.0.2\apksigner.bat" sign -ks "C:\Users\%USERNAME%\AppData\Local\Xamarin\Mono for Android\debug.keystore" --ks-pass "pass:android" $APKNAME$.apk

csprojファイルを介したapksignerへの切り替え

Xamarinビルドは<AndroidUseApkSigner>true</AndroidUseApkSigner>、csprojファイルに追加することでapksignerに切り替えることができます。(UIでこれを行う方法が見つかりませんでした。おそらくこれは実験的な機能ですか?)

これを行うには、比較的新しいバージョンのBuildToolsを使用している必要があります。

<AndroidSdkBuildToolsVersion>28.0.3</AndroidSdkBuildToolsVersion>

これで、ビルドは次のようにapkに署名します。

C:\Program Files\Android\Jdk\microsoft_dist_openjdk_1.8.0.25\bin\java.exe -jar "C:\Program Files (x86)\Android\android-sdk\build-tools\28.0.3\lib\apksigner.jar" sign --ks "C:\Users\%USERNAME%\AppData\Local\Xamarin\Mono for Android\debug.keystore" --ks-pass pass:android --ks-key-alias androiddebugkey --key-pass pass:android --min-sdk-version 22 --max-sdk-version 30  $APKNAME$