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…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
