广播(Broadcast)作为消息传递的一种方式,在Android系统中有着广泛的应用。系统提供了一系列的广播发送、接收接口,可以非常方便的实现广播的传递。系统中相当部分的状态变化也都是通过广播的方式通知到应用的,例如:系统启动完成(Intent.ACTION_BOOT_COMPLETED),电池状态变化(Intent.ACTION_BATTERY_CHANGED),网络连接状态变化(Intent.CONNECTIVITY_ACTION)等。

但同时也引发一个问题,如果任意应用都能随意发送此类广播,势必会引起系统状态的混乱,因此系统一定会有一套机制来保护此类所谓的受限广播。以下以Intent.ACTION_SCREEN_ON为例,深入探究下Android的受限广播保护机制。

Intent.ACTION_SCREEN_ON为屏幕点亮后由系统电源管理服务(PowerManagerService)所发,试想如果任意应用都能随意发送这个广播,则容易被恶意应用利用,造成监听该广播的应用状态、逻辑混乱。因此该广播一定是所谓的受限广播,这点在注释中也得到证实。

This is a protected intent that can only be sent by the system.

系统中发送该广播的代码如上,当然Android中还开放了如下非常丰富的发送广播的接口。这些方法有一个共同点,都调用了ActivityManagerService中的broadcastIntent接口,而这些开放出来的不同的发送广播接口,只是在调用broadcastIntent时传递的参数有所差异,如ordered、sticky等。

在ActivityManagerService的broadcastIntent方法中,首先是对Intent的flags做了一些校验,不是本文讨论范围之内,紧接着便是调用核心的broadcastIntentLocked方法,我们看到,受限保护的检验正是在这里做的。

在以上这段代码中,首先查看调用者的UID,如果是 ROOT:0 SYSTEM_UID:1000 PHONE_UID:1001 BLUETOOTH_UID:1002 SHELL_UID:2000 其中之一,则默认拥有发送受限广播权限,跳过校验过程。否则调用AppGlobals.getPackageManager().isProtectedBroadcast()判断是否为受限广播,如是则抛出权限异常,终止广播流程。

至此,受限广播校验流程基本清晰,那么问题来了,AppGlobals.getPackageManager().isProtectedBroadcast()是以什么依据来判断是否受限广播呢?继续从代码中找答案。

在PackageManagerService中维护了一个散列表mProtectedBroadcasts,用以标识哪些广播是受限的,而AppGlobals.getPackageManager().isProtectedBoradcast()所做的仅仅查询所发广播是否在这个列表中。继续跟谁在维护这个受限广播表,发现只有PackageManagerService.scanPackageLI会往受限表中添加元素,而添加的元素则来自pkg.protectedBroadcasts。

需要说明的是,scanPackageLI会在以下几种情况触发:构造PackageManagerService(扫描apks)、安装全新应用、安装应用更新、卸载系统应用、SD卡Mount/Unmount、APP目录(Framework/System/Vendor)新增文件。scanpackageLI被触发后,会将pkg.protectedcasts中的元素取出,添加到受限表中,由于HashSet的唯一性,不用担心重复添加的问题。因此判断是否受限广播的关键,落在了pkg.protectedBroadcasts上。

protectedBroadcasts是Package类中维护的列表,元素由PackageParser在解析apk时添加。

从PackageParser.parsePackage方法中可以清楚的看到,pkg.protectedBroadcasts对应AndroidManifest.xml中的protected-broadcast标签。回到本文开头的Intent.ACTION_SCREEN_ON广播,我们可以在frameworks/base/core/res/AndroidManifest.xml中找到,对应的package为system/framework/framework-res.apk

至此,我们将受限广播的声明、解析、校验过程全部了解完了。

android受限广播保护机制,Android受限广播保护机制相关推荐

  1. Android 第二十课 广播机制(大喇叭)----发送自定义广播(包括发送标准广播和发送有序广播)

    广播分为两种类型:标准广播和有序广播 我们来看一下具体这两者的具体区别: 1.发送标准广播 我们需要先定义一个广播接收器来准备接收此广播才行,否则也是白发. 新建一个MyBroadcastReceiv ...

  2. Android 进程常驻(5)----开机广播的简单守护以及总结

    这是一个轻量级的库,配置几行代码.就能够实如今android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下.clean master获取root权限下都无法杀死进程 支持系统2.3到 ...

  3. android s静态广播,重走android(3)广播 · sk600’s Studio

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 广播作为android四大组件之一,应用非常广泛,主要通过intent这个"介质"来传递信息,可以完 ...

  4. Android 9.0系统源码_广播(一)广播的注册

    前言 广播作为四大组件之一,使用频率远没有Activity高,但是广播的工作过程还是十分有必要了解的.本系列文章将会逐步讲述广播的注册.发送和接受:而本篇我们要讲的就是广播的注册. 广播的注册分为两种 ...

  5. 8.Android学习之消息、通知、广播与闹钟(二)

    目录 8.消息.通知.广播与闹钟(二) 3.使用Notification类在状态栏上显示通知 4.BroadcastReceiver类的使用 4-1.BroadcastReceiver类简介 4-2. ...

  6. android 广播解绑,Android四大组件之BroadCast

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android四大组件之BroadCast 一.广播概述 Android应用可以从Android系统和其他Android ...

  7. android 广播的权限,Android四大组件详解之BroadcastReceiver广播接收者

    Android四大组件详解---BroadcastReceicer广播接收者 广播有两个角色,一个是广播发送者,另一个是广播接收者. 广播按照类型分为两种,一种是全局广播,另一种是本地广播 全局广播: ...

  8. android广播intent原理,Android中BroadcastReceiver详解

    BroadcastReceiver是什么? Android app可以发送广播也可以接收系统或者其它app发送的广播,是发送/订阅的设计模式.这些广播被发送当重要的事件发生的时候.例如,安卓系统发送广 ...

  9. android 8.0 移除静态注册广播

    Android O 前瞻 - 是时候和 Implict Broadcast 说再见了 Hevin 5 个月前 简评:果然省电是 Android O 的第一任务. 日前,Android O 预览版已经发 ...

  10. Android深入四大组件(八)广播的注册、发送和接收过程

    前言 我们接着来学习Android四大组件中的BroadcastReceiver,广播主要就是分为注册.接收和发送过程.建议阅读此文前请先阅读Android深入理解四大组件系列的文章,知识重复的部分, ...

最新文章

  1. UIView Animation
  2. z390 黑苹果启动盘_不到800元买块1TB固态,折腾一下黑苹果的安装
  3. Android实现文字一个一个显示出来
  4. 公文字体字号标准2020_党政机关公文格式典型错误20例,引起重视!
  5. C语言课程设计---歌厅歌曲管理系统
  6. onvif device manager 找不到ipc_Qt音视频开发32-Onvif网络设置
  7. centos6.2安装jdk7
  8. ExtJs4 笔记(12) Ext.toolbar.Toolbar 工具栏、Ext.toolbar.Paging 分页栏、Ext.ux.statusbar.StatusBar 状态栏...
  9. 你还在用HTTP吗?HTTP/3都来了。。。
  10. AD17 保存PCB文件时提示失败
  11. java开发kpi考核_如何量化考核技术人的KPI?
  12. 欠阻尼衰减振荡Matlab语言,欠阻尼振荡曲线的衰减系数怎么求
  13. python请输入一个三位数输出该三位数的逆序数_编写程序,从键盘输入一个三位数,求出其逆序数并输出,例如输入123,输出321。...
  14. MySQL权限篇之SHOW DATABASES及SHOW VIEW
  15. android WebView多标签,加速解决卡顿,视频播放笔记
  16. 小红书销售情况(EDA/RFM)
  17. 佳能EOS20D本站真机评测 下
  18. Kafka入门和使用
  19. 6. Jetpack---Paging你知道怎样上拉加载吗?
  20. 荣耀10的android在哪,荣耀10详细配置参数,你想知道的都在这里

热门文章

  1. 微信小程序开发指南介绍
  2. Python输入两个数,求和,十进制数转换为二级制八进制十六进制的两个程序的代码
  3. java——IDEA集成开发工具的介绍、下载、安装(教育邮箱申请)
  4. 90后用HTTP写了一篇恋爱日记
  5. 我们的电力运维云平台,如何使用数字孪生进行“管电”
  6. 币圈牛熊你穿越了几个?这些都get到了吗?
  7. 3.1 KickStart 无人值守批量安装Linux系统
  8. 快步英语说文解字颠覆中国传统英语教学模式
  9. 10- ESP8266自主WiFi配网
  10. openjudge 1.5.31 开关灯