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 集成的完整流程
让我用一张图来展示整个流程:
这个流程看起来简单,但每一步都有细节。比如获取授权这一步,很多小厂商以为签了 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 集成方案定下来,不要等到快发布时才临时抱佛脚,那样很容易出问题。