Application Xamarin - Impossible de déployer sur l'émulateur Android 11
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
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$