App Xamarin: non è possibile eseguire la distribuzione nell'emulatore Android 11

Aug 22 2020

Non è possibile distribuire all'emulatore Android 11. (I posso distribuire ad Android 10 emulatore)

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()

Questa è una build di debug, quindi non la firmo esplicitamente.

Ma noto che viene comunque firmato automaticamente con un 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 

Nel caso in cui debug.keystore fosse in qualche modo obsoleto (il mio aveva il timestamp 2018-03-26), l'ho rimosso e è stato rigenerato dalla build. (con differenze di dimensioni ragionevoli), ma ho comunque ricevuto l' "Mono.AndroidTools.InstallFailedException: The package was not properly signed (NO_CERTIFICATES)."errore.

Ho provato a pulire e ricostruire. Sto prendendo di mira Android 11.0 (livello API 30 -R)

Aggiornare:

Ho ricevuto un po 'più di informazioni quando ho tentato manualmente di installare con 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$]

Risposte

3 Tom Aug 24 2020 at 22:27

APK Signature Scheme v2 ora richiesto :

"Le app che hanno come target Android 11 (livello API 30) che sono attualmente firmate solo utilizzando APK Signature Scheme v1 ora devono essere firmate anche utilizzando APK Signature Scheme v2 o versioni successive. Gli utenti non possono installare o aggiornare app firmate solo con APK Signature Scheme v1 su dispositivi che eseguono Android 11. "

Firmare con jarsigner.exe non è abbastanza buono, quando Targeting con android 11. Firmare con apksigner, include lo schema v2.

Ad esempio, la firma in questo modo, utilizzando lo stesso, debug.keystoreconsente di installare l'apk su Android 11.

Firma manuale

"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

Passaggio ad apksigner tramite file csproj

La build Xamarin può essere modificata in apksigner, aggiungendola <AndroidUseApkSigner>true</AndroidUseApkSigner>al file csproj. (Non ho trovato un modo per farlo nell'interfaccia utente. Forse questa è una funzionalità sperimentale?)

È necessario utilizzare una versione BuildTools relativamente nuova per eseguire questa operazione, ad esempio:

<AndroidSdkBuildToolsVersion>28.0.3</AndroidSdkBuildToolsVersion>

Ora la build firma l'apk in questo modo:

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$