JellyBean CTS Android.holo Failed问题解决

转载自 http://blog.sina.com.cn/s/blog_82f640ed010166ub.html


在CTS Android Hole测试24个failed,查看错误如下:

--------------------------------------------------------------------------------------------------

11-15 15:39:53 I/0123456789ABCDEF:android.holo.cts.HoloTest#testHolo FAIL
junit.framework.AssertionFailedError: Failed bitmap names:[holo_button, holo_button_pressed, holo_progressbar,holo_progressbar_small, holo_progressbar_large,holo_radiogroup_vertical, holo_ratingbar_0, holo_ratingbar_2point5,holo_ratingbar_5, holo_ratingbar_0_pressed,holo_ratingbar_2point5_pressed, holo_ratingbar_5_pressed,holo_searchview, holo_searchview_query, holo_searchview_query_hint,holo_seekbar_0, holo_seekbar_50, holo_seekbar_100, holo_switch,holo_switch_checked, holo_tabhost, holo_toggle_button,holo_toggle_button_checked] Check/mnt/sdcard/cts-holo-assets/failed and/mnt/sdcard/cts-holo-assets/diff for details.
at android.holo.cts.HoloTest.runThemeTest(HoloTest.java:143)
at android.holo.cts.HoloTest.testHolo(HoloTest.java:35)
at java.lang.reflect.Method.invokeNative(Native Method)
atandroid.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
atandroid.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
atandroid.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
atandroid.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
atandroid.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
atandroid.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
atandroid.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)

--------------------------------------------------------------------------------------------------

花了一个周的时间,终于把Android.hole Test分析清楚,解决了这个问题.

所有源代码路径:

cts\tests\tests\holo\src\android\holo\cts

framework\base\core\java\android\view\

1. Holo测试原理:

1.1)  holoTest启动正常启动自带theme(主题)

runThemeTest(HoloTest.java)->startActivityForResult(ThemeTestActivity.java)->setTheme(LayoutTestActivity.java)->initializeTheme(ContextThemeWrapper.java)

1.2)  快照保存当前主题theme的元素(比如button,textEdit等)比较快照获得元素bitmap和referrencebitmap,判断是否一致,如果一致测试通过,如果不一致,测试失败

protected voidonPreExecute() {

mBitmap =getBitmap();

 mReferenceBitmap =BitmapAssets.getBitmap(getApplicationContext(),mBitmapName);

        final int threshold = 1;       

           mSame = compareTo(mBitmap, mReferenceBitmap, threshold);

       }

private booleancompareTo(Bitmap bitmap, Bitmap reference, int threshold){

  if(bitmap.getConfig() != reference.getConfig() ||

                   bitmap.getWidth() != reference.getWidth() ||

                   bitmap.getHeight() != reference.getHeight()) {

               return false;

           }

int w =bitmap.getWidth();

int h =bitmap.getHeight();

ByteBufferbuffer1 = ByteBuffer.allocate(bitmap.getByteCount());

ByteBufferbuffer2 = ByteBuffer.allocate(reference.getByteCount());

 

bitmap.copyPixelsToBuffer(buffer1);

reference.copyPixelsToBuffer(buffer2);

 

final int length= w*h;

for (int i = 0; i< length; i++) {

               int pel1 = buffer1.getInt(i);

                intpel2 = buffer2.getInt(i);

               int dr = (pel1 & 0x000000FF) - (pel2 &0x000000FF);

               int dg = ((pel1 & 0x0000FF00) - (pel2 & 0x0000FF00))>> 8;

               int db = ((pel1 & 0x00FF0000) - (pel2 & 0x00FF0000))>> 16;

//在这里比较图片,注意表示的颜色

               if (Math.abs(db) > threshold ||

                       Math.abs(dg) > threshold ||

                       Math.abs(dr) > threshold) {

                   return false;

               }

               if (bitmap.hasAlpha()) {

                   int da = ((pel1 & 0xFF000000) - (pel2 & 0xFF000000))>> 24;

                   if (Math.abs(da) > threshold) {

 Log.i(TAG, "++++++++compareTo 3 ++++++++++" );

 returnfalse;

                   }

               }

           }

 

 Log.i(TAG, "++++++++compareTo 4 ++++++++++" );           

           return true;

       }

Referrencebitmap在哪里?

cts\tests\tests\holo\res 里面的drawable, 里面是不是有好多drawable啊,你知道为什么吗?懂得应用程序开发的估计都知道,这个就是为了适应各种LCD尺寸和denisity的。(这个很重要哦)

1.3) 如果两个bitmap不一致,就保存到手机上 /mnt/sdcard/diff 和/mnt/sdcard/failed两个文件夹里面。

saveBitmap(LayoutTestActivity.java) ->  BitmapAssets.saveBitmap(BitmapAssets.java)

显示效果图如下:

注意红色表示的就是两个bitmap差异之处,具体看源代码。

2. 测试原因分析

在网上查找了几天,用百度没有搜索出任何有用信息,最后还是google出大拿的一话,恍然大悟:

Android.hool test failed depends onscreen type and dpi, this test still fail with 1280x720 resolutionwith density 320, but can pass with density 240.

 

原来我的手机屏幕是1280x720 320dpi的,所以显示效果会有差异,导致失败了。

3. 解决办法

# vimdevice/xxx/system.prop

 

rild.libpath=/system/lib/libreference-ril.so

rild.libargs=-d /dev/ttyS0

 

ro.sf.lcd_density=320

 

修改其中ro.sf.lcd_density=240

重新烧录编译img文件下载,重新测试,结果如下:

11-15 15:03:56 I:android.holo.cts.HoloTest#testHolo PASS

11-15 15:05:06 I:android.holo.cts.HoloTest#testHoloDialog PASS

11-15 15:06:13 I/emulator-5554:android.holo.cts.HoloTest#testHoloDialogMinimumWidthPASS

11-15 15:07:17 I:android.holo.cts.HoloTest#testHoloDialogNoActionBar PASS

11-15 15:08:24 I/emulator-5554:android.holo.cts.HoloTest#testHoloDialogNoActionBarMinimumWidthPASS

11-15 15:09:31 I:android.holo.cts.HoloTest#testHoloDialogWhenLarge PASS

11-15 15:10:40 I/emulator-5554:android.holo.cts.HoloTest#testHoloDialogWhenLargeNoActionBarPASS

11-15 15:11:41 I:android.holo.cts.HoloTest#testHoloInputMethod PASS

11-15 15:12:53 I:android.holo.cts.HoloTest#testHoloLight PASS

11-15 15:14:04 I:android.holo.cts.HoloTest#testHoloLightDarkActionBarPASS

11-15 15:15:12 I:android.holo.cts.HoloTest#testHoloLightDialog PASS

11-15 15:16:20 I:android.holo.cts.HoloTest#testHoloLightDialogMinimumWidthPASS

11-15 15:17:24 I:android.holo.cts.HoloTest#testHoloLightDialogNoActionBarPASS

11-15 15:18:31 I:android.holo.cts.HoloTest#testHoloLightDialogNoActionBarMinimumWidthPASS

11-15 15:19:42 I:android.holo.cts.HoloTest#testHoloLightDialogWhenLargePASS

11-15 15:20:54 I/:android.holo.cts.HoloTest#testHoloLightDialogWhenLargeNoActionBarPASS

11-15 15:22:06 I/:android.holo.cts.HoloTest#testHoloLightNoActionBar PASS

11-15 15:23:17 I/:android.holo.cts.HoloTest#testHoloLightNoActionBarFullscreenPASS

11-15 15:24:18 I/:android.holo.cts.HoloTest#testHoloLightPanel PASS

11-15 15:25:26 I/:android.holo.cts.HoloTest#testHoloNoActionBar PASS

11-15 15:26:36 I/:android.holo.cts.HoloTest#testHoloNoActionBarFullscreenPASS

11-15 15:27:36 I:android.holo.cts.HoloTest#testHoloPanel PASS

11-15 15:28:49 I:android.holo.cts.HoloTest#testHoloWallpaper PASS

11-1515:30:01 I: android.holo.cts.HoloTest#testHoloWallpaperNoTitleBarPASS

 

 

4. 补充

还有一种办法是,可以生成支持1280x720 320dpi的holo ReferrenceBitmap,就是增加一个res/drawable-xxx 文件夹,具体看HoloTestUtilitiesActivit y.java。这个我还没有花时间研究,谁有兴趣可以看看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值