Android Studio模拟器不带有API 23的Play Store。

95

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

Google API

我选择了最新的android API 23。因为它说“带有Google API”,所以我认为它将实际包括所有谷歌应用程序,包括Play商店,以便我可以安装Facebook等应用程序。

我看到其他SO线程似乎已经过时了 (如何在Android Studio模拟器中安装Google Play应用程序?),这个给出了基于通用包安装Google应用程序的说明,但它只适用于Android 4.3 API 18: http://wiki.rootzwiki.com/Google_Apps#Universal_Packages_2

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

看起来官方的Android模拟器不会默认提供所有谷歌应用程序,这似乎不太支持谷歌,可能意味着开发人员必须购买实际设备来开发API 23?


谢谢Yvette女士。我认为对于安卓社区来说,解答这个问题非常重要。有很多安卓开发者没有实际的安卓设备可供使用,我想知道当他们无法获得所有工具时,他们将如何进行安卓开发。 - Simon
1
我没有足够的信用在上面发表评论。关于只读/system分区,请确保在调用emulator.exe时传递“-writable-system”参数。例如:START /B emulator.exe @Nexus_7-2012_API_22 -no-boot-anim -writable-system - pjl
@pjl - 谢谢您的评论!我已将其添加到我的答案中。 - Dev-iL
谷歌表示他们正在努力为模拟器添加Play Store支持。与此同时,您可以选择一些解决方法。使用亚马逊应用商店是其中之一,但并不是唯一的选择。请点击这里 - unforgettableidSupportsMonica
9个回答

58

最近我在API 23模拟器上必须这样做,所以我遵循了这篇指南。它适用于API 23模拟器,因此您不应该有任何问题。

注意:所有功劳归链接博客文章的作者(pyoor)所有。我只是在这里发布,以防链接因任何原因断开。

下载GAPPS软件包

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

[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 时可能需要几分钟时间。一旦启动,我们需要将 AVD 的系统分区重新挂载为可读写,以便我们可以将软件包推送到设备上。

[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 Play包出现在菜单启动器中。在将Google帐户与AVD关联后,我们现在在模拟器下拥有一个完全运行的Google Play版本。


29
我收到了“只读文件系统”的错误提示,这些 apk 文件中没有一个被安装。 - wmac
6
很遗憾,BasketBuild似乎不再可用。https://s.basketbuild.com/显示它至少自9月3日以来一直处于宕机状态,并且没有预计的上线时间。你是否有其他推荐的Google应用程序资源? - Chad Schultz
4
所有链接已失效。 - Mooing Duck
1
任何无法获取GApps的人可以前往以下网址下载:http://f.lomakuit.com/download/gapps-lp-20141109-signed.zip - Manny265
1
如果有人遇到问题,请查看这篇博客文章,它详细解释了每个步骤(而且有很多步骤):https://infosectrek.wordpress.com/2017/01/17/installing-the-google-play-store-app-apk-on-the-android-emulator/ - Vicky Chijwani
显示剩余13条评论

53
以下是适用于API 23-25模拟器的方法。对于其他版本,解释以API 24为例,但几乎完全相同。

致谢Jon Doezaidorxpjl

给读者的提示:在按照这些步骤之前,请先仔细查看一下这些步骤,因为其中一些步骤是通过提供的脚本自动完成的。


  1. 在Android Studio的AVD管理器中(已测试版本为2.2.3),创建一个新的模拟器,目标为"Android 7.0 (Google APIs)" :AVD screen after creating the emulator.
  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上使用Homebrew:brew install lzip来解压。例如:lzip -d gmscore-x86_64.tar.lz
我提供了一个批处理文件,利用7z.exelzip.exe自动提取所有必需的.apk文件(在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),并将所有相关内容放在一个文件夹中,如下所示: What it should look like...

更新su二进制文件,以便能够修改稍后上传的文件的权限。可以在Chainfire的SuperSU软件包“可恢复闪存”zip中找到新的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
把所有的.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

请注意根据您的系统中Android SDK的位置修改路径E:\...\android-sdk\tools\emulator.exe

  • 执行上述批处理文件(执行后控制台应如下所示):

  • O:\123>START /B E:\...\android-sdk\tools\emulator.exe @Nexus_6_API_24 -no-boot-anim -writable-system
    
    O:\123>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:\123>adb root
    
    O:\123>adb shell stop
    
    O:\123>adb remount
    remount succeeded
    
    O:\123>adb push PrebuiltGmsCore.apk /system/priv-app/PrebuiltGmsCore/
    [100%] /system/priv-app/PrebuiltGmsCore/PrebuiltGmsCore.apk
    
    O:\123>adb push GoogleServicesFramework.apk /system/priv-app/GoogleServicesFramework/
    [100%] /system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk
    
    O:\123>adb push GoogleLoginService.apk /system/priv-app/GoogleLoginService/
    [100%] /system/priv-app/GoogleLoginService/GoogleLoginService.apk
    
    O:\123>adb push Phonesky.apk /system/priv-app/Phonesky/Phonesky.apk
    [100%] /system/priv-app/Phonesky/Phonesky.apk
    
    O:\123>adb shell su root "chmod 777 /system/priv-app/**"
    
    O:\123>adb shell su root "chmod 777 /system/priv-app/PrebuiltGmsCore/*"
    
    O:\123>adb shell su root "chmod 777 /system/priv-app/GoogleServicesFramework/*"
    
    O:\123>adb shell su root "chmod 777 /system/priv-app/GoogleLoginService/*"
    
    O:\123>adb shell su root "chmod 777 /system/priv-app/Phonesky/*"
    
    O:\123>adb shell start
    
  • 当模拟器加载时 - 关闭它,删除虚拟设备,然后使用相同的系统镜像创建另一个虚拟设备。这可以修复无响应的Play Store应用程序,“Google Play Services已停止”和类似的问题。它有效是因为在之前的步骤中我们实际上已经修改了系统镜像本身(查看android-sdk\system-images\android-24\google_apis\x86_64\system.img修改日期)。这意味着从现在开始使用该系统镜像创建的每个设备都将安装gapps!

  • 启动新的AVD。如果加载时间异常长,请关闭它并改用以下方法启动:

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

    启动AVD后,您将看到下面的图像-注意右下角的Play Store图标!

    First boot with Play Store installed.


    3 - 我不确定是否需要所有这些命令,也许其中一些是过度的...但它似乎起作用了-这就是最重要的。:)


    2
    Open Gapps似乎包含.lz文件(例如gsfcore-all.tar.lz),而不是.xz文件。我尝试了多种工具,但都无法解压缩.lz文件以便获取APK文件。有什么建议吗? - Chad Schultz
    2
    @Chad Schultz 这是工具的链接 http://download.savannah.gnu.org/releases/lzip/ 如果你在使用Windows系统,请下载 "lzip-1.11-w32.zip" 并使用以下命令将其转换为.tar文件,最后再使用另一个工具进行提取。 - f4b
    1
    @Dev-iL PlayStore已经安装在我的模拟器上,但是它无法打开。我正在使用Nexus 5的x86_64 API 23系统镜像。有什么想法吗? - ARK
    3
    这对我在最新的25/7.1模拟器上奏效了。唯一奇怪的事情是我的映像中没有/system/app/SdkSetup.apk。非常感谢,之前试图解决这个问题时让我快疯了! - wilsonpage
    1
    您如何准确地“使用相同的系统映像创建另一个映像”? - gavsiu
    显示剩余21条评论

    43

    现在不需要侧面加载任何软件包或执行任何脚本就可以在模拟器上获取Play Store了。从Android Studio 2.4开始,您可以创建一个预装有Play Store的AVD。目前该功能仅支持运行Android 7.0(API 24)系统映像的AVD。

    官方来源

    预装Play Store的AVD

    注意: 兼容设备将以新的 Play Store 列表示。


    8
    注意:你需要安装一个系统镜像,它应该标注为目标:“Android 7.0 (Google Play)”,而不仅仅是 Google APIs。目前只有 API 24 可用,API 25 不可用。安装系统镜像后,它将出现在“推荐”选项卡下,而不是 x86 镜像选项卡下。 - antoine
    2
    Android Studio 2.3.3 在 Linux 上现在支持 Play Store AVDs - 但值得注意的是,目前 Play Store 似乎只在 x86 目标上可用,因此如果您想在 ARM AVD 上获得 Play Store,则仍需要使用另一种方法。 - NullColaShip
    现在除了24之外,还有API 25、26和27的镜像。 - arekolek

    29

    想对上一个答案进行评论,但是没有登录只能回答:

    要消除“只读错误”,只需在设备准备就绪后立即停止设备。我的脚本如下所示:

    #!/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
    

    1
    这个帮我解决了只读文件系统错误。由于我是在Windows上工作,所以我忽略了脚本的第一行,并用这个替换了第二行 "START /B /tools/emulator @Nexus_6P_API_23 -no-boot-anim",将其保存为.bat扩展名并从命令行运行。 - zaidorx
    如果您在执行adb shell stop时遇到“必须具备root权限”的错误,请在开头加上adb root。 - nutella_eater
    adb wait-for-device行之后立即添加adb root行以避免出现只读文件系统错误。 - efkan
    2
    只要我在模拟器命令中添加了-writable-system,就可以正常工作,命令如下:~/android-sdk/tools/emulator @Nexus_5X_API_23 -no-boot-anim -writable-system。 - reassembler

    7

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

    1- 进入"C:\Users[user].android\avd[your virtual device folder]",使用记事本等文本编辑器打开"config.ini"

    2- 修改

    "PlayStore.enabled=false""PlayStore.enabled=true"

    3- 修改

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

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


    4

    以下是我在Linux上使用的脚本,用于一个Nexus 5 API 24 x86实例没有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 Play服务位置权限。

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


    4
    你需要做的是更新设备的 config.ini 文件并重新下载系统镜像。
    .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
    

    然后从Android Studio > Tools > AVD Manager重新下载设备的系统镜像。

    就这样。重启设备,您将拥有Play商店安装包。

    这个问题也在这里得到了回答:如何在Android Studio模拟器中安装Google Play应用程序?


    当我点击下载时,我会收到这个错误提示:“无法下载所有软件包!以下软件包不可用:- 软件包ID system-images; android-23; google_apis_playstore; x86”。 - JP711

    2

    前往http://opengapps.org/,下载与您平台和Android版本相对应的pico版本。解压下载的文件夹以获取:
    1. GmsCore.apk
    2. GoogleServicesFramework.apk
    3. GoogleLoginService.apk
    4. Phonesky.apk

    然后,找到您的emulator.exe。您可能会在以下位置找到它:
    C:\Users\<YOUR_USER_NAME>\AppData\Local\Android\sdk\tools

    运行以下命令:
    emulator -avd <YOUR_EMULATOR'S_NAME> -netdelay none -netspeed full -no-boot-anim -writable-system

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

    然后,
    adb root
    adb remount
    adb push <PATH_TO GmsCore.apk> /system/priv-app
    adb push <PATH_TO GoogleServicesFramework.apk> /system/priv-app
    adb push <PATH_TO GoogleLoginService.apk> /system/priv-app
    adb push <PATH_TO Phonesky.apk> /system/priv-app

    然后,重新启动模拟器
    adb shell stop
    adb shell start

    要验证,请运行
    adb shell pm list packages,您将找到Google的com.google.android.gms包。


    1

    目前来看,使用adb push命令将apk安装到/system目录似乎是有效的。

    某些隐藏服务会自动将/system目录重新挂载为只读模式。

    无论如何,我能够在普通的虚拟机(即非Google API虚拟机)上安装Play商店,只需挂载来自我的操作系统的system.img文件并复制文件即可。

    # 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
    

    APK文件可以通过使用adb pull命令从运行Google应用程序的任何真实Android设备中提取。
    [为了获取apk的确切路径,我们可以在adb shell内使用pm list packages -f命令]

    2
    我已经安装了Linux并将APK复制到带有Google API的6.0 system.img中,但是当我创建一个新的模拟器时,它没有Google Play服务或Google Play商店。我将尝试使用非Google API ROM再次尝试。 - noname.cs

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