Xamarin App-不能部署到Android 11仿真器

人气:293 发布:2022-10-16 标签: xamarin xamarin.android visual-studio-2019

问题描述

无法部署到Android 11模拟器。(我可以部署到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()

这是调试版本,所以我不会显式对其签名。

但我注意到它无论如何都会自动使用android调试密钥进行签名:

C:Program FilesAndroidJdkmicrosoft_dist_openjdk_1.8.0.25injarsigner.exe -keystore "C:Users$USERNAME$AppDataLocalXamarinMono for Androiddebug.keystore" -storepass android -keypass android -digestalg SHA-256 -sigalg SHA256withRSA -signedjar binDebug$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$]

推荐答案

APK Signature Scheme v2 now required:

目前仅使用APK签名方案v1签名的面向Android 11(API级别30)的应用程序现在也必须使用APK签名方案v2或更高版本进行签名。用户无法在运行Android 11的设备上安装或更新仅使用APK签名方案v1签名的应用。

针对Android 11,使用jarsigner.exe签名不够好。使用apksigner签名,包括v2方案。

例如像这样签名,使用相同的debug.keystore允许在Android 11上安装APK。

手动签名

"C:Program Files (x86)Androidandroid-sdkuild-tools30.0.2apksigner.bat" sign -ks "C:Users\%USERNAME%AppDataLocalXamarinMono for Androiddebug.keystore" --ks-pass "pass:android" $APKNAME$.apk

通过csproj文件切换到apksigner

通过将<AndroidUseApkSigner>true</AndroidUseApkSigner>添加到csproj文件中,可以将Xamarin构建切换到apksigner。(我还没有找到在用户界面中实现这一点的方法。也许这是一个试验性功能?)

您必须使用相对较新的BuildTools版本来执行此操作,例如:

<AndroidSdkBuildToolsVersion>28.0.3</AndroidSdkBuildToolsVersion>

现在,内部版本对APK进行签名如下:

C:Program FilesAndroidJdkmicrosoft_dist_openjdk_1.8.0.25injava.exe -jar "C:Program Files (x86)Androidandroid-sdkuild-tools28.0.3libapksigner.jar" sign --ks "C:Users\%USERNAME%AppDataLocalXamarinMono for Androiddebug.keystore" --ks-pass pass:android --ks-key-alias androiddebugkey --key-pass pass:android --min-sdk-version 22 --max-sdk-version 30  $APKNAME$ 

633