Xamarin не удается развернуть на Android. Неожиданный вывод при установке: ошибка: не удалось проанализировать файл APK - PullRequest
0 голосов
/ 23 апреля 2020

Я успешно обновил приложение с Xamarin.Forms v2 до версии 4.5. К сожалению, я не могу установить приложение на эмуляторе Android, получаю следующую ошибку:


Exception occurred while executing:
java.lang.IllegalArgumentException: Error: Failed to parse APK file: /data/local/tmp/com.myapp.name-Signed.apk
    at com.android.server.pm.PackageManagerShellCommand.setParamsSize(PackageManagerShellCommand.java:338)
    at com.android.server.pm.PackageManagerShellCommand.runInstall(PackageManagerShellCommand.java:906)
    at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:158)
    at android.os.ShellCommand.exec(ShellCommand.java:103)
    at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:21328)
    at android.os.Binder.shellCommand(Binder.java:634)
    at android.os.Binder.onTransact(Binder.java:532)
    at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:2821)
    at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:3856)
    at android.os.Binder.execTransact(Binder.java:731)
Caused by: android.content.pm.PackageParser$PackageParserException: Failed to parse /data/local/tmp/com.myapp.name-Signed.apk
    at android.content.pm.PackageParser.parseApkLiteInner(PackageParser.java:1590)
    at android.content.pm.PackageParser.parseApkLite(PackageParser.java:1575)
    at com.android.server.pm.PackageManagerShellCommand.setParamsSize(PackageManagerShellCommand.java:331)
    ... 9 more

   at Mono.AndroidTools.Internal.AdbOutputParsing.CheckInstallSuccess(String output, String packageName) in E:\A\_work\548\s\External\androidtools\Mono.AndroidTools\Internal\AdbOutputParsing.cs:line 345
   at Mono.AndroidTools.AndroidDevice.<>c__DisplayClass95_0.<InstallPackage>b__0(Task`1 t) in E:\A\_work\548\s\External\androidtools\Mono.AndroidTools\AndroidDevice.cs:line 753
   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() in E:\A\_work\548\s\External\androidtools\Xamarin.AndroidTools\Devices\AndroidDeviceExtensions.cs:line 187
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at AndroidDeviceExtensions.<PushAndInstallPackage>d__11.MoveNext() in E:\A\_work\548\s\External\androidtools\Xamarin.AndroidTools\Devices\AndroidDeviceExtensions.cs:line 203
--- 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__112.MoveNext() in E:\A\_work\548\s\External\androidtools\Xamarin.AndroidTools\Sessions\AndroidDeploySession.cs:line 433
--- 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__106.MoveNext() in E:\A\_work\548\s\External\androidtools\Xamarin.AndroidTools\Sessions\AndroidDeploySession.cs:line 217
--- 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__104.MoveNext() in E:\A\_work\548\s\External\androidtools\Xamarin.AndroidTools\Sessions\AndroidDeploySession.cs:line 119 

Я попытался установить apk с помощью adb, но он все равно не работает со следующим сообщением:

Performing Streamed Install
adb: failed to install .\com.myapp.name-Signed.apk: Failure [INSTALL_PARSE_FAILED_NOT_APK: Failed to parse /d
ata/app/vmdl581776687.tmp/base.apk]

Я могу запустить версию iOS, но Android требуется гораздо больше обновлений пакета.

Манифест приложения выглядит следующим образом:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.myapp.name" android:versionCode="51" android:versionName="2.6" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="22" android:targetSdkVersion="29" />
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application android:label="APPNAME" android:icon="@drawable/icon" android:theme="@style/MyTheme">
        <meta-data android:name="android.max_aspect" android:value="2.1" />
        <provider android:name="androidx.core.content.FileProvider" android:authorities="com.myapp.name" android:exported="false" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
        </provider>
    </application>
</manifest>

Я создаю приложение с использованием Visual Studio 2019, скомпилированное с использованием Android 10 (API 29). Я пытался миллионы раз очистить проект и перестроить его, но результат остался прежним.

APK содержит:

  • сборок
  • assets
  • lib
  • META-INF
  • res
  • AndroidManifest. xml
  • classes.dex
  • УВЕДОМЛЕНИЕ
  • resources.asr c

Я могу просмотреть файл apk, используя 7zip, но он не может распаковать пакет. Так же как и win default zip, что заставляет меня думать, что Xamarin по каким-то причинам создает поврежденный файл.

Мои поля подписи в свойствах приложения пусты, но я строю в режиме отладки, который, насколько я помните, что из нативной разработки будет использоваться ключ по умолчанию.

Я не использую платформу около 4 лет, возможно, мне не хватает некоторых базовых c настроек или обновлений конфигурации?

I боролись с этим с незапамятных времен. У кого-нибудь была такая же проблема или может указать мне правильное направление?

Спасибо!


Обновление 30/04/2020

@ Prateek Да, проблема связано с подписанием, но воссоздание ключа отладки не решает проблему. Однако я смог отследить проблему.

Когда VS2019 / Xamarin завершил сборку файла apk, он выполняет следующие операции:

  1. Запускает zipalign для файла, который будет подписано: D:\Development\Android\build-tools\29.0.0-rc1\zipalign.exe -p 4 "D:\repositories\myapp\Droid\obj\Debug\100\android\bin\com.myapp.name.apk" "bin\Debug\\com.myapp.name-Signed.apk"
  2. Запускает apksigner для подписи архива с помощью ключа отладки: C:\Program Files\Android\Jdk\microsoft_dist_openjdk_1.8.0.25\bin\java.exe -jar D:\Development\Android\build-tools\29.0.0-rc1\lib\apksigner.jar sign --ks C:\Users\Luigi\.android\debug.keystore --ks-pass pass:android --ks-key-alias androiddebugkey --key-pass pass:android --min-sdk-version 22 --max-sdk-version 29 --verbose D:\repositories\myapp\Droid\bin\Debug\com.myapp.name-Signed.apk
  3. Счастливо объявляет com.myapp.name.apk как Подписано

Если я выполняю тот же процесс вручную, я получаю следующее исключение:

 'C:\Program Files\Android\jdk\microsoft_dist_openjdk_1.8.0.25\bin\java.exe' -jar D:\Development\Android\build-tools\29.0.0-rc1\lib\apksigner.jar sign --ks C:\Users\Luigi\.android\debug.keystore --ks-pass pass:android --ks-key-alias androiddebugkey --key-pass pass:android --min-sdk-version 22 --max-sdk-version 29 --verbose  D:\repositories\myapp\Droid\bin\Debug\com.myapp.name-Signed.apk
    offset 32573283
            at com.android.apksig.ApkSigner.sign(ApkSigner.java:241)
            at com.android.apksig.ApkSigner.sign(ApkSigner.java:193)
            at com.android.apksigner.ApkSignerTool.main(ApkSignerTool.java:109)
    Caused by: com.android.apksig.zip.ZipFormatException: Not a Central Directory record. Signature: 0x7515cc6e
            at com.android.apksig.internal.zip.CentralDirectoryRecord.getRecord(CentralDirectoryRecord.java:143)
            at com.android.apksig.ApkSigner.parseZipCentralDirectory(ApkSigner.java:742)

Это означает, что:

  1. Подписанный файл поврежден / поврежден
  2. Система сборки просто игнорирует исключение и продолжает работать

Если я запускаю apksigner на com.myapp.name.apk (без знака), я могу установить исполняемый файл в эмуляторе.

Почему происходит сбой при использовании стандартного набора инструментов? Как бы это исправить? Мне нужно подключить отладчик к запущенному приложению через эмулятор, и я бы предпочел иметь работающую систему сборки без необходимости ручного вмешательства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...