苹果硅(arm64)上的 Android 模拟器只能使用 sudo 模式运行

标签 android android-emulator qemu apple-m1 apple-silicon

我正在尝试在苹果硅 mac 上启动 android 模拟器,但我总是得到相同的结果:

  • 直接通过Android Studio(最新稳定版,Arctic Fox 2020.3.1 Patch 4)运行模拟器会导致问题,当进程qemu-system-arch64卡住并使用99%的CPU(没有模拟器的屏幕或类似的东西)。这种行为会产生一些日志:

  • 内部错误 msg.txt 说:
    emuglConfig_init: blacklisted=0 has_guest_renderer=0, mode: auto, option: (null)
    
    emuglConfig_init: auto-selected swiftshader_indirect based on conditions and UI preference 3
    
    emuglConfig_init: GPU emulation enabled using 'swiftshader_indirect' mode
    
    Deciding if GLDirectMem/Vulkan should be enabled. Selected renderer: 8 API level: 32 host GPU blacklisted? 0
    
    Swiftshader selected, enabling Vulkan.
    
    Enabling GLDirectMem
    Enabling Vulkan
    Adding to the library search path: /Users/xset/Library/Android/sdk/emulator/lib64/gles_swiftshader
    
    opengl_log.txt 说:
    Initializing hardware OpenGLES emulation support
    android_startOpenglesRenderer: gpu info
    
    RenderWindow: CMD_INITIALIZE w=1080 h=2280
    FrameBuffer::initialize
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libvulkan.dylib]
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libvulkan.dylib]: not found in map, open for the first time
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libvulkan.dylib] (posix): begin
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libvulkan.dylib] (posix,darwin): call dlopen
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libvulkan.dylib] (posix,darwin): failed, try again with [/Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libvulkan.dylib]
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libvulkan.dylib] failed (posix). dlerror: []
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libvulkan.dylib]
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libvulkan.dylib]: not found in map, open for the first time
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libvulkan.dylib] (posix): begin
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libvulkan.dylib] (posix,darwin): call dlopen
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libvulkan.dylib] (posix,darwin): failed, try again with [/Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libvulkan.dylib]
    
    SharedLibrary::open for [/Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libvulkan.dylib] failed (posix). dlerror: []
    
    SharedLibrary::open for [libGLESv2.dylib]: not found in map, open for the first time
    
    SharedLibrary::open for [libGLESv2.dylib] (posix): begin
    
    SharedLibrary::open for [libGLESv2.dylib] (posix,darwin): call dlopen
    
    SharedLibrary::open for [libGLESv2.dylib] (posix,darwin): failed, try again with [libGLESv2.dylib]
    
    SharedLibrary::open for [libGLESv2.dylib] failed (posix). dlerror: [dlopen(libGLESv2.dylib, 0x0002): tried: '/Users/xset/Library/Android/sdk/emulator/lib64/qt/lib/libGLESv2.dylib' (no such file), '/Users/xset/Library/Android/sdk/emulator/lib64/gles_swiftshader/libGLESv2.dylib' (code signature in <B48F2D27-E9C4-30EF-A948-C]
    
    SharedLibrary::open for [libEGL.dylib]: not found in map, open for the first time
    
    SharedLibrary::open for [libEGL.dylib] (posix): begin
    
    SharedLibrary::open for [libEGL.dylib] (posix,darwin): call dlopen
    
    SharedLibrary::open for [libEGL.dylib] (posix,darwin): failed, try again with [libEGL.dylib]
    
    SharedLibrary::open for [libEGL.dylib] failed (posix). dlerror: [dlopen(libEGL.dylib, 0x0002): tried: '/Users/xset/Library/Android/sdk/emulator/lib64/qt/lib/libEGL.dylib' (no such file), '/Users/xset/Library/Android/sdk/emulator/lib64/gles_swiftshader/libEGL.dylib' (code signature in <5C3ABCC5-722A-3AEA-AF5B-6CEEFF8D10]
    
    opengl_cxt_log.txt 什么也没说
  • 通过终端(/Users/xset/Library/Android/sdk/emulator/emulator @Pixel_4_API_32)运行模拟器会导致这样的输出:
  • INFO    | Android emulator version 30.9.4.0 (build_id 7759208) (CL:N/A)
    WARNING | unexpected system image feature string, emulator might not function correctly, please try updating the emulator.
    WARNING | cannot add library /Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libvulkan.dylib: failed
    WARNING | cannot add library /Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libvulkan.dylib: failed
    ERROR   | EglOsGlLibrary: Could not open GL library libGLESv2.dylib [dlopen(libGLESv2.dylib, 0x0002): tried: '/Users/xset/Library/Android/sdk/emulator/lib64/qt/lib/libGLESv2.dylib' (no such file), '/Users/xset/Library/Android/sdk/emulator/lib64/gles_swiftshader/libGLESv2.dylib' (code signature in <B48F2D27-E9C4-30EF-A948-C]
    
    ERROR   | EglOsEglDispatcher: Could not open EGL library libEGL.dylib [dlopen(libEGL.dylib, 0x0002): tried: '/Users/xset/Library/Android/sdk/emulator/lib64/qt/lib/libEGL.dylib' (no such file), '/Users/xset/Library/Android/sdk/emulator/lib64/gles_swiftshader/libEGL.dylib' (code signature in <5C3ABCC5-722A-3AEA-AF5B-6CEEFF8D10]
    
  • 在终端中运行相同的命令,但使用 SUDO 效果很好 sudo /Users/xset/Library/Android/sdk/emulator/emulator @Pixel_4_API_32 .它以“apple-native”模式运行模拟器,一切正常。它还会生成一些 INFO 日志:
  • INFO    | Android emulator version 30.9.4.0 (build_id 7759208) (CL:N/A)
    WARNING | unexpected system image feature string, emulator might not function correctly, please try updating the emulator.
    WARNING | cannot add library /Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libvulkan.dylib: failed
    WARNING | cannot add library /Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libvulkan.dylib: failed
    WARNING | cannot add library /Users/xset/Library/Android/sdk/emulator/qemu/darwin-aarch64/lib64/vulkan/libMoltenVK.dylib: failed
    INFO    | added library /Users/xset/Library/Android/sdk/emulator/lib64/vulkan/libMoltenVK.dylib
    createOrGetGlobalVkEmulation: warning: instance doesn't support external memory capabilities, picking first physical device
    INFO    | configAndStartRenderer: setting vsync to 60 hz
    INFO    | Sending adb public key [QAAAAIcNyIfJ1ydnXV4qz3eCWfMwRr0FlqitJHt/0ZHGRTLW4zOVPWMsHNRgO7u0DwRAyNnNa0iQI1Dptp6FvE1PLAr6/eAmYBPwM3/ZqDQKjuglikfnLLugTDa3K8CjUwBe4OkprODSUqv5dcdgPBgpG0vqFJnRQSWA2I/n5dh6QEbsJE8oDOz0ol/PMs9X3j9J1bl6wEhB0pClsH19byXNG4mB9peZ+MoygLE6WeFH1KXN1tQSPUIGd7ePnhtBU5JI86QudZ2SDvd354LM3VGsqfzOGf0SmzPZUOm1T5vBcijtBAm0f+s85K3j5LoQoZu+xgGGDPNTuN+21bQ8NMEC7+z1lqCWhgD8IPbtqypivOFHGbp2CFTjCeH5il84ATs0+O3ejwU4foc7GCWpw71WbqD09+++LIdJvCB7O+GkNebgaJvGjaHqQ7eaj0q3Lf6u6wf/3kSH8fi3QFEyzO0GsAZxAK5J5F7xeXKDznWSgS6fTwDsroU26tcT8B/WHWh7qcNhZeNJziLCyHh8dRbsn1MXUKqleJJwvpGrewUQhmfk1Kb/QlVEBjn1RODon1aWsLZ7ta8vSr2EVk4K4mj4hsXaV5XT3nEP1/ur3kZgydoantUohAuqPlQyoDeBjviGVxg9Guk2p4FZqzuuOVtgV+JZs2PWEt7NdF//mgsSmP/fl6CtawEAAQA= root@unknown]
    INFO    | Rootcanal has **NOT** been activated.
    INFO    | Started GRPC server at 127.0.0.1:8554, security: Local
    INFO    | Advertising in: /Users/xset/Library/Caches/TemporaryItems/avd/running/pid_12298.ini
    
    那么我应该怎么做才能让它在没有 sudo-mode 的情况下通过 Android Studio 原生运行呢?

    最佳答案

    问题已在 Android Emulator 修订版 31.2.7 中成功修复。
    只需转到 Android SDK Manager 并更新它!
    根据android emulator release notes :

    31.2.7 (February 1, 2022)
    
    [Bug fix] Emulator hanging error on M1 machines.
    

    关于苹果硅(arm64)上的 Android 模拟器只能使用 sudo 模式运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70713301/

    相关文章:

    java - 自定义字符串分隔符 stringtemplate-4

    android - Android 是否会在更新时清理应用程序缓存?

    android - 从主机连接到在 docker 容器内运行的 Android 模拟器

    Android 模拟器错误 "emulator: ERROR: the user data image is used by another emulator. aborting"

    linux - Qemu 中的 guest 操作系统在 irq4 上生成过多中断

    linux - 配置 QEMU(Guest Debian-9.0 Sparc64 - Host MacOS High Sierra)从 guest 到主机执行 ssh

    android:进程和进程名称

    android - 创建用于具有自定义分辨率的模拟的 AVD 没有任何导航按钮

    eclipse - 如何模拟更改我的 android 设备的方向?

    c++ - 编译qemu-xen时signal.c出错