【Android源码 栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了Android源码 -android CTS 分析 - 操作系统的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
CTS Study 1. CTS简介 CTS 全称Compatibility Test Suite兼容性测试工具。
当电子产品开发出来并定制了自己的Android系统后必须要通过最新的CTS检测以保证标准的android application能运行在该平台下。
通过了CTS验证需要将测试报告提交给Google已取得android market的认证。
CTS是一款通过命令行操作的工具。
目前cts没有提供windows版本只能在Linux下测试。
在我们实际使用CTS的过程中很可能需要根据特定的要求来定制自己的Test Plan。
这时就需要自己编译CTS因此本文主要向大家介绍如何编译CTS及使用编译出的CTS工具。
至于从android官网上取得的CTS其使用方式与我们自己编译的工具类似本文只做简单介绍。
2.获取CTS工具 假定Developer之前已经搭建好linux环境。
以下操作均在linux下进行。
由于google的原因Android 2.3 Gingerbread中的CTS是不完整的所以我们选择Android2.2 Froyo的CTS作为本文的研究对象。
以下附上Google的回复 Theoretically CTS for Gingerbread should be built the same way as for Froyo. However and this is important please note that the CTS version thats currently in the gingerbread branch is incomplete. Were working on that but the long holiday breaks have made progress slower than usual. http://groups.google.com/group/android-building/browse_thread/thread/53de18db6af17513 从回复中看 Gingerbread中CTS的编译过程和Froyo是一样的命令使用方法是一样的。
我猜测有可能在Gingerbread中加入了一些新的测试毕竟android对硬件的要求是越来越高了从CDD可以看出。
2.1 下载编译源码获取CTS工具 2.1.1 下载 git下载的
android源码里包含cts位置在/cts目录下android2.1以后版本 如果没有也可以从此处下载git://android.git.kernel.org/platform/cts.git源码70M左右 2.1.2 64bit System步骤 我们一般配置的是32bit系统没有对64bit system 操作CTS做详细研究仅仅从网上摘抄CTS工具编译步骤。
64 bit System 在Linux下进入
android源码根目录输入以下命令 build/envsetup.sh make cts 此时生成测试计划测试包测试用例和测试报告生成的目录 2.1.3 32bit System步骤 32 bit System 修改默认的Java环境 sudo apt-get install sun-java6-jdk sudo update-java-alternatives -s java-6-sun 修改以下文件 externalclearsilverjava-jniAndroid.mk externalclearsilvercgiAndroid.mk externalclearsilvercsAndroid.mk externalclearsilverutilAndroid.mk 将m64改为m32 buildcoremain.mk 将64 改为 i686 /build/core/tasts/cts.mk /out/host/linux/cts/android-cts/tools/startcts /development/testrunner/test_defs/host_test.py /cts/tools/utils/startcts 将DDMS_LIB ddmlib.jar 改为 DDMS_LIB ddmlib-prebuilt.jar 或者编译完成后在outhostlinux-x86framework目录下输入linux命令 cp ddmlib-prebuilt.jar ddmlib.jar 这样比较方便。
方法比较多只要保证让脚本找到所需的jar文件。
编译 在Linux下进入
android源码根目录输入以下命令 chmod 777 build/envsetup.sh build/envsetup.sh make cts 此时生成测试计划测试包测试用例和测试报告生成的目录 编译好cts后生成的文件位置如下 mydroid/out/host/linux-x86/ 在该目录下包含如下测试文件 Package CTS : out/host/linux-x86/cts/android-cts.zip cts make file : mydroid/build/core/tasks/cts.mk run cts program : mydroid/out/host/linux-x86/bin/cts test plans : mydroid/out/host/linux-x86/cts/android-cts/repository/plans test packages : mydroid/out/host/linux-x86/cts/android-cts/repository/testcases test results : mydroid/out/host/linux-x86/cts/android-cts/repository/results CTS program settings value : mydroid/cts/tools/utils/host_config.xml 配置Framework环境变量 export ANDROID_ROOT/MyAndroid/out/host/linux-x86 2.2 下载gongle发布的CTS工具 点击Android 2.2 R4 Compatibility Test Suite CTS 下载CTS工具 现在Google最新发布的CTS工具是android 2.2 froyo本版的以后可以针对需要下载对应的CTS版本。
3.使用 3.1 修改环境变量 3.1.1编译的CTS CTS 和android SDK工具目录如下 /out/host/linux-x86/bin /android-sdk-linux_86/platform-tools /android-sdk-linux_86/tools 将CTS工具路径和android SDK 工具路径加入环境变量在linux下输入以下命令 env 查阅原有环境变量其中环境变量PATH的值为 PATH/home/hanqigcxy/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/hanqigcxy/bin: export PATH/home/hanqigcxy/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/hanqigcxy/bin:/home/hanqigcxy/android-source/out/host/linux-x86/bin:/home/hanqigcxy/android-sdk-linux_86/platform-tools:/home/hanqigcxy/android-sdk-linux_86/tools 将CTS和android SDK工具目录加入到环境变量中如上红色部分所示。
注意要求输入完整路径各路径以分号间隔。
3.1.2 Goole发布的CTS 如果使用的是Google发布的CTS工具路径为 CTS 和android SDK工具目录如下 /android-cts/tools /android-sdk-linux_86/platform-tools /android-sdk-linux_86/tools 将CTS工具路径和android SDK 工具路径加入环境变量在linux下输入以下命令 env 查阅原有环境变量其中环境变量PATH的值为 PATH/home/hanqigcxy/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/hanqigcxy/bin: export PATH/home/hanqigcxy/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/hanqigcxy/bin:/home/hanqigcxy/android-cts/tools:/home/hanqigcxy/android-sdk-linux_86/platform-tools:/home/hanqigcxy/android-sdk-linux_86/tools 将CTS和android SDK工具目录加入到环境变量中如上红色部分所示。
注意要求输入完整路径各路径以分号间隔。
进入/out/host/linux-x86/cts /android-cts/repository/tools目录下修改startcts脚本文件。
将脚本中的SDK_ROOT该成自己的 android SDK路径。
cd /home/hanqigcxy/Downloads/android-cts/tools vim startcts 修改脚本中出现的第一个SDK_ROOT如 quotSDK_ROOT /home/hanqigcxy/android-sdk-linux_86 quot。
注意启动CTS的时候应该输入startcts。
3.1.3 将环境变量写入系统 上面配置环境变量使用Linux命令 export 使用该命令设定的环境变量仅仅对当前的shell有效。
如果用户再开启一个shell那么需要再次设定环境变量。
这是使用export命令的局限。
但是最大的好处就是保证的系统的纯净每次操作仅仅对当前有效。
下面提供一种将环境变量写入配置文件的方法。
户用不必每次启动Shell后都要设定环境变量 Step1输入命令切换到root权限 su 输入password回车 Step2进入用户文件夹编辑.bashrc文件例如在ubuntu下我有一个用户hanqigcxy cd /home/hanqigcxy ls -al vim .bashrc 修改export PATHPATH:HOME/bin:为 export PATHPATH:HOME/bin: /home/hanqigcxy/android-source/out/host/linux-x86/bin: /home/hanqigcxy/android-sdk-linux_86/platform-tools: /home/hanqigcxy/android-sdk-linux_86/tools Step3启动系统 reboot –n 3.2 连接设备 3.2.1 模拟器测试 由于我们只需要用模拟器来模拟设备因此不必搭建完整的linux下android开发环境。
仅需要下载Android SDK并安装。
见以下步骤 安装Android SDK Step1点击下面链接进入下载页面 http://developer.android.com/sdk/index.html Step2点击android-sdk_r08-linux_86.tgz下载SDK Step3解压后文件目录 Step4添加环境变量在linux下输入以下命令 export Path …………./home/hanqigcxy/android-sdk-linux_86/tools 其中省略号代表环境变量Path原来的值对系统原有的环境变量不能删除仅仅在末尾加入一个新的换进变量路径即可。
/home/hanqigcxy/android-sdk-linux_86/tools为android-sdk-linux_86/tools目录的全称根据用户解压路径来定修改的值可通过右键------属性来查阅。
Step5输入以下命令开启android SDK and AVD Managerment android Step6设定代理 Step7选定需要安装的插件 创建AVD 启动模拟器 emulator -avd CTS 启动连接 再开启一个Shell输入以下命令 adb start-server cts 如果连接成功将显示一下提示 Android CTS version 2.2_r1 Deviceemulator-5554 connected cts_host gt cts_host gt 3.2.2 Device测试 网络资源加自己的推测需要设备做验证 在手机上安装CtsDelegatingAccessibilityService.apk sudo adb install -r ………………………………………………./out/host/linux-x86/cts/android-cts/repository/testcases/CtsD elegatingAccessibilityService.ap k 省略号代表CtsDelegatingAccessibilityService.ap k所需要的完整路径 设置手机 Settings-gtAccessibility-gt两个选项都选上Settings gt Application gt Development 三个选项都选上Settings gt Sound amp Display gt Screen Timeout should be set to quotNever Timeoutquot 修改脚本 export Path …………./home/hanqigcxy/android-sdk-linux_86/tools 其中省略号代表环境变量Path原来的值对系统原有的环境变量不能删除仅仅在末尾加入一个新的换进变量路径即可。
/home/hanqigcxy/android-sdk-linux_86/tools为android-sdk-linux_86/tools目录的全称根据用户解压路径来定修改的值可通过右键------属性来查阅。
启动连接 再开启一个Shell输入以下命令 adb start-server cts 如果连接成功将显示一下提示 Android CTS version 2.2_r1 Deviceemulator-5554 connected cts_host gt cts_host gt 题目1CTS 在手机上的测试步骤测试机 HTC G7 Step 1. 通过USB 连接手机和PC Step2. 调整HTC G7 USB的连接方式为 【HTC sync】使G7允许USB调试。
上述操作后自动弹出以下界面 Step3. 在Linux下输入以下命令 切换到root权限 hanqigcxyubuntu: sudo -s sudo password for hanqigcxy: rootubuntu: adb kill-server rootubuntu: adb devices 显示以下结果 Step4. 安装CtsDelegatingAccessibilityService rootubuntu: adb install -r /home/hanqigcxy/android-source/out/host/linux-x86/cts/android-cts/repository/testcases/CtsDelegatingAccessibilityService.apk 显示以下结果 Step5. 配置手机 可能根据不同的手机设定也会不一样例如网上的例子要求 Settings-gtAccessibility-gt两个选项都选上 Settings gt Application gt Development 三个选项都选上 Settings gt Sound amp Display gt Screen Timeout should be set to quotNever Timeoutquot HTC G7 的实际设定 在Step2.中 选择 【保持唤醒状态选项】 进入设置 gt 应用程序 gt 开发 把三个选项都选上 进入设置 gt 辅助功能 把两个选项都选上 总之不管什么设备需保证一下几点 1. 设备的默认连接为USB调式不能为USB充电或者USB磁盘驱动器 2.设定设备始终为唤醒状态 3.设定权限保证Host端操作无阻碍。
Step 开启CTS工具进行CTS测试 题目2 adb 如何知道设备被接入 adb usb - restarts the adbd daemon listening on USB 会有一个监听USB的daemon当设备通过USB介入后可以做判断。
connect lthostgt:ltportgt - connect to a device via TCP/IP 另外还有一通过TCP/IP的接入方法。
模拟器应该是采用此方法连接。
下图是我同时开启模拟器和 HTC G7后调用adb查看的设备列表 当一台PC机上连接有多个设备时例如多个android 手机CTS可以指定在特定的设备中运行但需要保证同一时间是有一个设备上在运行CTS 并且CTS内部也有单例模式。
保证一个Host端只能运行一个CTS。
题目3 CTS测试需要多少时间 Host Ubuntu 10.04虚拟机上运行 Client HTC G7 报错Log 信息如下也可见附件 CTS_DEBUG gtgtgt 1295313461352 mark mNeedRestartAdbServer to true CTS_DEBUG gtgtgt 1295313461353 Need restart ADB server CTS_INFO gtgtgt Max ADB operations reached. Restarting ADB... CTS_DEBUG gtgtgt 1295313461461 device HC09MPL00642 changed with changeMask4 CTS_DEBUG gtgtgt 1295313461461 Device state:ONLINE DeviceHC09MPL00642 connected CTS_DEBUG gtgtgt 1295313461617 device HC09MPL00642 changed with changeMask2 CTS_DEBUG gtgtgt 1295313461621 Device state:ONLINE CTS_INFO gtgtgt Restarting device ... TS_INFO gtgtgt Restarting device ... CTS_DEBUG gtgtgt 1295315511400 executeCommand: cmdadb -s HC09MPL00642 reboot CTS_DEBUG gtgtgt 1295315528900 device HC09MPL00642 changed with changeMask2 CTS_DEBUG gtgtgt 1295315528902 Device state:ONLINE DeviceHC09MPL00642 disconnected 分析 错误出现在ADB 操作超过了最大限制必须重启ADB 之后手机自动重启重新启动后CTS测试失败。
尝试修改CTS 的配置文件 host_config.xml中的参数 lt-- Number of tests executed between reboots. A value lt 0 disables reboots. --gt ltIntValue namequotmaxTestCountquot valuequot-1quot/gt 防止手机重启。
结果失败 网上的解答是USB驱动出现问题要完成测试需要做修改我判断是HTC修改了USB驱动限制了通过USB进行调试。
过多的adb命令将到时重启 我分析不像是这个原因有个能是厂商对USB调式做了限制或者是adb内部有问题下面用模拟器验证一下 用模拟器进行了CTS完成测试 创建了性模拟器包含了所有可模拟的硬件 结果用了一天时间发现CTS Plan仍然没有完整的执行完毕。
但是单独执行CTS中的某一package确实比较快分别执行CTS包含的52个package。
每个平均耗时10 -15分钟 以此计算 9 -13小时可以完成测试 分析 1. 为什麼执行完整的CTS plan 会如此耗时 主要原因是CTS Plan 的测试过程中adb总会出现 以下几个问题 Max ADB operations reached. Restarting ADB... 造成设备多次重启 Installing met timeout due to Unknown reason. 造成某个apk总是安装不上 就卡在哪里不停的重新安装当到时adb操作超过上限时测试机重启 Uninstalling met timeout due to Unknown reason. 造成某个apk总是卸载不了就卡在哪里不停的重新卸载当到时adb操作超过上限时测试机重启 2. 为什麼执行单个package时间也不短 首先执行单个package重复使用adb的命令的次数少出现问题1的概率小不会造成adb出问题 那麼主要原因因该是在WIN7系统上用虚拟机跑linux。
这样host端linux和clien端Android AVD都运行在虚拟机上。
硬件的利用率不高。
如果用Linux系统直接测试设备时间应该会短一点。
结论 1. 建议不要执行整个Plan分Package 或Test执行比较好 2. 在一次测试结束后不论结果成功与否都要将CTS所安装的apk完全卸载避免下次测试失败。
3. 建议不要在虚拟机上跑Linux直接装Linux系统。
另外需要更正一点 测试结果包含package的测试是否通过 也包含每个test item 的测试情况。
3.2 CTS 命令详解 在讲解CTS命令之前先阐述CTS测试中几个概念 Test PlanPlan测试计划Test package的集合每次Plan中都包含若干个测试包 Test PackagePackage测试包Test case的集合 Test case测试用例Test的集合 Test测试每一个测试对应一个或者多个Instrumentation Test Instrumentation TestAndroid测试环境的核心是一个Instrumentation框架在这个框架下你的测试应用程序可以精确控制应用程序。
使用Instrumentation你可以在主程序启动之前创建模拟的系统对象如Context控制应用程序的多个生命周期发送UI事件给应用程序在执行期间检查程序状态。
Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。
关于Instrumentation将在下一节CTS测试的含义及原理中详细介绍。
这里只要明确一个概念。
Result_TypeCTS的测试结果可以通过命令查阅也可以通过浏览器查看下结果文件 命令查阅结果 其中Test result 有四种类型的值Pass Fail Timeout NoExecuted 浏览器查看XML文件 运行Performance 测试Plan 结果文件testResult.xml. 路径 /out/host/linux-x86/cts/android-cts/repository/results/2011.01.04_00.16.40 上图为performance plan所包含的Test package的测试结果可以看到这次测试每一个Test package的测试结果类型result_type都为Timeout关于测试结果的分析我们将在CTS Debug分析中介绍这里主要让大家明确result_type的含义。
小结一下为了理解CTS命令的意义我们必须明确PlanPackageTestcaseTestresult_typesession的含义 CTS将Test组合为TestcaseTestcase再组合为Package最后由Package组合为Plan。
CTS可以执行一个Plan一个Plan的某个Package一个Plan的某个Test。
CTS执行的结果以Session_ID来标识一个测试结果。
CTS的结果类型result_type包含Pass Fail Timeout NoExecuted四种 上面的介绍主要想帮助大家理解CTS命令。
下表详细列出的CTS命令。
参考资料Compatibility Test Suite CTS Framework UserManual选择红色部分下载。
Avaiable commands and options: Host help show this message 帮助文档 exit exit cts command line 退出CTS Plan ls --plan list available plans 列出所有Plan ls --plan 【plan_name】 list contents of the plan with specified name 列出一个Plan的内容 参数plan_namePlan的名称 add --plan 【plan_name】 add a new plan with specified name 添加一个Plan 参数plan_namePlan的名称 add --derivedplan 【plan_name】 -s/--session 【session_id】 -r/--result 【result_type】 derive a plan from the given session 创建一个新的的Plan这个plan通过指定一个Test_Plan的结果序号和该结果中特定的结果类型。
即取得指定结果中某一类型的所有testcase来组成一个新的Plan 参数plan_name创建的新Plan名称 session_id已有结果的一个ID result_type结果中每个testcase 的结果类型取以下4 值之一 pass/fail/notExecuted/timeout 注 如果result_type为空则默认为pass 如果session_id为空则默认选取 最近的一次测试结果 rm --plan 【plan_name】/all remove a plan or all plans from repository 删除一个Plan 参数plan_namePlan的名称 参数为all时删除所有的Plan start --plan 【test_plan_name】 run a test plan 运行一个Plan 参数test_plan_namePlan的名称 start --plan 【test_plan_name】 -d/--device 【device_ID】 run a test plan using the specified device 在指定的设备上运行一个Plan 参数test_plan_namePlan的名称 device_ID设备ID start --plan 【test_plan_name】 -t/--test 【test_name】 run a specific test 运行某个Plan中的一个Test 参数test_plan_namePlan的名称 test_nameTest名称 start --plan 【test_plan_name】 -p/--package 【java_package_name】 run a specific java package 运行某个Plan中的一个java包该包由若干个Testcase组成 参数test_plan_namePlan的名称 java_package_name包的名称 start --plan 【test_plan_name】 -t/--test 【test_name】 -d/--d.
上一篇:
Android在天嵌2440上的移植
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计