当前位置: 首页 > news >正文

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获取当前表格行

需求&#xff1a;验证表格同一行的最低限价不能超过销售定价 思路&#xff1a;先获取当前行table的index&#xff0c;然后在做大小比较 1.局部html <el-table-column label"销售定价(元)" min-width"200px"><template slot"header"&…...

html做一个分组散点图图的软件

在HTML中创建一个分组散点图&#xff0c;可以结合JavaScript库如D3.js或Plotly.js来实现。这些库提供了强大的数据可视化功能&#xff0c;易于集成和使用。下面是一个使用Plotly.js创建分组散点图的示例&#xff1a; 要添加文件上传功能&#xff0c;可以让用户上传包含数据的文…...

【SQL】UNION 与 UNION ALL 的区别

在 SQL 中&#xff0c;UNION 和 UNION ALL 都用于将两个或多个结果集合并为一个结果集&#xff0c;但它们在处理重复数据方面有显著区别。以下是它们的详细区别&#xff1a; 1. UNION UNION 操作符用于合并两个或多个 SELECT 语句的结果集&#xff0c;并自动去除结果集中重复…...

分类判决界面---W-H、H-K算法

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学习笔记&#…...

Python基础教程(三十):math模块

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

你只是重新发现了一些东西

指北君关于另外一条思维路径的发现。 "自以为是"的顿悟时刻 有很多时候&#xff0c;我会"自以为是"的发现/发明一些东西。这种"自以为是"的时刻通常还带有一些骄傲自豪的情绪。这种感觉特别像古希腊博学家阿基米德 在苦思冥想如何测量不规则物体…...

【英伟达GPU的挑战者】Groq—AI大模型推理的革命者

目录 引言第一部分&#xff1a;Groq简介第二部分&#xff1a;Groq的特点与优势1、高性能推理加速2、近存计算技术3、专用ASIC芯片设计4、低延迟与高吞吐量5、成本效益分析6、易用性与集成性7、软件与硬件的协同设计 第三部分&#xff1a;Groq的使用指南1、准备工作2、简单使用样…...

Python学习路线

Python学习路线 领取资料 一、Python基础知识 Python入门&#xff1a;了解Python的安装方法、如何运行Python程序以及交互模式的使用&#xff0c;同时学习注释的添加方法。 数据类型&#xff1a;掌握Python中的各种数据类型&#xff0c;包括数字、布尔值、字符串、列表、元…...

C++ std::forward()

在线调试网站&#xff1a; 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) 从第一个元素开始&#xff0c;该元素可以认为已经被排序&#xff1b;取出下一个元素&#xff0c;在已经排序的元素序列中从后向前扫描&#xff1b;如果该元素&#xff08;已排序&#xff09;大于新元素&#xff0c;将该元素移到…...

go语言day2

使用cmd 中的 go install &#xff1b; go build 命令出现 go cannot find main module 错误怎么解决&#xff1f; go学习-问题记录(开发环境)go: cannot find main module&#xff1b; 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 序列类型方法

一、初识序列类型方法 序列类型的概念&#xff1a;数据的集合&#xff0c;在序列类型里面可以存放任意的数据&#xff0c;也可以对数据进行更方便的操作&#xff0c;这个操作是叫增删改查(crud) ( 增加(Creat)&#xff0c;读取查询(Retrieve)&#xff0c;更新(Update)&#xf…...

用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…...

2026本地视频怎么去水印?5款免费去水印软件对比和实用方法指南

很多人都遇到过这个问题&#xff1a;辛辛苦苦保存下来的视频、素材库里的片段&#xff0c;上面都贴了水印&#xff0c;想要二次编辑或重新发布时&#xff0c;这些水印就成了"眼中钉"。本地视频怎么去水印&#xff1f;2026年有哪些靠谱的免费去水印方法&#xff1f;今…...

基于BLE MIDI的智能木琴:用Arduino与电磁铁桥接物理乐器与数字音频工作站

1. 项目概述&#xff1a;当传统木琴遇见现代数字音乐如果你和我一样&#xff0c;既着迷于传统打击乐器那清脆、富有共鸣的物理音色&#xff0c;又离不开现代数字音频工作站&#xff08;DAW&#xff09;那强大的创作和编辑能力&#xff0c;那么“如何将两者无缝桥接”可能一直是…...

出库篇:仓库里的货往哪去?——WMS出库方式全解析,物流新人必读

仓库里的货往哪去&#xff1f;——WMS出库方式全解析&#xff0c;物流新人必读 摘要&#xff1a;货品有进必有出。上一期我们聊了WMS中货品的四大来源&#xff08;采购、生产、退货、调拨入库&#xff09;&#xff0c;这一期我们来看看货品是怎么“出”去的——销售出库、采购退…...

雷达接收机频谱稳定与纯度:核心指标、测试方法与设计实战

1. 项目概述&#xff1a;为什么频谱稳定性和纯度是雷达的“生命线”&#xff1f; 在雷达系统里&#xff0c;我们常把发射功率、天线增益、接收机灵敏度这些指标挂在嘴边&#xff0c;因为它们直接决定了雷达能“看”多远。但今天要聊的“接收机频谱稳定性和纯度”&#xff0c;就…...

MobaXterm实战:一站式打通串口调试与远程SSH管理

1. 为什么选择MobaXterm作为全能终端工具 第一次接触嵌入式开发时&#xff0c;我被各种终端工具搞得晕头转向——串口调试要用SecureCRT&#xff0c;SSH连接得开PuTTY&#xff0c;文件传输还得额外装WinSCP。直到同事推荐了MobaXterm&#xff0c;这个法国开发者打造的免费工具彻…...

Windows风扇控制终极指南:Fan Control让你的电脑更静音更高效

Windows风扇控制终极指南&#xff1a;Fan Control让你的电脑更静音更高效 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tren…...

反激变压器优化设计实战:从磁芯选型到绕制工艺的工程指南

1. 项目概述&#xff1a;为什么反激变压器设计是开关电源的“心脏手术”&#xff1f; 在开关电源的世界里&#xff0c;反激拓扑&#xff08;Flyback&#xff09;就像一位“全能型选手”&#xff0c;从手机充电器到家电辅助电源&#xff0c;再到工业控制模块&#xff0c;几乎无处…...

嵌入式Linux嵌入式Linux驱动开发:板级DTS实操与完整实战演练——从修改设备树到点亮LED的完整闭环

嵌入式Linux嵌入式Linux驱动开发&#xff1a;板级DTS实操与完整实战演练——从修改设备树到点亮LED的完整闭环 仓库已经开源&#xff01;所有教程&#xff0c;主线内核移植&#xff0c;跑新版本imx-linux/uboot都在这里&#xff0c;或者一起来尝试跑7.0的Linux&#xff01;欢迎…...

MASA全家桶汉化包完整教程:让Minecraft模组界面彻底中文化

MASA全家桶汉化包完整教程&#xff1a;让Minecraft模组界面彻底中文化 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为MASA模组复杂的英文界面而烦恼吗&#xff1f;作为中文Minec…...

APK Installer终极指南:Windows平台Android应用部署完全手册

APK Installer终极指南&#xff1a;Windows平台Android应用部署完全手册 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在跨平台应用生态日益融合的今天&#xff0c;开…...