Android CTS环境搭建
CTS即Compatibility Test Suite意为兼容性测试,是Google推出的Android平台兼容性测试机制。其目的是尽早发现不兼容性,并确保软件在整个开发过程中保持兼容性。只有通过CTS认证的设备才能合法的安装并使用Google market等Google应用。
搭建CTS测试环境需满足如下要求:
-
主机设置
CTS支持64位Linux计算机,Windows或MacOS不支持CTS。
适用于Ubuntu的Java开发工具包。
确保已安装最新版本的adb和aapt2,并将该工具的位置添加到计算机系统路径中。
Python3支持的设置如virtualenv。
网络环境-外网&代理配置。 -
Android设备设置
主固件及外设等物理要求
开机向导和设置
其它Google要求 -
CTS测试工具
Linux命令行工具,至少连接一台被测设备。
主机设置
1、Linux环境:个人使用Ubuntu 24.04 LTS系统版本。
2、JDK环境: Ubuntu 24.04提供了两个主要的Java选项(OpenJDK & Oracle JDK),我们使用apt安装OpenJDK。
# 更新软件源
sudo apt update
# 查找openjdk
sudo apt search openjdk
# 安装openjdk 11(用于cts)
sudo apt install openjdk-11-jdk
# 安装openjdk 21(用于sdkmanager)
sudo apt install openjdk-21-jdk
# 检查java是否安装成功
java -version
javac -version
# 更换版本,注意javac也同步更换,保持一致
sudo update-alternatives --config java
sudo update-alternatives --config javac
配置java环境变量
# 进入该文件进行编辑
vim .bashrc# 在文件最后添加以下内容
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export CLASSPATH=.:%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin# wq保存后让新增的环境变量生效
source .bashrc
3、SDK环境
配置参考:https://stackoverflow.com/questions/34556884/how-to-install-android-sdk-on-ubuntu
sdkmanager是一个命令行工具,可以用它来查看、安装、更新和卸载Android SDK的软件包。如果使用Android Studio,则无需使用此工具。
Android SDK下载路径:https://developer.android.google.cn/studio?hl=zh-cn

- 解压commandlinetools-linux-11076708_latest.zip,在解压目录/cmdline-tools/bin目录下运行./sdkmanager --list,此时遇到一个错误1:
Error: LinkageError occurred while loading main class com.android.sdklib.tool.sdkmanager.SdkManagerCli
java.lang.UnsupportedClassVersionError: com/android/sdklib/tool/sdkmanager/SdkManagerCli has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
说明JDK的环境和Class编译版本号不匹配,需要升级。
可以选择一个commandlinetools的历史版本比如:https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip
也可以升级JDK:通过JDK version和class file version(Class编译版本号)对应关系,可以查询到版本至少为JDK 17。我们安装当前最新的OpenJDK 21即可。
- 错误1解决之后再次输入sdkmanager相关命令,此时遇到了报错2:
Error: Could not determine SDK root.
Error: Either specify it explicitly with --sdk_root= or move this package into its expected location: /cmdline-tools/latest/
提示很明显,需要把commandline-tools文件夹下的内容放在lastet文件夹下,多了一个latest层级目录。
# 在/usr/lib/android-sdk/cmdline-tools目录下执行
mkdir latest
mv bin/ lib/ NOTICE.txt source.properties -t latest/
以上sdkmanager命令问题解决后,就可以安装相应的sdk tools了。
- 安装最新的平台工具以及适用于API级别33的SDK工具:
./sdkmanager "platform-tools" "platforms;android-33" "build-tools;33.0.3"
sdkmanager如何使用请参考文档:https://developer.android.google.cn/tools/sdkmanager?hl=zh-cn
安装完再查看对应的目录是否生成相关文件夹,然后配置SDK环境变量。
***@ist-ubuntu:/usr/lib/android-sdk$ ls
build-tools cmdline-tools licenses platforms platform-tools
export ANDROID_HOME=/usr/lib/android-sdk
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
export PATH=$PATH:$ANDROID_HOME/build-tools/33.0.3
export PATH=$PATH:$ANDROID_HOME/platform-tools
最后敲下adb verison和aapt2 -h检查下是否有输出,确保adb和aapt2位于系统路径中。
4、Python环境
# 检查系统是否安装python3
python3 --version
# Python虚拟环境相关工具
sudo apt install virtualenv
# virtualenv是否安装成功
virtualenv -h
5、网络环境
确保PC设备和Android设备均处于外网环境中,并设置JAVA_TOOL_OPTIONS使用代理。
export JAVA_TOOL_OPTIONS='-Djava.net.useSystemProxies=true'
Android设备设置
1、主固件及外设:升级主固件(测CTS使用user版本固件,测STS使用userdebug版本固件),需要的外设都接上。
2、开机向导和设置
①开机向导按默认的选项,能跳过的都跳过,不要登录Google账号,不要设置锁屏密码,不要进入子用户。
②语言切到英语,时区选择美国纽约;
③Settings->Wi-Fi,电脑和设备连接同一个外网WiFi;
④Settings->Security->Screenlock选择None;
⑤如果产品(如laptop类产品)带物理键盘,Languages & input->Physical keyboard->Show virtual keyboard,勾选该选项;
⑥连续点击Settings->About tablet(phone)->Build Number,使被隐藏的Developer Options显示出来;Setting->Developer Options-USB debugging开关打开;
⑦ Settings->Developeroptions->Stayawake,勾选该选项;
⑧ Settings->Location打开定位服务(默认是打开的,不要关闭);
⑨Settings->Display->Sleep设置成最长时间,将亮度调节到最暗(测试时间较长,以节省电量);
2、Google要求
- 跑CTS之前需要锁定设备
# 查询值orange是未锁定,green是锁定。
adb shell getprop | grep verified

- 烧录谷歌keyattestation key
# 查询是否烧录谷歌key
adb shell getprop ro.boot.deviceid
# 确认product名称
adb shell getprop | grep -i fingerprint
CTS测试工具
CTS是一款通过命令行操作的工具。目前CTS没有提供windows版本,只能在Linux下测试。
如针对Android 13的DUT,可下载这个【Android 13 R8 兼容性测试套件 (CTS) - ARM】
下载地址:https://source.android.google.cn/docs/compatibility/cts/downloads?hl=zh-cn
注:不得重命名下载的解压后的文件夹。例如,android-cts-*.zip内的android-cts必须保持相同的名称才能正常运行。
- adb至少连接一个被测设备。然后从解压缩CTS软件包中启动CTS控制台cts-tradefed脚本:
./android-cts/tools/cts-tradefed
# 查看测试模块列表
cts-tf > list modules
# 测试其中的一个指定模块
cts-tf > run cts -m CtsWindowManagerDeviceTestCases

- CTS测试结果解读请参考文档:https://source.android.google.cn/docs/compatibility/cts/interpret?hl=zh-cn

相关文章:
Android CTS环境搭建
CTS即Compatibility Test Suite意为兼容性测试,是Google推出的Android平台兼容性测试机制。其目的是尽早发现不兼容性,并确保软件在整个开发过程中保持兼容性。只有通过CTS认证的设备才能合法的安装并使用Google market等Google应用。 搭建CTS测试环境需…...
比较Zig、Rust和C++
比较Zig、Rust和C这三种编程语言,我们可以从以下几个关键维度来进行: 设计理念 表格 语言 设计理念 Zig 简洁性、模块化、避免常见错误 Rust 内存安全、并发性、性能 C 性能优化、资源控制、可扩展性 内存安全 Zig通过严格的编译时检查、可选…...
路由的params参数,命名路由,路由的params参数,命名路由
上篇我们讲了vue路由的使用 今天我们来讲vue中路由的嵌套,路由的params参数,命名路由 一.路由的params参数 1.配置路由规则,使用children配置项: router:[{path:/about,component:About,},{path:component:Home,//通过children配置子路由c…...
java:CompletableFuture的简单例子
java:CompletableFuture的简单例子 package com.chz.myTest;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutionException; import java.uti…...
element的table获取当前表格行
需求:验证表格同一行的最低限价不能超过销售定价 思路:先获取当前行table的index,然后在做大小比较 1.局部html <el-table-column label"销售定价(元)" min-width"200px"><template slot"header"&…...
html做一个分组散点图图的软件
在HTML中创建一个分组散点图,可以结合JavaScript库如D3.js或Plotly.js来实现。这些库提供了强大的数据可视化功能,易于集成和使用。下面是一个使用Plotly.js创建分组散点图的示例: 要添加文件上传功能,可以让用户上传包含数据的文…...
【SQL】UNION 与 UNION ALL 的区别
在 SQL 中,UNION 和 UNION ALL 都用于将两个或多个结果集合并为一个结果集,但它们在处理重复数据方面有显著区别。以下是它们的详细区别: 1. UNION UNION 操作符用于合并两个或多个 SELECT 语句的结果集,并自动去除结果集中重复…...
分类判决界面---W-H、H-K算法
本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记&#…...
Python基础教程(三十):math模块
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...
你只是重新发现了一些东西
指北君关于另外一条思维路径的发现。 "自以为是"的顿悟时刻 有很多时候,我会"自以为是"的发现/发明一些东西。这种"自以为是"的时刻通常还带有一些骄傲自豪的情绪。这种感觉特别像古希腊博学家阿基米德 在苦思冥想如何测量不规则物体…...
【英伟达GPU的挑战者】Groq—AI大模型推理的革命者
目录 引言第一部分:Groq简介第二部分:Groq的特点与优势1、高性能推理加速2、近存计算技术3、专用ASIC芯片设计4、低延迟与高吞吐量5、成本效益分析6、易用性与集成性7、软件与硬件的协同设计 第三部分:Groq的使用指南1、准备工作2、简单使用样…...
Python学习路线
Python学习路线 领取资料 一、Python基础知识 Python入门:了解Python的安装方法、如何运行Python程序以及交互模式的使用,同时学习注释的添加方法。 数据类型:掌握Python中的各种数据类型,包括数字、布尔值、字符串、列表、元…...
C++ std::forward()
在线调试网站: https://wandbox.org/ #include <iostream> #include <thread> #include <mutex> void func(int &&args) {std::cout << args << std::endl; }int main () {int a 10;func(20); …...
常见的8种排序(含代码):插入排序、冒泡排序、希尔排序、快速排序、简单选择排序、归并排序、堆排序、基数排序
时间复杂度O(n^2) 1、插入排序 (Insertion Sort) 从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到…...
go语言day2
使用cmd 中的 go install ; go build 命令出现 go cannot find main module 错误怎么解决? go学习-问题记录(开发环境)go: cannot find main module; see ‘go help modules‘_go: no flags specified (see go help mod edit)-CSDN博客 在本…...
vue echarts画多柱状图+多折线图
<!--多柱状图折线图--> <div class"echarts-box" id"multiBarPlusLine"></div>import * as echarts from echarts;mounted() {this.getMultiBarPlusLine() },getMultiBarPlusLine() {const container document.getElementById(multiBar…...
cesium for unity 打包webgl失败,提示不支持
platform webgl is not supported with HDRP use the Vulkan graphics AR instead....
python开发基础——day7 序列类型方法
一、初识序列类型方法 序列类型的概念:数据的集合,在序列类型里面可以存放任意的数据,也可以对数据进行更方便的操作,这个操作是叫增删改查(crud) ( 增加(Creat),读取查询(Retrieve),更新(Update)…...
用java写一个二叉树翻转
class TreeNode {int val;TreeNode left, right;TreeNode(int val) {this.val val;left right null;} }public class BinaryTree {TreeNode root;// 递归翻转二叉树public TreeNode invertTree(TreeNode root) {if (root null) {return null;}// 递归翻转左子树和右子树Tre…...
数学建模系列(3/4):典型建模方法
目录 引言 1. 回归分析 1.1 线性回归 基本概念 Matlab实现 1.2 多元回归 基本概念 Matlab实现 1.3 非线性回归 基本概念 Matlab实现 2. 时间序列分析 2.1 时间序列的基本概念 2.2 移动平均 基本概念 Matlab实现 2.3 指数平滑 基本概念 Matlab实现 2.4 ARIM…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
