在Windows上启动arm64-v8a APK应使用哪个Android虚拟设备?

21

我有一个使用'arm64-v8a''armeabi-v7a' ABI的通用APK应用程序。 我应该如何调整Android虚拟设备使其能够启动此应用程序?

我尝试了不同的组合,但仍然无法运行。

一些细节

环境

  • Windows 10,CPU Intel Core i5-10300H,RAM 16GB,在SSD上有很多可用空间;
  • Android Studio Arctic Fox | 2020.3.1 Patch 3;
  • 已安装Intel x86模拟器加速器(HAXM installer)v.7.6.5;
  • 已安装Android SDK 12.0、11.0和10.0;
  • 安装了许多不同的虚拟设备(请参见下面的图片)。

应用的映像

  • 应用不同的系统映像,主要是API从26到31;
  • 从AVD管理器中的不同选项卡中使用图像(推荐的x86其他图像);
  • 带ABI的图像包括x86x86_64arm64-v8a
  • 有/没有Google API、支持/不支持Playstore的图像。

我遇到的错误

  • 某些模拟器无法启动。 控制台显示:PANIC: Avd's CPU Architecture 'arm64' is not supported by the QEMU2 emulator on x86_64 host.
  • APK未安装在某些模拟器上,弹出窗口显示消息:INSTALL_FAILED_NO_MATCHING_ABI
  • 这个应用程序尝试启动(显示了一个闪屏),但突然关闭。我注意到logcat输出了这样的消息(可能与该应用程序相关):Unexpected CPU variant for X86 using defaults: x86_64
  • 额外附加一些图片 在这里输入图片描述

    在这里输入图片描述

    在这里输入图片描述

    在这里输入图片描述

    在这里输入图片描述

    在这里输入图片描述


    你能否获取x86二进制文件的库,以便与arm二进制文件一起使用?如果可能的话,您真的不想进行处理器仿真-至少会慢10倍。 - Gabe Sechan
    1
    嘿,Gabe,感谢回复。我不确定我是否正确理解了你的意思。首先,我没有任何额外的二进制文件或库(只有APK),因此我没有任何需要包含的东西。其次,我真的很惊讶,为什么现代APK(arm64-v8a)不能在现代图像(Android 31 API)上简单地启动,而不需要任何解决方法。 - Volodymyr Nabok
    你有二进制文件-它们在APK中。如果你只是使用没有二进制文件的Kotlin或Java,你会自动支持每个ABI-它们是在虚拟机上运行的解释性语言。ABIs仅适用于本地(C或C ++)库。Arm64-v8a是针对ARM处理器而不是x86处理器的,因此它们无法在PC上本地运行(除非你有一台ARM PC,这仍然很少见)。 - Gabe Sechan
    好的 Gabe,我看到 ./lib 目录包含两个文件夹:arm64-v8aarmeabi-v7a。每个目录都有相同的文件列表:libapp.solibflutter.solibsqlcipher.solibtool-checker.so。那么,我应该获取哪些库文件并将它们放在哪里呢? :) - Volodymyr Nabok
    在lib文件夹下应该有另一个文件夹x86_64,它需要所有的so文件- 任何你在其他ABI上使用的so文件都需要一个x86_64版本。如果你的构建正在编译它们,只需将其添加到ABI列表中即可使其编译。 - Gabe Sechan
    这是失败的那一行代码: https://android.googlesource.com/platform/external/qemu/+/1381d44efe69ba0b37fb7f7ef868125e279fc14a/android/emulator/main-emulator.cpp#910 - WGH
    3个回答

    26

    我遇到了完全相同的问题。@WGH 的评论非常准确!请查看失败的代码行。

    #ifdef __x86_64__
          if (sarch == "arm64" && apiLevel >=28) {
              APANIC("Avd's CPU Architecture '%s' is not supported by the QEMU2 emulator on x86_64 host.\n", avdarch);
          }
    #endif
    

    (来源: 这里

    我删除了基于apiLevel 32的arm64 AVD,并使用了来自Nougat 7.1.1的较旧的apiLevel 25,它可以在QEMU、Ubuntu 20.04上正常加载arm64 AVD。(尽管速度慢!!)

    @mtotschnig的评论也可能很相关,但是我正在尝试使用x86_64 AVD运行api版本30的应用程序,但无法运行。


    与Vulkan无关吗? - LOG_TAG
    2
    为什么ARM64在API级别28以上无法工作? - isJulian00
    你到底在哪里找到这行代码的?!!! - arled
    什么是'sarch'? - undefined

    2

    1
    你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的答案是否正确。你可以在帮助中心找到关于如何撰写好的答案的更多信息。 - Community

    -8

    好的,问题已经解决了。我不知道原因是什么,但我只是:

    • 删除所有虚拟设备,
    • 删除整个Android Studio,
    • 重新下载Studio的安装包,
    • 再次安装Android Studio,
    • 添加一个已知的虚拟设备:带有Play Store的Nexus 5X,图像ABI x86 API 30,支持Google Play。

    就这样。应用程序已启动。


    7
    当然可以,您使用的是x86映像,所以它能正常工作。 - mireazma
    4
    它之所以有效,是因为API 30 x86模拟器内置了ARM模拟器:https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html - mtotschnig

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接