1. Android TV与GMS服务框架的关系
第一次接触Android TV开发时,我完全没意识到GMS(Google Mobile Services)对电视系统的重要性。直到用户反馈说"为什么我的电视不能登录Google账号",我才明白这就像给汽车装了发动机却忘了加油——GMS就是让Android TV真正跑起来的"燃料"。
Android TV本质上是个特殊定制的Android系统,但和手机不同,它默认不包含Google服务。这就像给你一部新手机却没有应用商店,用户连YouTube都装不了。GMS服务框架包含三个关键组件:
- GoogleServicesFramework:相当于系统与Google服务之间的翻译官
- Phonesky/Tubesky:Google Play商店的手机版和TV版
- PrebuiltGmsCorePano:Google服务的"心脏",提供账号同步、位置服务等基础功能
在Android 9.0(Pie)之后,Google对组件结构做了重要调整。原本集成在GmsCore里的AndroidPlatformServices和GoogleRestore被拆分成独立应用。这就像把超市的收银台和货架分开管理,虽然安装时麻烦点,但维护起来更灵活。
2. 选择合适的OpenGApps版本
去年给某厂商做系统集成时,我犯了个典型错误——直接用了手机版的GApps包,结果电视遥控器根本没法操作Play商店。OpenGApps官网(opengapps.org)提供了专门针对TV的版本,主要分两类:
TV专用版本对比表
| 版本类型 | 包含内容 | 体积 | 适用场景 |
|---|---|---|---|
| tv_stock | 完整Google TV应用套件 | 约500MB | 需要预装全套Google服务的商业设备 |
| tv_mini | 基础服务框架+核心TV应用 | 约180MB | 开发者测试或轻量级系统 |
我通常推荐从tv_mini开始,它包含:
- 必须的框架服务
- TV版Play商店(Tubesky)
- 基础应用如YouTube TV
有个坑要注意:解压后会发现Core和GApps两个目录。前者是必须集成的核心组件,后者像Chrome、Gmail这些完全可以不要——电视上谁会用触屏应用呢?
3. 源码集成实战步骤
最近给一个RK3399开发板做移植时,我整理出一套可靠的方法。首先把下载的zip包解压,关键文件都在Core目录下。集成到AOSP源码需要分两种情况处理:
3.1 非APK文件的处理
主要是权限配置文件,比如/etc/permissions下的xml。在device/yourvendor/yourdevice/gms.mk里添加:
PRODUCT_COPY_FILES += $(call find-copy-subdir-files,*, $(LOCAL_PATH)/gms/system,/system)这里有个血泪教训:别一股脑复制所有文件!曾经有次把手机版的config.xml拷进去,导致系统不断崩溃。建议先用diff工具对比原有文件,只添加TV专用的配置。
3.2 APK预置的注意事项
以预置TV版Play商店为例,在packages/apps/下新建Tubesky目录,Android.mk要这么写:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Tubesky LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := Tubesky.apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := PRESIGNED LOCAL_DEX_PREOPT := true LOCAL_PRIVILEGED_MODULE := true include $(BUILD_PREBUILT)特别注意这几点:
- LOCAL_CERTIFICATE必须用PRESIGNED(保持Google原签名)
- TV版应用要加LOCAL_PRIVILEGED_MODULE := true
- 务必开启DEX预编译(减少首次启动时间)
4. 设备认证与调试技巧
即使正确集成了GMS,第一次开机仍可能提示"设备未认证"。这是因为Google要验证设备合法性。通过adb可以获取关键信息:
adb shell 'sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";"'得到的16位数字就是GMS Android ID,需要提交到Google认证页面。不过TV设备有个特殊之处:如果厂商已经做过认证,在device.mk里会有类似配置:
BUILD_FINGERPRINT := Google/AndroidTV/device:9/PDI1.200302.001/6005512:user/release-keys这时直接检查系统属性即可:
adb shell getprop ro.build.fingerprint如果输出包含Google官方签名信息,恭喜你省去了认证步骤。否则就要联系厂商获取正确的fingerprint配置。
调试时我习惯用这个命令监控GMS服务状态:
adb logcat | grep -E 'Gms|Phonesky|Tubesky'曾经有个奇葩bug:Play商店能打开但搜索不到任何应用。最后发现是忘了集成Google Play Services的TV版(com.google.android.gms.pano)。这类问题通过日志都能快速定位。