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