4, BroadcastReceiver Hook
BroadcastReceiver分为三个步骤: 注册, 发送和接收.
并且BroadcastReceiver按照注册分为动态广播和静态广播。
当然,插件中的静态广播按照动态广播进行处理。并且宿主根本不知道插件程序会注册哪些receiver,
AndroidManifest.xml也不会有这些receiver。
还有一个问题,静态广播时什么时候动态注册的呢?也就是插件的AndroidManifest.xml的静态receiver何时注册呢?
4.1 注册静态广播
静态广播当然也是动态注册。
首先看Instrumentation的callApplicationOnCreate方法,如下,
public void callApplicationOnCreate(Application app) {
app.onCreate();
}
里面调用了Application的onCreate方法,也就是说,在Application的onCreate方法之前会调用Instrumentation的
callApplicationOnCreate方法,并且Application的onCreate方法在Activity/Service的onCreate方法之前调用,因此
可以在Instrumentation的callApplicationOnCreate里进行广播的注册。
PluginInstrumentation的callApplicationOnCreate有关注册广播的代码如下,
PluginProcessManager.registerStaticReceiver(app, app.getApplicationInfo(), app.getClassLoader());
PluginProcessManager的registerStaticReceiver主要逻辑如下,
1, 解析插件程序需要注册的所有静态receiver的列表
List<ActivityInfo> infos = PluginManager.getInstance().getReceivers(pluginApplicationInfo.packageName, 0);
2, 获取IntentFilter,然后根据类名加载对应的receiver类,最后通过registerReceiver()完成动态注册。
for (ActivityInfo info : infos) {
if (TextUtils.equals(info.processName, myPname)) {
try {
List<IntentFilter> filters = PluginManager.getInstance().getReceiverIntentFilter(info);
for (IntentFilter filter : filters) {
BroadcastReceiver receiver = (BroadcastReceiver) cl.loadClass(info.name).newInstance();
context.registerReceiver(receiver, filter);
}
•••
4. 2 动态广播注册
当然,动态广播的注册最后会通过AMS完成,调用AMS的registerReceiver方法。
IactivityManagerHookHandle的内部类registerReceiver的beforeInvoke方法如下,
if (args != null && args.length > 0) {
for (int index = 0; index < args.length; index++) {
if (args[index] instanceof String) {
String callerPackage = (String) args[index];
if (isPackagePlugin(callerPackage)) {
args[index] = mHostContext.getPackageName();
}
}
}
}
也是会修改一下PackageName 参数。