Notification的改进与cancel方法 --看Android系统的系统安全优化

由于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系统的系统安全优化

时间: 2024-10-08 14:57:07

Notification的改进与cancel方法 --看Android系统的系统安全优化的相关文章

在线看Android系统源码,那些相见恨晚的几种方案

请尊重分享成果,转载请注明出处,本文来自逆流的鱼yuiop,原文链接:http://blog.csdn.net/hejjunlin/article/details/53454514 前言:最近在研究MediaCodec,u盘坏了,之前下载的源码也就自然没有了,真是个难过的事情,不能因为没有源码了,就阻挡我的计划了呀,于是就是今天一文,在线看Android源码,加之此前很多人也有向我留言,如何看android系统的源码,今天来敲黑板,划重点了. 不管是做Android底层开发,还是做应用层开发,在

Python——property(使一个方法看起来就像类属性一样)

""" 装饰器property:     使一个方法看起来就像类属性一样 """ #例子1 class A:     def __init__(self,  x, y):         self.__x = x #私有变量         self.__y = y def __add(self): #私有方法         return self.__x + self.__y @property     def sum(self): #通过p

从源码角度看Android系统SystemServer进程启动过程

copy frome :https://blog.csdn.net/salmon_zhang/article/details/93208135 SystemServer进程是由Zygote进程fork生成,进程名为system_server,主要用于创建系统服务. 备注:本文将结合Android8.0的源码看SystemServer进程的启动过程以及SystemServer进程做了哪些重要工作. 1. SystemServer进程启动的起点从<从源码角度看Android系统Zygote进程启动过

【从源码看Android】02MessageQueue的epoll原型

1 开头 上一讲讲到Looper,大家对Looper有了大概的了结(好几个月过去了-) 大家都知道一个Handler对应有一个MessageQueue, 在哪个线程上new Handler(如果不指定looper对象),那么这个handler就默认对应于这个线程上的prepare过的Looper 如下图Handler.java代码所示,mLooper由Looper.myLooper()指定, public Handler(Callback callback, boolean async) { i

.NET获取枚举DescriptionAttribute描述信息性能改进的多种方法

一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显示,一个简单的枚举定义: public enum EnumGender { None, [System.ComponentModel.Description("男")] Male, [System.ComponentModel.Description("女")] Fem

[Android 新特性] 改进明显 Android 4.4系统新特性解析

Android 4.3发布半年之后,Android 4.4随着新一代Nexus5一起出现在了用户的面前,命名为从之前的Jelly Bean(果冻豆)换成了KitKat(奇巧).这个新系统究竟都有怎样的改进.是否值得升级呢,下面就一次为你呈现Android 4.4 的新特性. KitKat不是老手机的救星 众所周知,Android机型一直存在升级难的问题.新版Android系统对配置的要求越来越高,特别是内 存,动辄1GB的需求,让老机型望洋兴叹.也使得很多廉价手机制造商往往更倾向于采用旧版 An

【从源码看Android】03Android MessageQueue消息循环处理机制(epoll实现)

1 enqueueMessage handler发送一条消息 mHandler.sendEmptyMessage(1); 经过层层调用,进入到sendMessageAtTime函数块,最后调用到enqueueMessage Handler.java public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue; if (queue == null) { RuntimeE

三种方法解决android帮助文档打开慢

三种方法解决android帮助文档打开慢 经查是因为本地文档中的网页有如下两段js代码会联网加载信息,将其注释掉后就好了 <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,mediumitalic,bold" title="roboto"> <script src="

从友盟微社区看Android第三方SDK架构实践【转载】

从友盟微社区看Android第三方SDK架构实践[转载] “先写在前面吧,本来想通过链接来转载这篇文章,发现没找到有相关的按钮.上网查了一下,都说博客园没有这功能.我在博客园也有一段时间了,鼓励原创是必须的,不过适当的转载也算是一种将有价值的文章进行分享的方式,不知道以后会不会支持呢!” 原文链接:http://www.csdn.net/article/2015-05-08/2824648-micro-community 摘要:第三方SDK的开发需要考虑很多因素,比如稳定性.灵活性等,并且还要做