一、前言
虽然看到这篇文章朋友,知道如何预防一些 Android 下的流氓软件。 但是 Android 的大多数用户,并没有这种预防的意识,基本上每隔一段时间,都会有一些 Android 上的恶意软件而对用户造成损失的事件报出来。
据我所知,有一些恶意软件,会试图获取 Root 权限,然后劫持用户的屏幕,让用户无法离开它设置的界面。当用户无法自由的操作自己的手机屏幕,也就无法进行一些补救措施。
近期 Android 7.1 Nougat 中,悄悄的加入了一项新的安全相关的功能,被称为 “Panic Detection“ ,翻译过来就是 “紧急检测“ ,它的主要作用是连续监听用户的多次后退按钮事件,当触发到一定的临界值的时候,就直接让用户返回到主屏幕。
这样的一个功能,系统来做其实就比较好理解了,当你被恶意软件劫持屏幕的时候,如果触发了”紧急检测”的功能,让用户可以回到主页上,就有机会去卸载掉这些恶意软件。
二、Panic Detection
Panic Detection 现在应该还在测试阶段,默认情况下,它现在是处于被关闭的状态,所以哪怕现在设备运行在 Android 7.1+ 的环境下,也并不会将这个功能开启。
关于 Panic Detection 的一些开关配置,可以在 config.xml 文件中找到。
默认情况下,它的值是 0 ,表示什么都不做。而一旦将它设置为 1 之后,就开启了 Panic Detection 模式,当触发到它的时候,会回到主屏幕。
首先,这样的一个功能,让我们自己来开发实现的话,实际上思路大致上也差不多:
需要一个开关配置来标记是否启用。
需要设置点击多少次触发 Panic Detection 模式。
需要设定每次点击的间隔。
开关配置我们已经了解到了,后面的思路,其实有点像我们比较常见,点击两次退出 App 的需求实现。
实际上 Google 也是这样实现的。
它在 PhoneWindowManager.java 中,定义了点击 Back 键,触发 “Panic Detection“ 的次数。
PANIC_PRESS_BACK_COUNT 设置的就是进入 Panic 模式的 Back 按钮点击的次数。这里可以看到,配置的是点击 4 次,就会触发。
而 PANIC_PRESS_BACK_NOTHING 和 PANIC_PRESS_BACK_HONE 分别表示了在 config.xml 中配置的 config_backPanicBehavior 的值。
不管 config_backPanicBehavior 是否开启,用户每次点击 back 按钮,实际上都会被检查。而当它开启的时候,首先,系统会拦截 KEYCODE_BACK 事件的按下,并检查是否多次按下或者是一次长按,然后再来判断是触发 Panic Detection 模式,还是将事件向上传递给应用程序。
这个的处理是在 PhoneWindowManager.interceptKeyBeforeQueueing() 中完成的。
可以看到,在 KEYCODE_BACK 被按下的时候,会调用 interceptBackKeyDown() 来处理。
在 interceptBackKeyDown() 方法中,会有一个点击次数的计数,来比较当前点击 Back 键的次数,是否达到 PANIC_PRESS_BACK_COUNT 配置的次数。
一旦没有达到 PANIC_PRESS_BACK_COUNT 配置的次数,就会移除 MSG_BACK_DELAYED_PRESS 的消息。
而这个 MSG_BACK_DELAYED_PRESS 的消息,是在 interceptBackKeyUp() 发出的,它拦截了 Back 按键的抬起。
从这里可以看出来,它在每次 Back 键点击的时候,都有一个超时的时间(300ms),去检查是否是连续的点击,也就是说,两次点击的间隔在 300ms 之间,4 次点击,会触发 Panic Detection 模式。
300ms 的值,存储在 ViewConfiguration.java 中。
接下来再看看发送出去的 MSG_BACK_DELAYED_PRESS 消息的处理。
最终会调用 backMultiPressAction() 和 finishBackKeyPress() 方法,在 finishBackKeyPress() 中,会将 Back 按键的计数器置为 0 。
而在 BackMultiPressAction() 中,就会去做启动 Home 页的操作。
launchHomeFromHoyKey() 就是真的去执行去到桌面的逻辑了,代码一屏截图截不下,有兴趣可以在线查阅源码,本文中,所有代码的截图,都有行号,可以方便查找。
在线源码地址:
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
三、小结
虽然这是一个非常小且未公开的功能,但是仍然能看出 Google 在为 Android 的系统安全问题做努力。
不过 Panic Detection 感觉更像是一个在 Android 系统中的镇定剂,让用户可以有响应的操作自己的设备,回到 Home 页,但是实际上,真正复杂的过程是如何卸载掉这些恶意程序。不过这个功能应该还在测试阶段,期待它的完善能让 Android 更安全。
Panic Detection 的改动,最早是于 7 月 7 日,被 XDA Developers 的开发者 @Mishaal Rahman 发现的,目前也被 Google 确认了。
【本文为51CTO专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】