一、测试描述:
前提:设置Device theme为Light,手机内上传有浅色图片
操作步骤:
1、长按手机屏幕
2、点击Wallpapers
3、选择已有的浅色图片设置为Home screen
问题点:设置壁纸后,返回待机界面,手机屏幕闪了一下,虚拟键不显示
期望结果:虚拟键正常显示
测试视频:
Android P 设置浅色壁纸后,虚拟键不显示
分析过程:
(1)首先要验证虚拟键是否真的消失? 点击虚拟按钮位置是否有效果。 ==>检测方法, 手动点击虚拟按键位置,譬如:长按recent 键位置,发现有响应。则说明虚拟按键并没有被屏蔽,只是背景色全黑而已。
(2)发现功能是正常,则应该是UI绘画导致的问题。 通过工具sf_bqdump_P 进行dump 对应图层。(sf_bqdump_P :https://transfer.mediatek.com/Detail/Go/REQ30006023090)
(3) 从SF_bqdump_all 上看,发现android.systemui.ImageWallpaper 绘画底部有一部分是黑色区域,怀疑是壁纸的问题。
(4)将wallpaper pull 出来,观察壁纸是否正常. 命令 : adb pull data/system/users/0/wallpaper ./
壁纸:
(5)原始壁纸,根本就没有,下面的黑条。是在设置壁纸时,进行产生的。
(6)在设置壁纸的代码上分析,找出原因。通过debug 发现,解析图片时返回的大小是不正确的, 而且发现若是图片png 是正常的,若是jpg 就不正常.
vendor/mediatek/proprietary/packages/apps/WallpaperPicker/src/com/android/wallpaperpicker/common/InputStreamProvider.java
public Bitmap readCroppedBitmap(RectF cropBounds, int outWidth, int outHeight, int rotation) {
//解析JPG的高度不正确,574x800 的jpg 图片,解析出来是574x835。 若是PNG 图片, 574x800 解析出来是574x800
crop = decoder.decodeRegion(roundedTrueCrop, options);
}
尝试使用crop in-memory 可以正常显示。
//BitmapRegionDecoder has failed, try to crop in-memory
(7)而且若将decodeRegion 解码忽略掉,直接使用BitmapRegionDecoder 就是正常的,那就说明是decodeRegion 解码的问题了。 现在问题已经清晰了,是decodeRegion 解析出来的图片高度不正确。 第一种方案是修改底层库为什么返回高度不正确, 对于底层库不熟悉,直接修改不能评估会有什么风险。第二种方案是framework 层,framework 也存在同样的问题,可能会存在未知风险。 第三种就修改上层app,毕竟此问题只有特殊的壁纸才会有此问题。
修改方案:
/packages/apps/WallpaperPicker/src/com/android/wallpaperpicker/common/InputStreamProvider.java
public Bitmap readCroppedBitmap(RectF cropBounds, int outWidth, int outHeight, int rotation) {
...
Bitmap crop = null;
if (decoder != null) {
// Do region decoding to get crop bitmap
BitmapFactory.Options options = new BitmapFactory.Options();
if (scaleDownSampleSize > 1) {
options.inSampleSize = scaleDownSampleSize;
}
//修改代码开始
+ if (roundedTrueCrop.right> decoder.getWidth ()){
+ roundedTrueCrop.right = decoder.getWidth ();
+ }
+ if (roundedTrueCrop.bottom> decoder.getHeight ()){
+ roundedTrueCrop.bottom = decoder.getHeight ();
+ }
//修改代码结束
crop = decoder.decodeRegion(roundedTrueCrop, options);
decoder.recycle();
}
....
}
总结:对于bug 修复,对于未知风险,要有畏惧之心。尽量在影响范围最小的情况下修改。