引用“Android cts all pass 全攻略 ”里面的一段话:
? testcase timeout
测试某个testcase的时候一直出现 “........”,迟迟没有pass或者fail,等良久出现一个血淋淋的timeout,很让人伤心。有不少人笑嘻嘻的以为timeout 挺好,至少它不是fail。在我看来timeout 比 fail 还恐怖,因为它连进行测试到底是pass还是fail的权利都没有。想不被硬件设备厂商笑话,必须0 timeout ,然后再争取0 fail 。
在使用CTS测试的时候经常会出现这样的提示错误:“Test failed to run to conmpletion.Reason: ‘Failed to receive adb shell test output within 600000ms.
Test may have timed out, or adb connect to device became unresponsive‘. Check device locat for details” 有时候会是1200000ms,单个测试用例这个超时等待时间是无法接受的。在我的开发板上出现这个问题的原因是我把camera service给裁剪掉了。
日志显示测试用例testCameraFeatures一直等待camera service服务的响应:
01-02 00:09:53.450 I/TestRunner( 4017): started: testCameraFeatures(android.app.cts.SystemFeaturesTest) 01-02 00:09:53.450 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:09:54.450 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:09:55.450 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:09:56.450 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:09:57.450 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:09:58.450 W/Camera ( 4017): CameraService not published, waiting... 01-02 00:09:58.960 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:09:59.960 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:10:00.960 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:10:01.960 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:10:02.960 I/ServiceManager( 4017): Waiting for service media.camera... 01-02 00:10:03.960 W/Camera ( 4017): CameraService not published, waiting...
看见这样的日志,就不难发现,肯定是下层掉入了死循环,跟踪framework代码,你会发现这样一段代码:
1 // establish binder interface to camera service 2 const sp<ICameraService>& Camera::getCameraService() 3 { 4 Mutex::Autolock _l(mLock); 5 if (mCameraService.get() == 0) { 6 sp<IServiceManager> sm = defaultServiceManager(); 7 sp<IBinder> binder; 8 do { 9 binder = sm->getService(String16("media.camera")); 10 if (binder != 0) 11 break; 12 ALOGW("CameraService not published, waiting..."); 13 usleep(500000); // 0.5 s 14 } while(true); 15 if (mDeathNotifier == NULL) { 16 mDeathNotifier = new DeathNotifier(); 17 } 18 binder->linkToDeath(mDeathNotifier); 19 mCameraService = interface_cast<ICameraService>(binder); 20 } 21 ALOGE_IF(mCameraService==0, "no CameraService!?"); 22 return mCameraService; 23 }
这段代码的位置在“frameworks/av/camera/Camera.cpp”,一看见那个邪恶的while(true),就知道这个此处是万劫不复之地了。
当然解决办法,你可以想办法在binder为NULL的情况下,跳出循环,并且保证不出问题也行。不知道谷歌写这段死循环是何用意,并不是每个拿你系统干活的人都需要camera,不要camera了,你也不至于让我陷入万劫不复之地吧 ?
下面说说我在做CTS测试的时候的解决办法,很简单,把源码目录下面关于camera的东西注释掉,删除掉。下面是我的修改记录,可以作为参考:
前面带“-”的是删除的文件,那个带笔型标记的是修改的文件,要修改的文件直接大文件,找camera或者testCamera关键字,见着就注释掉。
做完,make cts -j4.
本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 *许可协议进行许可。