Google 給 7.1+ 加了段代碼,讓你覺得更安全了嗎?
一、前言
雖然看到這篇文章朋友,知道如何預防一些 Android 下的流氓軟件。 但是 Android 的大多數(shù)用戶,并沒有這種預防的意識,基本上每隔一段時間,都會有一些 Android 上的惡意軟件而對用戶造成損失的事件報出來。
據(jù)我所知,有一些惡意軟件,會試圖獲取 Root 權(quán)限,然后劫持用戶的屏幕,讓用戶無法離開它設置的界面。當用戶無法自由的操作自己的手機屏幕,也就無法進行一些補救措施。
近期 Android 7.1 Nougat 中,悄悄的加入了一項新的安全相關的功能,被稱為 “Panic Detection“ ,翻譯過來就是 “緊急檢測“ ,它的主要作用是連續(xù)監(jiān)聽用戶的多次后退按鈕事件,當觸發(fā)到一定的臨界值的時候,就直接讓用戶返回到主屏幕。
這樣的一個功能,系統(tǒng)來做其實就比較好理解了,當你被惡意軟件劫持屏幕的時候,如果觸發(fā)了”緊急檢測”的功能,讓用戶可以回到主頁上,就有機會去卸載掉這些惡意軟件。
二、Panic Detection
Panic Detection 現(xiàn)在應該還在測試階段,默認情況下,它現(xiàn)在是處于被關閉的狀態(tài),所以哪怕現(xiàn)在設備運行在 Android 7.1+ 的環(huán)境下,也并不會將這個功能開啟。
關于 Panic Detection 的一些開關配置,可以在 config.xml 文件中找到。
默認情況下,它的值是 0 ,表示什么都不做。而一旦將它設置為 1 之后,就開啟了 Panic Detection 模式,當觸發(fā)到它的時候,會回到主屏幕。
首先,這樣的一個功能,讓我們自己來開發(fā)實現(xiàn)的話,實際上思路大致上也差不多:
需要一個開關配置來標記是否啟用。
需要設置點擊多少次觸發(fā) Panic Detection 模式。
需要設定每次點擊的間隔。
開關配置我們已經(jīng)了解到了,后面的思路,其實有點像我們比較常見,點擊兩次退出 App 的需求實現(xiàn)。
實際上 Google 也是這樣實現(xiàn)的。
它在 PhoneWindowManager.java 中,定義了點擊 Back 鍵,觸發(fā) “Panic Detection“ 的次數(shù)。
PANIC_PRESS_BACK_COUNT 設置的就是進入 Panic 模式的 Back 按鈕點擊的次數(shù)。這里可以看到,配置的是點擊 4 次,就會觸發(fā)。
而 PANIC_PRESS_BACK_NOTHING 和 PANIC_PRESS_BACK_HONE 分別表示了在 config.xml 中配置的 config_backPanicBehavior 的值。
不管 config_backPanicBehavior 是否開啟,用戶每次點擊 back 按鈕,實際上都會被檢查。而當它開啟的時候,首先,系統(tǒng)會攔截 KEYCODE_BACK 事件的按下,并檢查是否多次按下或者是一次長按,然后再來判斷是觸發(fā) Panic Detection 模式,還是將事件向上傳遞給應用程序。
這個的處理是在 PhoneWindowManager.interceptKeyBeforeQueueing() 中完成的。
可以看到,在 KEYCODE_BACK 被按下的時候,會調(diào)用 interceptBackKeyDown() 來處理。
在 interceptBackKeyDown() 方法中,會有一個點擊次數(shù)的計數(shù),來比較當前點擊 Back 鍵的次數(shù),是否達到 PANIC_PRESS_BACK_COUNT 配置的次數(shù)。
一旦沒有達到 PANIC_PRESS_BACK_COUNT 配置的次數(shù),就會移除 MSG_BACK_DELAYED_PRESS 的消息。
而這個 MSG_BACK_DELAYED_PRESS 的消息,是在 interceptBackKeyUp() 發(fā)出的,它攔截了 Back 按鍵的抬起。
從這里可以看出來,它在每次 Back 鍵點擊的時候,都有一個超時的時間(300ms),去檢查是否是連續(xù)的點擊,也就是說,兩次點擊的間隔在 300ms 之間,4 次點擊,會觸發(fā) Panic Detection 模式。
300ms 的值,存儲在 ViewConfiguration.java 中。
接下來再看看發(fā)送出去的 MSG_BACK_DELAYED_PRESS 消息的處理。
最終會調(diào)用 backMultiPressAction() 和 finishBackKeyPress() 方法,在 finishBackKeyPress() 中,會將 Back 按鍵的計數(shù)器置為 0 。
而在 BackMultiPressAction() 中,就會去做啟動 Home 頁的操作。
launchHomeFromHoyKey() 就是真的去執(zhí)行去到桌面的邏輯了,代碼一屏截圖截不下,有興趣可以在線查閱源碼,本文中,所有代碼的截圖,都有行號,可以方便查找。
在線源碼地址:
PhoneWindowManager:https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/services/core/java/com/android/server/policy/PhoneWindowManager.java
ViewConfiguration:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewConfiguration.java
三、小結(jié)
雖然這是一個非常小且未公開的功能,但是仍然能看出 Google 在為 Android 的系統(tǒng)安全問題做努力。
不過 Panic Detection 感覺更像是一個在 Android 系統(tǒng)中的鎮(zhèn)定劑,讓用戶可以有響應的操作自己的設備,回到 Home 頁,但是實際上,真正復雜的過程是如何卸載掉這些惡意程序。不過這個功能應該還在測試階段,期待它的完善能讓 Android 更安全。
Panic Detection 的改動,最早是于 7 月 7 日,被 XDA Developers 的開發(fā)者 @Mishaal Rahman 發(fā)現(xiàn)的,目前也被 Google 確認了。
【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請通過微信公眾號聯(lián)系作者獲取授權(quán)】