由于Android市场管理的不健全,很多APP都通过向通知栏投广告的方式诱导用户点击,广告多了,很是烦心。
因此好多安全软件提供了去通知栏广告的功能,甚至Android在4.2以后提供了disable某个app的notification功能,来净化通知栏。可见通知栏的控制对于用户来说至关重要。
安卓安全小分队在研究这一功能时,希望提出一些建设性的意见供大家参考。
一、组织结构
1. NotificationManagerService
NotificationManagerService 是通知栏的大总管,负责处理所有APP发送来的通知消息。其功能非常简单,查看NotificationManagerService.java的代码可以得知。
NMS做的工作大致可分为:
a. 查询/设置某个APP的发通知能力(可禁用某APP发送通知,4.2版本后推出);
b. 接受APP发送的通知;
c. 记录notification数据;
d. 发送应该显示的通知到通知栏(StatusBar)
e. 删除某条通知;
2. NotificationRecord
如果大家认为Notification类是NMS用来存储Notification的信息的数据结构那就大错特错了,在NMS内部是用NotificationRecord来存储的,其中包括了Notification类。
除了Notification类以外NMS还记录了关于此条通知的其他信息,包括packageName, tag, id, score等。因此如果某个安全软件需要查询系统中存在的Notification,光去查Notification类本身是不够的,应该去查询NotificationRecord才能正确找到需要删除的通知。可是这个类是定义在NMS
内部的,而且属性为private,安全软件想要获取是异常辛苦的。
二、cancel方法
NMS的cancel方法有两种。
1. cancelNotificationWithTag((String pkg,String tag, int id)。通过Tag和id组合来删除特定的通知。
2. cancelAllNotifications(String pkg)。删除某个package下的所有notification。
这两种方法都没有对外暴露,普通的APP只能通过NotificationManager的cancel方法来cancel自己发出去的通知(NotificationManager最终还是会调用到NMS里的那两个cancel方法的)。如果安全软件要动别人的通知,那就需要额外做些努力了,我们了解到的,可以在root之后通过反射来调用。
三、我们的想法
有需求就会有实现,在4.0时代,通知栏还不支持禁用某个APP的推送通知功能。但是可能是在众多用户的呼吁下,在4.2时代,google添加了setNotificationsEnabledForPackage(String
pkg, boolean enabled)函数,使用户可以禁用掉自己厌烦的广告信息。此函数的调用是在“设置”里,如前图所示,去掉Show Notification的勾APP就不会再推送消息了。
同理,笔者认为,对于安全软件商来说,在系统中开放若干查询和删除notification的接口,对于用户和安全软件来说都大有益处,和系统对“设置”开放了setNotificationsEnabledForPackage接口的初衷一样。我们的理念是,避免手机被root,对于安全软件,只要开放合适的权限和提供必要的接口,满足安全需要就够了。这样,一来可以避免手机被root后各种无良软件绑架手机,肆意破坏;一来也给优秀的正规的安全软件以方便之门,让他们以人性化、界面友好的方式为我们提供安全保障服务。
就查询notification的功能来说,我们可以将NMS记录的notification信息整理到一起,对外暴露接口以方便查询。在查询接口中对调用者的签名进行验证,以保证只有合格的安全软件才可以使用。
同理对于cancel方法,我们也可以用同样原理,在检查了签名后直接调用NMS的两个cancel方法。
Android系统本身应该是属于安全型的系统,用户主动或被动的root了自己的手机,就违背了Android的初衷,导致了各种后遗症的产生。放开了Android系统对软件的监管,使Android系统变得不安全。就像打开了潘多拉盒子,在得到便利的同时,系统也更加容易受到攻击。
所以我们还是重申我们的主张,手机安全还是要从系统入手,只要系统本身能够提供安全软件的功能,或者有针对性地将系统接口给安全软件使用,那么,安卓系统在安全上的“水土不服”就能够解决了。
转载自 http://bbs.51cto.com/thread-1035850-1.html
Notification的改进与cancel方法 --看Android系统的系统安全优化