Android 之 GMS 认证知多少?

2024-03-19 20:12
文章标签 android 认证 gms 知多少

本文主要是介绍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版本

adb版本查询

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

切换jdk版本

4、网络环境

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

5、安装python开发工具包

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

sudo apt-get install aapt

7、其他环境依赖

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测试检查结果

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

cts-tradefed

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

list-devices

设备连接OK,开始执行CTS

run-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认证的经验。

这篇关于Android 之 GMS 认证知多少?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827101

相关文章

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

Android多线程下载见解

通过for循环开启N个线程,这是多线程,但每次循环都new一个线程肯定很耗内存的。那可以改用线程池来。 就以我个人对多线程下载的理解是开启一个线程后: 1.通过HttpUrlConnection对象获取要下载文件的总长度 2.通过RandomAccessFile流对象在本地创建一个跟远程文件长度一样大小的空文件。 3.通过文件总长度/线程个数=得到每个线程大概要下载的量(线程块大小)。

时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位

NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。 NTP 实现什么目的?   目的很简单,就是为了提供准确时间。因为我们的手表、设备等,经常会时间跑着跑着就有误差,或快或慢的少几秒,时间长了甚至误差过分钟。 NTP 服务器列表 最常见、熟知的就是 www.pool.ntp.org/zo

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的

设置android返回键,保存和取得最高分

1.在.h中声明一些方法 virtual void keyBackClicked();           //Android返回键 bool isHaveSaveFile(); void getHighestHistoryScore(); 在.cpp中实现这个几个方法 void WelcomeLayer::keyBackClicked(