Android 之 GMS 认证知多少?

GMS认证

1.什么是GMS

GMS全称Google Mobile Service,谷歌移动服务。

为什么要通过GMS认证

Android 系统是开源的,但是 Google 针对GMS所提供的服务却是收费的,比如Google Map,Google Play,Youtube,Gmail,Chrome等,厂商必须通过GMS认证,取得授权,才能使用这些服务。而我国是禁止使用Google服务的,因此,GMS认证只有针对海外客户才需要,国内是不存在GMS认证的。

国内手机厂商之所以不使用鸿蒙系统,很大一部分原因跟GMS有关。如果采用鸿蒙系统,那么手机就不存在GMS服务,这对米OV的海外市场将是毁灭性的打击。

2.GMS认证协议

针对不同的产品,Google会有三种认证协议

  • MADA:Mobile Application Distribution Agreement,针对手机平板移动设备,屏幕尺寸在3.3~18英寸之间,且必须带电池;
  • EDLA:Enterprise Device Licensing Agreeement,MADA协议的补充,设备可以不带电池,且屏幕尺寸最大可以到70英寸,也就是说,设备不带电池或者屏幕大于18英寸的,必须使用EDLA协议;
  • GAS:Google Automotive Services,车机设备申请GMS认证所需要的协议,目前使用较少,很多3PL都不做GAS认证,关于3PL,下文会说明;

3.GMS认证流程

  • 首先产品要符合GMS-CDD(Compatibility Definition Document)的要求;

  • 填写申请表,针对不同的产品,向Google申请对应的认证协议;

  • 取得协议授权,准备样机测试;

  • 产品做软硬件测试;

  • 提交测试报告给Google审核;

  • 获得Google认证授权;

在国内,有一帮专门搞GMS认证的代理机构,他们是Google授权的第三方实验室,俗称3PL(Third-Party-License),如果你想省事儿,可以花钱找他们帮你搞定。

4.GMS注意事项

  • 认证版本:MADA协议分四个版本:欧盟、土耳其、俄罗斯、其他地区(亚洲美洲)。EDLA协议分两个版本:俄罗斯和其他地区;

  • Android版本要求:截止到2023年9月,MADA的最低要求为Android13,EDLA是Android12;

  • 窗口期:GMS认证在每年都设有窗口期,必须在窗口期内完成认证,否则只能再等一年了。截止到2023年09月,Android12的认证截止时间为2024年1月31日,过了这个时间,Android12的设备就做不了GMS认证了;

  • 认证周期:GMS认证的平均周期为8-12周;

  • 认证费用:3-4万美金,MADA比EDLA要便宜一点;

  • 维护:认证通过后,MADA不需要维护,除非收到Google通知。EDLA必须打补丁(SMR),并可能升级大版本(LR);

5.GMS测试环境搭建

在上述GMS认证流程的六个步骤中,本文主要介绍第四步,如何进行软硬件测试。

首先是搭建测试环境:

1、准备一台装有Ubuntu系统的电脑,至少是18.04版本

2、配置adb,至少是1.0.41版本

3、配置多版本jdk,GMS测试会因为Android版本的不同,导致测试期间JDK的版本也不同。所以,我们本地一般会配置三个版本的JDK(8、9、11),再结合切换命令,随时切换

4、网络环境

测试期间,电脑和测试设备都要能够正常访问Google服务器。

5、安装python开发工具包

bash 复制代码
sudo apt-get install python-dev sudo apt-get install python-protobuf sudo apt-get install protobuf-compiler sudo apt-get install python-virtualenv sudo apt-get install python-pip

6、安装AAPT

bash 复制代码
sudo apt-get install aapt

7、其他环境依赖

bash 复制代码
pip install virtualenv & pip install future & pip install futures & pip install enum & pip install concurrent & pip install protobuf & pip install setuptools & pip install requests & pip install httplib2 & pip install google-api-python-client & pip install google-cloud-pubsub

8、手机设置

  • 打开开发者选项,并打开"USB Debugging"
  • 打开开发者选项中的"Stay awake"(屏幕常亮)
  • Display 中设置休眠时间为"30min"(最大的休眠时间)
  • Security 中设置锁屏方式为"None"
  • 打开 WIFI,并连接翻墙网
  • 打开蓝牙和 Location
  • 测试期间,可能会要求更改时区(视情况而定)
  • 插入SDCard,SIM卡,白卡

6.GMS测试套件

GMS认证包含一下几项测试

  • CTS:Compatibility Test Suite,兼容性测试套件,设备需要通过 Android 的兼容性测试,以确保在 Android 上开发的应用程序在手机设备上都能正常运行,包括API和非API系统行为;
  • VTS:Vendor Test Suite,供应商测试套件,确保Vendor层实现的前向兼容性。在Android 8.0,Google推出了Project Treble计划,主要为厂商节省Android版本的的适配工作,其思路就是将原生(Android Framework)代码和厂商适配(Vendor Implementation,主要指hal)代码分离,Android新版本出来后,厂商只需要对Android Framework代码适配即可,无需更改Vendor Implementation代码,这就要求同一Vendor Hal要适配Android各个版本,同时,同一Android Framework版本要兼容多个Vendor Hal,因此就有了VTS;
  • CTS-ON-GSI:Compatibility Test Suite On Google System Image,在 Android 原生镜像上的兼容性测试,主要针对硬件测试;
  • CTS-VERIFIER:CTS的一部分,需手动进行,主要用于测试自动测试系统无法测试的功能;
  • GTS:Google Mobile Services Test Suite,谷歌移动服务测试套件,该测试需要连接到 Google 服务器,并进行媒体流的下载与播放,其主要内容是 widevine(数字版权相关)功能的测试;
  • STS:Security Test Suite,安全测试套件,谷歌关于Android安全补丁安装情况的一个测试套件,用于测试Security patch;
  • CTS-INSTANT:测试Instant app兼容性;
  • BTS:Build Test Suite,编译测试套件,提供 Image 给 Google,他会扫描 Image 中是否有预装恶意软件或潜在有害的应用程序(PHA);

7.测试套件获取

CTS可直接在官方网站下载:source.android.google.cn/compatibili...

其他测试套件必须登录Google网站获取,或者从3PL获取,注意,只有拥有谷歌协议用户账号才能从官网下载测试包,测试包具有有效期,必须在有效期内完成测试。

8.测试流程

以CTS为例:

1、 用户从官网下载CTS

2、 搭建CTS测试环境

3、 将设备连接到PC

4、 运行CTS。CTS会陆续将相应测试用例(即一个APK文件)传送到设备上,并通过instrumentation运行,然后记录运行结果,最后删除测试用例。所有的测试用例执行完毕后,可以参照测试结果重新调整或优化系统。建议再次运行CTS测试检查结果

9.测试用例

以CTS为例,CTS主要包含以下三种类型测试:

  • 单元级:测试Android平台上的代码单元。比如,一个java.util.HashMap类;

  • 功能级:测试多个API组合而成一个高级功能;

  • 程序级:通过运行一个简单的APP来测试一个API集合功能和Android运行时的服务;

CTS测试项数目总数约9.5万,Android13甚至达到惊人的260万。主要包含两个组件:一是运行在PC上的测试框架组件,主要用来管理测试用例的执行;二是运行在设备或模拟器上的测试用例,这些用例是用Java写成的APK文件。

10.测试范围

目前,为了确保设备产品兼容,测试用例覆盖了以下范围:

  • Signature:测试Android产品XML文件中描述的API,检测这些API是否被系统支持;
  • Platform:测试SDK文档中描述的平台API,比如core libraries和Android Application Framework等。要求提供API分类、属性、签名、方法行为、错误参数处理方式等信息;
  • Dalvik VM:专门针对Dalvik VM的测试;
  • Platform Data Model:测试平台通过ContentProvider提供给用户使用的数据,比如:Contacts、Browser、Settings等;
  • Platform Intents:测试平台提供的用于核心功能的Intent;
  • Platform permission:测试平台提供的一些重要APP权限;
  • Platform Resources:测试simple values、drawables、nine-patch、animations、layouts、styles and themes、loading alternate resources等;

11.测试命令

测试命令:

命令 说明
run cts 执行CTS测试
run cts-on-gsi 执行GSI测试
run gts 执行GTS测试
run sts-engbuild 执行STS测试
run vts 执行VTS测试
run cts-instant 执行INSTANT,Android 10版本已经合入到CTS测试中

控制台命令:

命令 说明
list devices 查看已连接的设备的状态
list results 查看测试的所有结果
list invocations 查看当前测试的执行状态
list modules 查看当前有效的测试模块
run cts --subplan sub-cts 执行当前cts的子计划测试

12开始测试

以CTS为例,一切准备就绪后,进入CTS所在的目录,执行./cts-tradefed

出现上述截图内容说明测试环境已经OK,此时可以执行list devices查看连接设备

设备连接OK,开始执行CTS

测试过程中设备不停的跳动和重启,这是正常现象,期间可能需要手动设置的,需要隔段时间观察一下。此过程需要很长时间,毕竟CTS测试项有上万条,一台设备要全部跑完,大概需要十天,因此,实际会用多台(一般3台)设备同时跑,每个设备跑的测试项不同,这样能大大减少测试时间。测试是全自动的,测试期间尽量不要操作主机和测试设备。

13.获取测试报告

等待测试跑完,测试报告自动生成在工具所在的根目录,命名格式为开始执行测试的日期和时间

打开test_result.html文件,即可查看测试结果,该文件较大,性能不好的pc可能会报oom

可以看到Android13的CTS测试项目总共有266万多条,并且下面展示了每一个module的测试结果,点击module可以查看该module所有的测试项。其中大部分都pass了,只有337条失败了,失败项可在test_result_failures_suits.html文件中查看,里面会显示测试项名称和错误原因

14.测试问题分析方法

新手对于GMS测试问题是一脸懵逼的,它不像一般的开发问题,具体给你报哪个文件哪一行的错误,但我们可以反向思考问题的解决方法,就是探索GMS认证测试的基本逻辑,了解测试pass的条件,然后想办法去满足条件。上面说过,测试套件就是一些apk工具,那么我们可以借助反编译工具(推荐jadx),查看工具的源码,结合测试Log,分析问题原因。

当然老司机一般都会总结各种fail项对应的解决方案,新手完全可以站在巨人的肩膀上解决问题。实在找不到解决方案的,就向厂商提工单吧。

总结

GMS认证是一项大工程,需要花费大量的人力(至少3人负责)、物力(标配:3台设备+3台主机)、财力(20万RMB左右)、时间(周期最低2个月),不建议新手去接手这件差事,最好是有老司机全程带着搞一遍。测试期间很轻松,基本不需要干啥,都是全自动化的,但是测试结束就有得忙了,随随便便成千上万个fail项就让人头皮发麻,所以,这个烫手山芋很多人都难以下咽,但作为一个合格的framework开发者,很有公司都要求有GMS认证的经验。

相关推荐
此去正年少11 分钟前
编写adb脚本工具对Android设备上的闪退问题进行监控分析
android·adb·logcat·ndk·日志监控
落羽凉笙31 分钟前
Python基础(4)| 玩转循环结构:for、while与嵌套循环全解析(附源码)
android·开发语言·python
十幺卜入1 小时前
Unity3d C# 基于安卓真机调试日志抓取拓展包(Android Logcat)
android·c#·unity 安卓调试·unity 安卓模拟·unity排查问题
frontend_frank1 小时前
脱离 Electron autoUpdater:uni-app跨端更新:Windows+Android统一实现方案
android·前端·javascript·electron·uni-app
薛晓刚2 小时前
MySQL的replace使用分析
android·adb
DengDongQi2 小时前
Jetpack Compose 滚轮选择器
android
stevenzqzq2 小时前
Android Studio Logcat 基础认知
android·ide·android studio·日志
代码不停2 小时前
MySQL事务
android·数据库·mysql
朝花不迟暮2 小时前
使用Android Studio生成apk,卡在Running Gradle task ‘assembleDebug...解决方法
android·ide·android studio
yngsqq2 小时前
使用VS(.NET MAUI)开发第一个安卓APP
android·.net