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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值