22、GMS 集成:Google 服务集成、预装应用、签名配置

说到 GMS 集成,这可能是很多做海外设备的厂商最头疼的一环。我刚开始接触这块时,也觉得不就是装几个 Google 应用嘛,后来才发现这里面的门道比想象中深得多。

GMS,全称 Google Mobile Services,说白了就是 Google 移动服务。它跟 AOSP 是两码事——AOSP 是开源的,谁都能用;但 GMS 需要 Google 授权,得签协议、过认证。嗯,这里要注意,没有 GMS 的设备在海外市场基本寸步难行,因为很多海外应用都依赖 Google 服务框架。

GMS 集成的核心组件

GMS 不是单个应用,而是一整套服务。我个人习惯把它分成三层:

  • 底层服务:Google Services Framework、Google Play Services
  • 核心应用:Google Play Store、Google Play 服务、Google 账户管理
  • 可选应用:Gmail、YouTube、Google Maps 等

你想想看,如果底层服务没装好,上层应用根本跑不起来。我在项目中遇到过好几次,明明把 APK 都放进去了,但 Google Play Store 就是闪退,最后发现是 Google Services Framework 的签名不对。

预装应用的配置方式

在 Android Build 系统中,预装应用通常放在 vendor/product/ 分区。配置方式主要有两种:

方式一:使用 Android.mk 或 Android.bp

// Android.bp 示例
android_app_import {
    name: "Gmail2",
    apk: "Gmail2.apk",
    privileged: true,
    certificate: "platform",
    required: ["libchrome.so"],
    overrides: ["Email"],
}

方式二:使用 PRODUCT_PACKAGES 变量

# device.mk 中配置
PRODUCT_PACKAGES += \
    Gmail2 \
    YouTube \
    GooglePlayServices \
    GoogleServicesFramework

这里有个坑——privileged: true 表示应用会放到 /system/priv-app 目录,拥有系统级权限。Google 的核心服务必须用这个,否则有些功能会受限。

签名配置——最容易出问题的地方

签名问题是我踩过最多的坑。GMS 应用对签名要求极其严格,因为 Google 要确保这些应用没有被篡改。

常见的签名方式有:

签名类型 用途 注意事项
platform 系统级应用 使用 AOSP 的 platform 密钥
shared 共享 UID 的应用 多个应用使用同一签名
media 媒体相关应用 使用 media 密钥
testkey 开发调试 正式发布必须更换

我曾经犯过一个低级错误——把 Google Play Services 签成了 testkey,结果设备死活过不了 CTS 认证。后来花了整整两天才排查出来,嗯,从那以后我每次集成 GMS 都会先检查一遍签名配置。

关键点:Google 的 GMS 应用包(通常叫 GMS Package)里已经包含了签名信息。你只需要在构建时指定使用对应的密钥即可,不要自己去重新签名。

GMS 集成的完整流程

让我用一张图来展示整个流程:

GMS 集成完整流程 获取 Google 授权 签署 MADA 协议 下载 GMS Package Google 提供专用下载链接 配置构建系统 添加 PRODUCT_PACKAGES 签名配置 使用 platform 密钥 编译 & 烧录 make -j8 && fastboot flash CTS 认证测试 通过 Google 官方测试套件 正式发布 设备上市销售 注意:CTS 认证失败会导致 GMS 授权被收回,务必重视

这个流程看起来简单,但每一步都有细节。比如获取授权这一步,很多小厂商以为签了 MADA 协议就完事了,其实 Google 还会审核你的设备是否符合兼容性要求。

预装应用的权限配置

GMS 应用通常需要一些特殊权限。在 Android 11 之后,Google 对权限管理更严格了。你需要在 permissions 目录下配置白名单:

<!-- /etc/permissions/privapp-permissions-google.xml -->
<privapp-permissions package="com.google.android.gms">
    <permission name="android.permission.INSTALL_PACKAGES"/>
    <permission name="android.permission.DELETE_PACKAGES"/>
    <permission name="android.permission.CLEAR_APP_CACHE"/>
</privapp-permissions>

警告:不要随意给 GMS 应用授予过多权限。Google 在 CTS 测试中会检查权限配置是否合理。我曾经见过有人把 INSTALL_PACKAGES 权限给了所有预装应用,结果 CTS 直接报错。

常见问题与避坑指南

做 GMS 集成这么多年,我总结了一些常见问题:

  • 签名冲突:多个应用使用了相同的签名但 UID 不同,导致安装失败。解决办法是统一使用 platform 签名。
  • 版本兼容性:GMS 组件之间有版本依赖关系。比如 Google Play Services 版本太旧,会导致 Google Play Store 无法更新。
  • 分区空间不足:GMS 包通常比较大,我遇到过 /system 分区空间不够的情况。建议提前规划好分区大小。

小技巧:在开发阶段,可以用 adb install -r -d 来调试预装应用,不用每次都重新编译整个系统。但正式发布时一定要用完整的构建流程。

嗯,GMS 集成这块内容确实不少,但核心就是三点:授权、签名、权限配置。把这三点搞清楚了,大部分问题都能迎刃而解。我个人建议在项目初期就把 GMS 集成方案定下来,不要等到快发布时才临时抱佛脚,那样很容易出问题。


公众号:蓝海资料掘金营,微信 deep3321