Android Studio 模拟器未随 API 23 的 Play 商店一起提供

Android Studio emulator does not come with Play Store for API 23

我从最新版本的 Android Studio AVD 中选择了这个模拟器。

我选择了最新版本的android API 23。因为上面写着"with Google APIs",我以为它实际上会包含所有Google应用程序,包括Play Store 这样我就可以安装 Facebook 等应用程序了。

我在 SO 上看到过其他线程,现在似乎已经过时了(How to install Google Play app in Android Studio emulator?), this one gives instructions for installing Google apps based on universal packages but it only goes up to Android 4.3 API 18: http://wiki.rootzwiki.com/Google_Apps#Universal_Packages_2

我想要 API 的那个 23. 有没有办法在模拟器上安装 Google 应用程序包?

官方 android 模拟器并没有标配所有 google 应用程序,这似乎很奇怪......这似乎不太支持 google 并且可能意味着开发人员必须购买实际设备才能为 API 23 开发?

我最近不得不在 API 23 模拟器上执行此操作,然后是 this guide。它适用于 API 23 模拟器,所以你应该没有问题。

注意:所有功劳归于 linked 博客 post (pyoor) 的作者。我只是 post 在这里设置它以防 link 因任何原因中断。

.....

下载 GAPPS 包

接下来,我们需要下载与我们的 Android AVD 版本相匹配的适当 Google 应用程序包。在这种情况下,我们将使用 'gapps-lp-20141109-signed.zip' 包。您可以从 BasketBuild here.

下载该文件
[pyoor@localhost]$ md5sum gapps-lp-20141109-signed.zip
367ce76d6b7772c92810720b8b0c931e gapps-lp-20141109-signed.zip

为了安装 Google Play,我们需要将以下 4 个 APK 推送到我们的 AVD(位于 ./system/priv-app/):

GmsCore.apk、GoogleServicesFramework.apk、GoogleLoginService.apk、Phonesky.apk

[pyoor@localhost]$ unzip -j gapps-lp-20141109-signed.zip \
system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk \
system/priv-app/GoogleLoginService/GoogleLoginService.apk \
system/priv-app/Phonesky/Phonesky.apk \
system/priv-app/GmsCore/GmsCore.apk -d ./

将 APK 推送到模拟器

提取 APK 后,让我们使用以下命令启动 AVD。

[pyoor@localhost tools]$ ./emulator @<YOUR_DEVICE_NAME> -no-boot-anim

第一次创建 AVD 时,这可能需要几分钟时间。启动后,我们需要将 AVDs 系统分区重新挂载为 read/write,以便我们可以将包推送到设备上。

[pyoor@localhost]$ cd ~/android-sdk/platform-tools/
[pyoor@localhost platform-tools]$ ./adb remount

接下来,将 APK 推送到我们的 AVD:

[pyoor@localhost platform-tools]$ ./adb push GmsCore.apk /system/priv-app/
[pyoor@localhost platform-tools]$ ./adb push GoogleServicesFramework.apk /system/priv-app/
[pyoor@localhost platform-tools]$ ./adb push GoogleLoginService.apk /system/priv-app/
[pyoor@localhost platform-tools]$ ./adb push Phonesky.apk /system/priv-app

盈利!

最后,使用以下命令重新启动模拟器:

[pyoor@localhost platform-tools]$ ./adb shell stop && ./adb shell start

模拟器重新启动后,我们应该会看到 Google 播放包出现在菜单启动器中。将 Google 帐户与此 AVD 相关联后,我们现在在我们的模拟器下拥有 Google Play 运行 的完整工作版本。

想评论最后一个回答,但没有登录只能回答:

要摆脱 "read only error" 只需在设备准备就绪后立即停止即可。我的脚本如下所示:

#!/bin/bash 
~/bin/AndroidSdk/tools/emulator @Nexus_6P_API_23 -no-boot-anim &
adb wait-for-device
adb shell stop
adb remount
adb push GmsCore.apk /system/priv-app
adb push GoogleServicesFramework.apk /system/priv-app
adb push GoogleLoginService.apk /system/priv-app
adb push Phonesky.apk /system/priv-app
adb shell start

以下是我在 API 23-25 模拟器上使用的方法。为 API 24 提供了解释,但对其他版本的解释几乎相同。

学分, , .

Warm advice for readers: please just go over the steps before following them, as some are automated via provided scripts.


  1. 在 Android studio(在 v2.2.3 上测试)的 AVD 管理器中,使用 "Android 7.0 (Google APIs)" 目标创建一个新的模拟器:

  2. 下载模拟器架构 (CPU/ABI) 的最新 Open GApps 包。在我的例子中,它是 x86_64,但它也可以是其他东西,具体取决于您在设备创建向导期间选择的图像。有趣的是,架构似乎比正确的 Android 版本更重要(即 6.0 的 gapps 也可以在 7.0 模拟器上工作)。

  3. 使用以下路径(相对于 open_gapps-x86_64-7.0-pico-201#####.zip)提取 .apk 文件:

    .zip\Core\gmscore-x86_64.tar.lz\gmscore-x86_64\nodpi\priv-app\PrebuiltGmsCore\
    .zip\Core\gsfcore-all.tar.lz\gsfcore-all\nodpi\priv-app\GoogleServicesFramework\
    .zip\Core\gsflogin-all.tar.lz\gsflogin-all\nodpi\priv-app\GoogleLoginService\
    .zip\Core\vending-all.tar.lz\vending-all\nodpi\priv-app\Phonesky\
    

    请注意,Open GApps 使用 Lzip 压缩,可以使用 Lzip 网站1,2 或 Mac 上的工具打开使用自制软件:brew install lzip。然后例如lzip -d gmscore-x86_64.tar.lz

    我提供了一个批处理文件,它利用 7z.exelzip.exe 自动提取所有需要的 .apks(在 Windows 上):

    @echo off
    echo.
    echo #################################
    echo Extracting Gapps...
    echo #################################
    7z x -y open_gapps-*.zip -oGAPPS
    
    echo Extracting Lzips...
    lzip -d GAPPS\Core\gmscore-x86_64.tar.lz
    lzip -d GAPPS\Core\gsfcore-all.tar.lz
    lzip -d GAPPS\Core\gsflogin-all.tar.lz
    lzip -d GAPPS\Core\vending-all.tar.lz
    
    move GAPPS\Core\*.tar
    
    echo. 
    echo #################################
    echo Extracting tars...
    echo #################################
    
    7z e -y -r *.tar *.apk
    
    echo.
    echo #################################
    echo Cleaning up...
    echo #################################
    rmdir /S /Q GAPPS
    del *.tar
    
    echo.
    echo #################################
    echo All done! Press any key to close.
    echo #################################
    pause>nul
    

    要使用它,请将脚本保存在一个文件中(例如 unzip_gapps.bat)并将所有相关内容放在一个文件夹中,如下所示:

  4. 更新 su 二进制文件以便能够修改我们稍后上传的文件的权限。在 Chainfire 软件包 "Recovery flashable" zipSuperSU 中可以找到一个新的 su 二进制文件。获取 zip,将其解压到某处,在同一文件夹中创建包含以下内容的批处理文件,最后 运行 它:

    adb root
    adb remount
    
    adb push eu.chainfire.supersu_2.78.apk /system/app/
    adb push x64/su /system/xbin/su
    adb shell chmod 755 /system/xbin/su
    
    adb shell ln -s /system/xbin/su /system/bin/su
    adb shell "su --daemon &"
    adb shell rm /system/app/SdkSetup.apk
    
  5. 将所有 .apk 个文件放在一个文件夹中,并用这些内容创建一个批处理文件3:

    START /B E:\...\android-sdk\tools\emulator.exe @Nexus_6_API_24 -no-boot-anim -writable-system
    adb wait-for-device
    adb root
    adb shell stop
    adb remount
    adb push PrebuiltGmsCore.apk /system/priv-app/PrebuiltGmsCore
    adb push GoogleServicesFramework.apk /system/priv-app/GoogleServicesFramework
    adb push GoogleLoginService.apk /system/priv-app/GoogleLoginService
    adb push Phonesky.apk /system/priv-app/Phonesky/Phonesky.apk
    adb shell su root "chmod 777 /system/priv-app/**"
    adb shell su root "chmod 777 /system/priv-app/PrebuiltGmsCore/*"
    adb shell su root "chmod 777 /system/priv-app/GoogleServicesFramework/*"
    adb shell su root "chmod 777 /system/priv-app/GoogleLoginService/*"
    adb shell su root "chmod 777 /system/priv-app/Phonesky/*"
    adb shell start
    

    注意路径E:\...\android-sdk\tools\emulator.exe要根据AndroidSDK在你系统上的位置修改

  6. 执行上面的批处理文件(之后控制台应该是这样的):

    O:3>START /B E:\...\android-sdk\tools\emulator.exe @Nexus_6_API_24 -no-boot-anim -writable-system
    
    O:3>adb wait-for-device
    Hax is enabled
    Hax ram_size 0x60000000
    HAX is working and emulator runs in fast virt mode.
    emulator: Listening for console connections on port: 5554
    emulator: Serial number of this emulator (for ADB): emulator-5554
    
    O:3>adb root
    
    O:3>adb shell stop
    
    O:3>adb remount
    remount succeeded
    
    O:3>adb push PrebuiltGmsCore.apk /system/priv-app/PrebuiltGmsCore/
    [100%] /system/priv-app/PrebuiltGmsCore/PrebuiltGmsCore.apk
    
    O:3>adb push GoogleServicesFramework.apk /system/priv-app/GoogleServicesFramework/
    [100%] /system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk
    
    O:3>adb push GoogleLoginService.apk /system/priv-app/GoogleLoginService/
    [100%] /system/priv-app/GoogleLoginService/GoogleLoginService.apk
    
    O:3>adb push Phonesky.apk /system/priv-app/Phonesky/Phonesky.apk
    [100%] /system/priv-app/Phonesky/Phonesky.apk
    
    O:3>adb shell su root "chmod 777 /system/priv-app/**"
    
    O:3>adb shell su root "chmod 777 /system/priv-app/PrebuiltGmsCore/*"
    
    O:3>adb shell su root "chmod 777 /system/priv-app/GoogleServicesFramework/*"
    
    O:3>adb shell su root "chmod 777 /system/priv-app/GoogleLoginService/*"
    
    O:3>adb shell su root "chmod 777 /system/priv-app/Phonesky/*"
    
    O:3>adb shell start
    
  7. 当模拟器加载时 - 关闭它,删除虚拟设备,然后使用相同的系统映像创建另一个虚拟设备。这修复了无响应的 Play 商店应用程序、"Google Play Services has stopped" 和类似问题。它之所以有效,是因为在前面的步骤中,我们实际上已经 修改了系统映像本身 (看看 修改日期 android-sdk\system-images\android-24\google_apis\x86_64\system.img 上) .这意味着从现在开始使用系统映像创建的每个设备都将安装 gapps!

  8. 启动新的 AVD。如果加载时间异常长,请关闭它并使用以下命令启动它:

    START /B E:\...\android-sdk\tools\emulator.exe @Nexus_6_API_24
    adb wait-for-device
    adb shell "su --daemon &"
    

    AVD 启动后,您将看到下图 - 注意角落里的 Play 商店图标!


3 - 我不确定是否需要所有这些命令,也许其中一些命令有点矫枉过正......它似乎有效 - 这才是最重要的。 :)

截至目前,将 apks 安装到 /system 目录似乎可以使用 adb push 命令。

某些隐藏服务自动以 read-only 模式重新挂载 /system 目录。

我可以通过简单地安装 system.img 文件在普通虚拟机(即非 Google-Api 虚拟机)中安装 Play 商店的任何方式从我的 OS 复制文件。

# To be executed as root user in your Unix based OS
mkdir sys_temp
mount $SDK_HOME/system-images/android-23/default/x86/system.img sys_temp -o loop
cp Phonesky.apk GmsCore.apk GoogleLoginService.apk GoogleServicesFramework.apk ./sys_temp/priv-app/
umount sys_temp
rmdir sys_temp

可以使用 adb pull 命令

从任何真实的 Android 设备 运行 Google 应用中提取 APK 文件

[要获取apks的确切路径,我们可以使用命令 pm list packages -f 在 adb 里面 shell ]

这是我在 linux 上使用的脚本 Nexus 5 API 24 x86 WITHOUT GoogleApis.

#!/bin/sh

~/Android/Sdk/tools/emulator @A24x86 -no-boot-anim -writable-system & #where A24x86 is the name i gave to my instance
~/Android/Sdk/platform-tools/adb wait-for-device
~/Android/Sdk/platform-tools/adb root
~/Android/Sdk/platform-tools/adb shell stop
~/Android/Sdk/platform-tools/adb remount
~/Android/Sdk/platform-tools/adb push ~/gapps/PrebuiltGmsCore.apk /system/priv-app/PrebuiltGmsCore/PrebuiltGmsCore.apk
~/Android/Sdk/platform-tools/adb push ~/gapps/GoogleServicesFramework.apk /system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk
~/Android/Sdk/platform-tools/adb push ~/gapps/GoogleLoginService.apk /system/priv-app/GoogleLoginService/GoogleLoginService.apk
~/Android/Sdk/platform-tools/adb push ~/gapps/Phonesky.apk /system/priv-app/Phonesky/Phonesky.apk
~/Android/Sdk/platform-tools/adb shell "chmod 777 /system/priv-app/PrebuiltGmsCore /system/priv-app/GoogleServicesFramework"
~/Android/Sdk/platform-tools/adb shell "chmod 777 /system/priv-app/GoogleLoginService /system/priv-app/Phonesky"
~/Android/Sdk/platform-tools/adb shell "chmod 777 /system/priv-app/PrebuiltGmsCore/PrebuiltGmsCore.apk"
~/Android/Sdk/platform-tools/adb shell "chmod 777 /system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk"
~/Android/Sdk/platform-tools/adb shell "chmod 777 /system/priv-app/GoogleLoginService/GoogleLoginService.apk"
~/Android/Sdk/platform-tools/adb shell "chmod 777 /system/priv-app/Phonesky/Phonesky.apk"
~/Android/Sdk/platform-tools/adb shell start

这个是为我做的。

重要提示: 为了阻止应用程序崩溃,请记住授予 google 播放服务位置权限。

配置->应用->配置(齿轮图标)->应用权限->位置->(右上角菜单)->显示系统->启用Google播放服务

现在无需加载任何执行任何脚本的程序包即可在模拟器上获取 Play 商店。从 Android Studio 2.4 开始,您现在可以创建一个预装了 Play 商店的 AVD。目前它仅在 AVDs 运行 Android 7.0 (API 24) 系统映像上受支持。

Official Source

注意:兼容的设备由新的 Play 商店列表示。

前往 http://opengapps.org/ 并下载您平台的 pico 版本和 android 版本。解压下载的文件夹得到
1。 GmsCore.apk
2。 GoogleServicesFramework.apk
3。 GoogleLoginService.apk
4。 Phonesky.apk

然后,找到您的 emulator.exe。您可能会在
中找到它 C:\Users\\AppData\Local\Android\sdk\tools

运行命令:
emulator -avd -netdelay none -netspeed full -no-boot-anim -writable-system

注意: 使用 -writable-system 以可写系统映像启动模拟器。

然后,
adb root
adb 重新挂载
adb push /system/priv-app
adb push /system/priv-app
adb push /system/priv-app
adb push /system/priv-app

然后,重启模拟器
adb shell停止
adb shell 开始

验证运行,
adb shell pm list packages 你会发现 com.google.android.gms package for google

只想为只需要 Expo 应用程序的 React Native 用户添加另一个解决方案。

  1. 安装 Expo 应用程序
  2. 打开你的项目
  3. 单击设备 -> 在 Android 上打开 - 在此阶段,Expo 将安装 expo android 应用程序,您将能够打开它。

简单的解决方法: 您应该创建一个新的模拟器,然后在第一次打开它之前按照以下 3 个简单的步骤操作:

1- 转到 "C:\Users[用户].android\avd[你的虚拟设备文件夹]" 打开 "config.ini" 使用记事本等文本编辑器

2-变化

"PlayStore.enabled=false""PlayStore.enabled=真"

3-变化

"mage.sysdir.1 = system-images\android-30\google_apis\x86"

"image.sysdir.1 = system-images\android-30\google_apis_playstore\x86"

您需要做的是更新设备的 config.ini 文件和 re-download 系统映像。

更新 .ini 文件中的以下值

  • Windows: C:\Users\USER\.android\avd\DEVICE_ID\config.ini
  • Linux: ~/.android/avd/DEVICE_ID/config.ini
PlayStore.enabled = true
image.sysdir.1=system-images\android-27\google_apis_playstore\x86\
tag.display=Google Play
tag.id=google_apis_playstore

然后 re-download 设备的系统映像来自 Android Studio > Tools > AVD Manager

就是这样。重新启动您的设备,您将安装 Play 商店。

这里也有回答:How to install Google Play app in Android Studio emulator?