Android10 系统截屏功能异常的处理
客户反馈的问题,设备上使用状态栏中“长截屏”功能,截屏失败且出现系统卡死问题。
在此记录该问题的处理
一现象:
设备A10上使用系统“长截屏”功能,出现截屏失败,系统死机。
二复现问题并分析
使用设备操作该功能,该问题必现。导出ylog
A10 日志导出指令:
adb pull /storage/emulated/0/ylog curscreenanr2/ //后面的路径是存放ylog日志的文件夹名称
三分析ylog
ylog目录如图,crash中有崩溃log 详细如下:
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: Process: com.android.systemui:screenshot, PID: 4405
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground()
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at android.os.AsyncTask$4.done(AsyncTask.java:399)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:271)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at java.lang.Thread.run(Thread.java:919)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: width must be > 0
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at android.graphics.Bitmap.checkWidthHeight(Bitmap.java:450)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at android.graphics.Bitmap.createBitmap(Bitmap.java:874)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at android.graphics.Bitmap.createBitmap(Bitmap.java:836)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at com.android.systemui.screenshot.CompareUtils.CompareCropedBitmap(CompareUtils.java:39)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at com.android.systemui.screenshot.GlobalScreenshot$CompareTask.doInBackground(GlobalScreenshot.java:843)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at com.android.systemui.screenshot.GlobalScreenshot$CompareTask.doInBackground(GlobalScreenshot.java:817)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at android.os.AsyncTask$3.call(AsyncTask.java:378)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
C017E3F 03-05 15:48:17.472 4405 4456 E AndroidRuntime: ... 4 more
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: Process: com.android.systemui:screenshot, PID: 4543
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground()
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at android.os.AsyncTask$4.done(AsyncTask.java:399)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:271)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at java.lang.Thread.run(Thread.java:919)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: width must be > 0
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at android.graphics.Bitmap.checkWidthHeight(Bitmap.java:450)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at android.graphics.Bitmap.createBitmap(Bitmap.java:874)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at android.graphics.Bitmap.createBitmap(Bitmap.java:836)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at com.android.systemui.screenshot.CompareUtils.CompareCropedBitmap(CompareUtils.java:39)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at com.android.systemui.screenshot.GlobalScreenshot$CompareTask.doInBackground(GlobalScreenshot.java:843)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at com.android.systemui.screenshot.GlobalScreenshot$CompareTask.doInBackground(GlobalScreenshot.java:817)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at android.os.AsyncTask$3.call(AsyncTask.java:378)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
C01ACAB 03-05 15:48:48.029 4543 4630 E AndroidRuntime: ... 4 more
可以看到关键日志
查看packages/SystemUI/src/com/android/systemui/screenshot/CompareUtils.java中,
设备分辨率w*h=240x320. 图上部分值为0,所以异常,
四解决方案:
将以上的margin数据修改为10,使其计算结果值>0即可
OVER~