MTKAndroid12 解決SystemUI下拉框中,長按WIFI圖標會導致崩潰問題

解決SystemUI下拉框中,長按WIFI圖標會導致崩潰問題

文章目錄

  • 場景
  • 參考資料
  • 修改文件
  • 解決方案
    • 日志
    • 源碼分析
  • 總結


場景

在部分產品中偶發性發現,

  • SystemUI下拉框下拉后長按WIFI圖標會導致崩潰問題,有時候是截屏、點擊Home 按鍵后,長按WIFI圖標崩潰。
  • 第一次刷完固件開機OK的,重啟后會復現,或者直接長按 崩潰必現。

這個現象很奇怪,平常自己開發中并不是所有項目都會遇到,

參考資料

Android11 下拉菜單長按WIFI 圖標SystemUI ANR
參考資料有部分完整的報錯信息日志和源碼分析,方便理解問題。 核心就是在Handler 里面創建了Handler,Android體系不允許的。

new Handler()和new Handler(Looper.getMainLooper())的區別是什么?

區別總結來說:

  • 主線程本身就有一個Lopper,在程序起來的時候就已經lopper() 了,所以在主線程里面創建Handler,直接 new
    Handler()。 這個handler 發送消息自動會在Lopper() 隊列里面等待執行。

  • 子線程里面不一樣了,你創建了一個new Handler(), 系統不允許就報錯了。 因為本身這個Handler()
    創建了就是個死Handler,無法讓消息轉動起來的。 所以系統不允許就直接報錯了,如果想這樣就是要在子線程中創建Handler ,那么就兩個方案: 讓這個Handler 有自己的Looper,所有就有了Lopper.prepare 和 Looper.loop; 或者在這個主線程中穿件的Handler 和 主線程關聯起來,構造方法傳遞一個MainLoop 不就行了嘛。

如果 必現,這樣的解決方案是OK的,就是在創建Handler 前后加Lopper.prepare() 和 Lopper.loop() 讓線程中的消息循環起來。
如果是偶現,這樣的解決方式肯定是不合理的,下面會給出我的修改解決方案
如果需要深究偶發原因,還需進一步重點分析,問題原因很簡單就是子線程里面跑了Handler.

修改文件

相關關聯文件
/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/assist/AssistManager.java修改文件
/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/assist/AssistManager.java具體修改內容
mAssistDisclosure = new AssistDisclosure(context, new Handler());修改為如下:
mAssistDisclosure = new AssistDisclosure(context, new Handler(Looper.getMainLooper()));

在這里插入圖片描述

解決方案

日志

這里直接張貼一下別人家的日志 下。


10-01 08:01:11.236  5792  5833 E AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
10-01 08:01:11.236  5792  5833 E AndroidRuntime: Process: com.android.systemui, PID: 5792
10-01 08:01:11.236  5792  5833 E AndroidRuntime: java.lang.RuntimeException: Can't create handler inside thread Thread[AsyncTask #1,5,main] that has not called Looper.prepare()
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at android.os.Handler.<init>(Handler.java:227)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at android.os.Handler.<init>(Handler.java:129)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.assist.AssistManager.<init>(AssistManager.java:213)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.assist.AssistManager_Factory.provideInstance(AssistManager_Factory.java:107)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.assist.AssistManager_Factory.get(AssistManager_Factory.java:70)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.assist.AssistManager_Factory.get(AssistManager_Factory.java:17)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard$16(StatusBar.java:2709)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard$16$StatusBar(Unknown Source:0)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.statusbar.phone.-$$Lambda$StatusBar$fPMIOsYMhFXVKHESAjUObpcgeJM.run(Unknown Source:10)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at java.lang.Thread.run(Thread.java:923)

源碼分析

根據報錯日志,找到了源碼

在這里插入圖片描述
報錯的地方,注意兩個地方:

  • 報錯的地方已經修改,Handler() 構造方法,傳遞一個Looper.getMainLooper() 放到主線程
  • 這個類上面有一個Inject 注解,這個注意下,在引用地方就不是new 對象了的。

可以根據實際日志,反推調用地方是哪里報錯了,如下追蹤到StatusBar.java 源碼了。
在這里插入圖片描述

通過get() 方法,獲取對象,創建了AssistManager 對象, 但是它是放到子線程里面調用的。 然后在AssistManager 構造方法里面穿件了Handler,所以直接報錯了。

總結

通過這里的筆記學習和相關資料參考

  • 搞清楚Handler、Loop 的基本原理 相關原理不復雜需要掌握基本知識;搞清楚Looper.loop Lopper.prepare、Loop.getMainLooper 這些方法的使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898741.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898741.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898741.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第三十一篇 數據倉庫(DW)與商業智能(BI)架構設計與實踐指南

目錄 一、DW/BI架構核心理論與選型策略1.1 主流架構模式對比&#xff08;1&#xff09;Kimball維度建模架構&#xff08;2&#xff09;Inmon企業工廠架構&#xff08;3&#xff09;混合架構 二、架構設計方法論與實施步驟2.1 維度建模實戰指南&#xff08;1&#xff09;模型選擇…

XSS基礎靶場練習

目錄 1. 準備靶場 2. PASS 1. Level 1&#xff1a;無過濾 源碼&#xff1a; 2. level2&#xff1a;轉HTML實體 htmlspecialchars簡介&#xff1a; 源碼 PASS 3. level3:轉HTML深入 源碼&#xff1a; PASS 4. level4:過濾<> 源碼&#xff1a; PASS: 5. level5:過濾on 源碼…

2025年3月AI搜索發展動態與趨勢分析:從技術革新到生態重構

025年3月AI搜索發展動態與趨勢分析&#xff1a;從技術革新到生態重構 一、行業動態&#xff1a;巨頭布局與技術升級 谷歌推出“AI模式”&#xff0c;重新定義搜索體驗 谷歌上線全新“AI模式”&#xff0c;集成多模態交互與實時數據能力&#xff0c;用戶可通過文本、圖片或語音…

熔斷降級(Sentinel解決)

問題概述 在微服務架構中一定要預防微服務雪崩問題&#xff0c;微服務雪崩問題就是指在微服務架構中&#xff0c;當一個服務出現故障時&#xff0c;由于服務之間的依賴關系&#xff0c;故障可能會傳播到其他服務&#xff0c;從而導致了大規模的服務失敗&#xff0c;系統無法正…

Qt高分屏自適應

一.設置默認 DPI 感知 Windows 上的桌面應用程序可以在不同的 DPI 感知模式下運行。 這些模式可實現不同的 DPI 縮放行為,并且可以使用不同的坐標空間。 有關 DPI 感知的詳細信息,請參閱在 Windows 上開發高 DPI 桌面應用程序。 請務必顯式為進程設置默認 DPI 感知模式,以避…

TPCTF 2025 web 復現

文章目錄 baby layoutsafe layoutSafe Layout Revengesupersqli baby layout 在index.js文件中&#xff0c;看到了有使用DOMPurify庫來防止XSS操作 在package.json里可以看到版本是3.2.4,關于3.2.3是有繞過策略的。它會把script標簽清除掉&#xff0c;去看bot可以看到flag是放…

Agent Team 多智能體系統解析

引言 在人工智能技術高速發展的今天&#xff0c;"多智能體協作系統"&#xff08;Agent Team&#xff09;正成為突破效率瓶頸的關鍵技術。與傳統的單體AI不同&#xff0c;這種由多個專業化智能體組成的協同網絡&#xff0c;通過分工協作和動態調整&#xff0c;展現出…

【前端 vue 或者麥克風,智能語音識別和播放功能】

前端 vue 或者麥克風&#xff0c;智能語音識別和播放功能 1. 終端安裝 npm install recordrtc2.引入 import RecordRTC from recordrtc3.html&#xff08;根據自己業務更改&#xff09; <div class"Page"><el-form ref"mainFormRef" class&qu…

bootstrap 表格插件bootstrap table 的使用經驗談!

最近在開發一個物業管理軟件&#xff0c;其中用到bootstrap 的模態框。同時需要獲取表格數據。用傳統的方法&#xff0c;本人不想用&#xff0c;考慮到bootstrap應該有獲取表格數據的方法&#xff0c;結果發現要想實現獲取表格數據功能&#xff0c;需要通過bootstrap的插件實現…

HTML 圖像與多媒體元素:拓展學習邊界的進度記錄(一)

開篇&#xff1a;學習啟程 在前端開發的廣袤領域中&#xff0c;HTML 作為構建網頁的基石&#xff0c;其重要性不言而喻。而 HTML 圖像與多媒體元素&#xff0c;就像是為這座基石添上了絢麗的色彩與靈動的音符&#xff0c;賦予網頁更加豐富的表現力和交互性。作為一名熱衷于探索…

循環不變量原則——螺旋矩陣

題目&#xff1a;螺旋矩陣 本題相較于螺旋矩陣II的不同之處是&#xff1a;螺旋矩陣II的矩陣是n行n列的方陣&#xff0c;而本題的矩陣并不一定是方陣。所以在遵循循環不變量原則遍歷完矩陣后&#xff0c;還會有一行或者一列沒有遍歷。 1、行多列少&#xff08;多一列沒遍歷&am…

【前端】Visual Studio Code安裝配置教程:下載、漢化、常用組件、基本操作

文章目錄 一、Visual Studio Code下載二、漢化三、常用組件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感謝觀看&#xff01; 一、Visual Studio Code下載 下載官網&#xff1a;https://code.visualstudio.com/ 進入官網后點擊右上角的Download &…

Java對象的hashcode

在 Java 中&#xff0c;hashcode 和 equals 方法是 Object 類的兩個重要方法&#xff0c;它們在處理對象比較和哈希集合&#xff08;如 HashMap、HashSet&#xff09;時起著關鍵作用。對于equals大部分Java程序員都不陌生&#xff0c;它通常是比較兩個對象的內容(值)是否相等(雙…

Ubuntu22.04通過DKMS包安裝Intel WiFi系列適配器(網卡驅動)

下載驅動包 訪問 backport-iwlwifi-dkmshttps://launchpad.net/ubuntu/source/backport-iwlwifi-dkms 網站&#xff0c;找到適用于Ubuntu 22.04的update版本&#xff08;如backport-iwlwifi-dkms_xxxx_all.deb&#xff09;&#xff0c;下載至本地。 安裝驅動 在下載目錄中執行以…

深度學習--概率

1 基本概率論 1.1 假設我們擲骰子&#xff0c;想知道1而不是看到另一個數字的概率&#xff0c;如果骰子是公司&#xff0c;那么所有6個結果(1..6),都有相同的可能發生&#xff0c;因此&#xff0c;我們可以說1發生的概率為1/6. 然而現實生活中&#xff0c;對于我們從工廠收到的…

kaggle上經典泰坦尼克項目數據分析探索

之前了解在kaggle上這個項目很火&#xff0c;最近想要加強一下python數據分析&#xff0c;所以在kaggle上找到這個項目進行學習探索&#xff0c;下面是將一些學習資料以及過程整理出來。 一、首先我們了解一下項目背景以及如何找到這個項目。 kaggle項目地址: https://www.k…

《深度剖析:鴻蒙系統不同終端設備的UI自適應布局策略》

在萬物互聯的時代&#xff0c;鴻蒙系統以其獨特的分布式理念和強大的技術架構&#xff0c;迅速在智能終端領域嶄露頭角。隨著鴻蒙生態的不斷壯大&#xff0c;越來越多的開發者投身其中&#xff0c;致力于為用戶打造豐富多樣的應用體驗。然而&#xff0c;如何讓應用在不同終端設…

計算機網絡的軟件、硬件和組成

&#xff11;.計算機網絡的組成 計算機網絡是一個十分復雜的系統&#xff0c;在邏輯上可以分為完成數據通信的通信子網和進行數據處理的資源子網兩個部分。 通信子網 通信子網提供網絡通信的功能&#xff0c;可以完成網絡主機之間的數據傳輸、交換、通信控制和信號變換等通信…

告別低效人工統計!自動計算計劃進度

實時監控任務進度一直是項目管理中的一項巨大挑戰。 人工統計方式不僅耗時耗力&#xff0c;而且往往由于信息傳遞的延遲和人為誤差&#xff0c;導致無法實時獲得準確的項目進展信息。 這種不準確性可能掩蓋潛在的風險點&#xff0c;從而影響項目的整體進度和成果。 Ganttable …

樓宇自控系統的結構密碼:總線與分布式結構方式的差異與應用

在現代建筑中&#xff0c;為了實現高效、智能的管理&#xff0c;樓宇自控系統變得越來越重要。它就像建筑的 智能管家&#xff0c;可自動控制照明、空調、通風等各種機電設備&#xff0c;讓建筑運行更順暢&#xff0c;還能節省能源成本。而在樓宇自控系統里&#xff0c;有兩種關…