Xamarin 앱-Android 11 에뮬레이터에 배포 할 수 없음

Aug 22 2020

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

이것은 디버그 빌드이므로 명시 적으로 서명하지 않습니다.

하지만 어쨌든 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로만 서명 된 Android 11 (API 레벨 30)을 대상으로하는 앱은 이제 APK 서명 체계 v2 이상을 사용하여 서명해야합니다. 사용자는 APK 서명 체계로만 서명 된 앱을 설치하거나 업데이트 할 수 없습니다. Android 11을 실행하는 기기의 v1. "

android 11을 대상으로 할 때 jarsigner.exe로 서명하는 것만으로는 충분하지 않습니다. apksigner를 사용한 서명에는 v2 체계가 포함됩니다.

예를 들어 이와 같은 서명을 debug.keystore사용하면 APK를 Android 11에 설치할 수 있습니다.

수동으로 서명

"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$