Application Xamarin - Impossible de déployer sur l'émulateur Android 11

Aug 22 2020

Impossible de déployer sur l'émulateur Android 11. (Je peux déployer sur l'émulateur 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()

Ceci est une version de débogage, donc je ne la signe pas explicitement.

Mais je remarque qu'il est automatiquement signé de toute façon avec 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 

Dans le cas où debug.keystore, était en quelque sorte obsolète, (le mien était horodaté 2018-03-26), je l'ai supprimé et il a été régénéré par la construction. (avec des différences de taille raisonnables), mais j'ai toujours reçu l' "Mono.AndroidTools.InstallFailedException: The package was not properly signed (NO_CERTIFICATES)."erreur.

J'ai essayé de nettoyer et de reconstruire. Je cible Android 11.0 (niveau d'API 30 -R)

Mettre à jour:

J'ai reçu un peu plus d'informations lorsque j'essayais manuellement d'installer avec 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$]

Réponses

3 Tom Aug 24 2020 at 22:27

APK Signature Scheme v2 maintenant requis :

"Les applications qui ciblent Android 11 (niveau d'API 30) qui ne sont actuellement signées qu'à l'aide du schéma de signature APK v1 doivent désormais également être signées à l'aide du schéma de signature APK v2 ou version ultérieure. Les utilisateurs ne peuvent pas installer ni mettre à jour des applications signées uniquement avec le schéma de signature APK v1 sur les appareils exécutant Android 11. "

La signature avec jarsigner.exe n'est pas suffisante, lors du ciblage d'Android 11. La signature avec apksigner inclut le schéma v2.

Par exemple, une signature comme celle-ci, l'utilisation de la même chose debug.keystorepermet d'installer l'apk sur Android 11.

Signature manuelle

"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

Passer à apksigner via le fichier csproj

La version Xamarin peut être basculée vers apksigner, en l'ajoutant <AndroidUseApkSigner>true</AndroidUseApkSigner>au fichier csproj. (Je n'ai pas trouvé de moyen de le faire dans l'interface utilisateur. Peut-être s'agit-il d'une fonctionnalité expérimentale?)

Vous devez utiliser une version relativement nouvelle de BuildTools pour ce faire, par exemple:

<AndroidSdkBuildToolsVersion>28.0.3</AndroidSdkBuildToolsVersion>

Maintenant, la construction signe l'apk comme ceci:

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$