首先简单介绍下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。

最新文章

  1. 在UWP中页面滑动导航栏置顶
  2. 问题:QXcbConnection: Could not connect to display
  3. Android随
  4. 关于angularjs中ajax请求php接口参数个是转换的问题
  5. Fragment的陷阱(转)
  6. snmp getTable demo :iftable ipAddresstable
  7. 阿里云搭建LAMP环境详细教程
  8. WPF 之 利用Visibility属性进行Item模板切换
  9. Java中的面向对象
  10. Java经典封装JDBC模板(充分体现面向对象思想)(转)
  11. javascript 学习随笔2
  12. Windows Phone开发(27):隔离存储A
  13. redhat6 + 11G RAC 双节点部署
  14. SpringBoot 自定义Banner
  15. [Alpha阶段]第九次Scrum Meeting
  16. 判断IOS、Android访问
  17. Linux实操篇 vi和vim编辑器
  18. java学习--&quot;==”和 equals
  19. oracle 连接字符串的问题
  20. 从输入url到页面展示到底发生了什么

热门文章

  1. iOS LLDB调试器
  2. *两个关键字static和final
  3. android的jni
  4. MFC编程入门
  5. AjaxUpLoad.js使用实现文件上传
  6. Android开发之ProgressDialog与ProgressBar
  7. 在oracle中where 子句和having子句中的区别
  8. 使用DX绘制3D物体时新手常犯错误,看不见物体时可以一一排查
  9. LA 3485 (积分 辛普森自适应法) Bridge
  10. 任E行M1端口比特率特征码