首先简单介绍下CTS:全称Compatibility Test Suite,通过CTS测试,来检测android apk与android系统的兼容性。

  最近公司release一版新的Image,但在新Image上跑CTS后出现了和Audio有关的测试FAIL项(testVolume),因为是第一次看CTS的问题,所以简单的整理了关于该FAIL项的解决过程,方便以后的复习。


  在跑完testVolume项的CTS测试FAIL时,在命令窗口显示的错误信息如下:

  根据提示的信息,定位到该测试项对应的AudioManagerTest.java文件的第335行。为了方便分析,如下code是AudioManagerTest.java文件中testVolume函数的部分代码,其中红色HIghline的就是FAIL项提示的第335行。

public void testVolume() throws Exception {
int[] streams = { AudioManager.STREAM_ALARM,
AudioManager.STREAM_MUSIC,
AudioManager.STREAM_VOICE_CALL,
AudioManager.STREAM_RING }; mAudioManager.adjustVolume(ADJUST_RAISE, 0);
mAudioManager.adjustSuggestedStreamVolume(
ADJUST_LOWER, USE_DEFAULT_STREAM_TYPE, 0);
int maxMusicVolume = mAudioManager.getStreamMaxVolume(STREAM_MUSIC); for (int i = 0; i < streams.length; i++) {
// set ringer mode to back normal to not interfere with volume tests
mAudioManager.setRingerMode(RINGER_MODE_NORMAL); int maxVolume = mAudioManager.getStreamMaxVolume(streams[i]); mAudioManager.setStreamVolume(streams[i], 1, 0);
if (mUseFixedVolume) {
assertEquals(maxVolume, mAudioManager.getStreamVolume(streams[i]));
continue;
}
assertEquals(1, mAudioManager.getStreamVolume(streams[i]));
       ... ...
     }
}

  根据maxVolume = mAudioManager.getStreamMaxVolume(stream[i]),可以知道maxVolume是用来记录stream[i]的MAX_STREAM_VOLUME,这个值可以在AudioService.java中获得。当for循环中的i = 0时,stream[i] = AudioManager.STREAM_ALARM。而STREAM_ALARM的MAX_STREAM_VOLUME为7,即maxVolume = 7。

  mAudioManager.getStreamVolume(stream[i])的值可以通过Souce Insight追到AudioService.java文件中,且值为(mIndex + 5)/10。因为CTS测试都是在系统恢复出厂设置后测试的,所以此处的mIndex应该对应于stream[i]的默认音量。音频流的默认音量可以在AudioManager.java中得到。STREAM_ALARM的默认音量为5,带入到(mIndex + 5)/10可以求得mAudioManager.getStreamVolume(stream[i]) = 1。

  正是由于maxVolume和mAudioManager.getStreamVolume(stream[i]) 这两个值不等,所以会提示有AssertionFailedError:expected:<7>but was:<1>的错误。这说明CTS测试已经进入if(mUseFixedVolume)语句中,但是搜索配置文件config.xml发现config_useFixedVolume = false,这与测试结果正好相反。这里就有疑惑为什们这边的mUseFixedVolume与配置文件中的值不一样呢?当前mUseFixedVolume的值又是什么呢?为了解决这个疑惑,将CTS测试用例apk反编译得到

this.mUseFixedVolume = this.mContext.getResources().getBoolean();

  进入out/target/common/obj/APPS/framework-res_intermediates/public_source.xml中发现编译结束后config_useFixedVolume对应的ID却为0x01110057,转化为十进制的值为17891415。原来mUseFixedVolume得到的值是配置文件中ID为17891414的值,查询该值大小为true,满足CTS结果。

  解决办法:将config_useFixedVolume在config.xml中向前移动一位,以满足编译结果ID为17891414。修改后,测试PASS。

CTS FAIL(一)的更多相关文章

  1. CTS/GTS 常见问题解答

    1.android.security.cts.PackageSignatureTest测试fail(MTK平台) 原因:由于用的是google default key而导致的fail,需要自己定义re ...

  2. Android CTS 结果 testResult.xml 修改 fail 项 为 notExecuted 项 分析

    这两天一直在搞 Android 4.1 CTS ,每次完整跑完一遍后总有几百项 failed,用编辑器手动改为 notExecuted 项后重新跑,有很多项第二次都跑过了. 但是发现直接修改也带来很多 ...

  3. Android CTS測试Fail项改动总结(四)

    Android5.1上的測试 1.android.security.cts.SELinuxDomainTest# testInitDomain fail 打印的log junit.framework. ...

  4. Android CTS - Cannot run program "aapt"/ Fail to run aapt on .../apk installed but AaptParser failed

    今天同事碰到cts的一些问题,跑到某个apk的时候,就提示如下错误: Cannot run program "aapt": error=2. No such file or dir ...

  5. Android 4.0.3 CTS 测试

    Android-CTS 4.0.3测试基本配置 1. Download CTS CTS的获取方式有两种: 1.1.由Google提供 1.1.1.打开浏览器输入连接: http://source.an ...

  6. android 兼容性测试 CTS 测试过程(实践测试验证通过)

    source: http://blog.csdn.net/jianguo_liao19840726/article/details/7222814 写这个博客的时候是为了记忆,建议大家还是看官方的说明 ...

  7. 如何debug android cts

    启动和关闭ADB服务(adb start-server和adbkill-server) 经作者测试,模拟器在运行一段时间后,adb服务有可能(在Windows进程中可以找到这个服务,该服务用来为模拟器 ...

  8. 【转】CTS tests 4.2_r4

    原文网址:http://www.xuebuyuan.com/1722006.html Precondition: 1.Get android sdk 2.Set adb to environment ...

  9. 【转】android cts failed items

    原文网址:http://blog.csdn.net/linsa0517/article/details/19031479 Fail的一些修改   1.直接设置问题 estUnknownSourcesO ...

随机推荐

  1. Android给listview的item设定高度

    在item的layout文件中,用android:layout_height设置item的高度.运行,高度设置无效. 解决办法: 给item设定minHeight,即可. -------------- ...

  2. 4、处理方法中获取请求参数、请求头、Cookie及原生的servlet API等

    1.请求参数和请求头 使用@RequestParam绑定请求参数,在处理方法的入参处使用该注解可以把请求参数传递给请求方法 —— value :参数名 —— required : 是否必须,默认为tr ...

  3. 【C#设计模式——创建型模式】工场方法模式

    工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子 ...

  4. php整理(四): mysql

    PHP学习(四)---PHP与数据库MySql 主要有以下的内容: 1.怎么连接数据库 2.怎么操作数据库 (1)怎么执行sql语言 (2)怎么处理返回的结果集 方法一:面向过程(已经过时,只是了解) ...

  5. sed替换单引号

    echo "Cfoo'barxml" | sed "s/'/::/g" |  sed 's/::/\\:/g' |  sed "s/:/'/g&quo ...

  6. WIFI环境下Android手机和电脑通信

    前面已经写过一篇java实现最基础的socket网络通信,这篇和之前那篇大同小异,只是将客户端代码移植到手机中,然后获取本机IP的方法略有不同. 先讲一下本篇中用到Android studio的使用吧 ...

  7. JVM参数配置

    JVM参数配置 设置堆大小 -Xms 初始堆大小 -Xmx 最大堆大小 -Xmn 设置年轻代大小 设置每个线程堆栈大小 -Xss 设置每个线程的堆栈大小 设置年轻代大小 -XX:NewSize= -X ...

  8. Codeforces Beta Round #2B(dp+数学)

    贡献了一列WA.. 数学很神奇啊 这个题的关键是怎么才能算尾0的个数 只能相乘 可以想一下所有一位数相乘 除0之外,只有2和5相乘才能得到0 当然那些本身带0的多位数 里面肯定含有多少尾0 就含有多少 ...

  9. Awesome-awesome-awesome

    Awesome-awesome-awesome A curated list of curated lists of awesome lists. awesome-awesomes @sindreso ...

  10. Error Curves(2010成都现场赛题)

    F - Error Curves Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Descript ...