Android CTS Test failed to run to conmpletion 测试超时问题

引用“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 中国大陆许可协议进行许可。

原文地址:https://www.cnblogs.com/tangdoudou/p/3512307.html