一、需求
对开机广播进行过滤,只有特定的apk才能接收开机广播(包名白名单、或者包名前缀匹配)。
二、需要修改的地方
对于广播的过滤,在frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java这个文件里:
BroadcastQueue.java是Android系统中的一个类,用于管理和处理广播消息的队列。
在Android系统中,广播是一种用于在应用程序之间传递消息的机制。当某个应用程序发送广播时,其他应用程序可以注册相应的广播接收器来接收并处理这些广播消息。
BroadcastQueue.java类负责管理和调度广播消息的传递。它维护了一个广播消息队列,并按照一定的优先级和顺序处理这些消息。它还负责将广播消息分发给注册了相应广播接收器的应用程序。
三、实现
在BroadcastQueue.java修改processNextBroadcast()方法
r.intent.getAction()可以获取要处理的广播,这里匹配开机广播
info.activityInfo.applicationInfo.processName获取apk包名,传入自定义方法isInWhiteList(),该方法用于检查apk是否在白名单中
如果广播为开机广播并且不在白名单中,仿照上面的代码对广播进行处理然后return
注意:许多系统必要的应用都需要接收开机广播自启,需要在白名单中添加这些apk的包名
以下代码可以获取接收开机广播的apk的包名
PackageManager packageManager = getPackageManager();
// 创建一个Intent对象,表示开机广播
Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED);
List<ResolveInfo> receivers = packageManager.queryBroadcastReceivers(bootIntent, 0);
for (ResolveInfo receiver : receivers) {
String packageName = receiver.activityInfo.packageName;
String className = receiver.activityInfo.name;
// 处理应用程序信息,例如打印或存储到列表中
Log.d("", "Package: " + packageName + ", Class: " + className);
}