BroadcastReceiver Hook

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 参数。

    原文作者:Achillisjack
    原文地址: https://blog.csdn.net/u012439416/article/details/76397410
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞