Android P 設定淺色桌布後,虛擬鍵不顯示
一、測試描述:
前提:設定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 修復,對於未知風險,要有畏懼之心。儘量在影響範圍最小的情況下修改。