Hook匹配过程----之二

8.2 Service匹配

PluginManager的resolveService方法调用流程图如下,


IpluginManagerImpl的resolveService方法如下,

List<ResolveInfo> infos = IntentMatcher.resolveServiceIntent(mContext, mPluginCache, intent, resolvedType, flags);
if (infos != null && infos.size() > 0) {
    return IntentMatcher.findBest(infos);
}

直接调用的是IntentMatcher的resolveServiceIntent方法,主要逻辑如下,

1,对于有包名的intent,直接查找插件对应的包名的PluginPackageParser。

PluginPackageParser parser = pluginPackages.get(comp.getPackageName());
if (parser != null) {

queryIntentServiceForPackage(context, parser, intent, flags, list);

2,否则,对于每一个插件都得去匹配一下intent,展开地毯式搜索。

for (PluginPackageParser parser : pluginPackages.values()) {
      queryIntentServiceForPackage(context, parser, intent, flags, list);
}

queryIntentServiceForPackage主要逻辑如下,

1,获取插件中的所有Service

List<ServiceInfo> serviceInfos = packageParser.getServices();

2,获取每个Service的所有IntentFilter,

if (serviceInfos != null && serviceInfos.size() >= 0) {
for (ServiceInfo serviceInfo : serviceInfos) {
     ComponentName className = new ComponentName(serviceInfo.packageName, serviceInfo.name);
     List<IntentFilter> intentFilters = packageParser.getServiceIntentFilter(className);

都是利用packageParser中的变量,这些变量在解析完成时赋值的。

3,对IntentFilter进行匹配

if (intentFilters != null && intentFilters.size() > 0) {
    for (IntentFilter intentFilter : intentFilters) {
         int match = intentFilter.match(context.getContentResolver(), intent, true, "");
         if (match >= 0) {
            ServiceInfo flagServiceInfo = packageParser.getServiceInfo(new ComponentName(serviceInfo.packageName, serviceInfo.name), flags);
              if ((flags & PackageManager.MATCH_DEFAULT_ONLY) != 0) {
                   if (intentFilter.hasCategory(Intent.CATEGORY_DEFAULT)) {
                        ResolveInfo resolveInfo = newResolveInfo(flagServiceInfo, intentFilter);
                        resolveInfo.match = match;
                        resolveInfo.isDefault = true;
                        outList.add(resolveInfo);
                   } else {
                    //只是匹配默认。这里也算匹配不上。
                }
          } else {
             ResolveInfo resolveInfo = newResolveInfo(flagServiceInfo, intentFilter);
             resolveInfo.match = match;
             resolveInfo.isDefault = false;
             outList.add(resolveInfo);
   }
•••

8.3 广播匹配

PluginManager的resolveService方法调用流程图如下,


IntentMatcher的resolveReceiverIntent方法,主要逻辑如下,

1,对于有包名的intent,直接查找插件对应的包名的PluginPackageParser。

PluginPackageParser parser = pluginPackages.get(comp.getPackageName());
if (parser != null) {
queryIntentReceiverForPackage (context, parser, intent, flags, list);

2,否则,对于每一个插件都得去匹配一下intent,展开地毯式搜索。

for (PluginPackageParser parser : pluginPackages.values()) {
      queryIntentReceiverForPackage (context, parser, intent, flags, list);
}

queryIntentReceiverForPackage主要逻辑如下,

1,获取插件中的所有Receiver

List<ActivityInfo> receivers = packageParser.getReceivers();

2,获取每个Receiver的所有IntentFilter,

if (receivers != null && receivers.size() >= 0) {
   for (ActivityInfo receiver : receivers) {
        List<IntentFilter> intentFilters = packageParser.getReceiverIntentFilter(receiver);

都是利用packageParser中的变量,这些变量在解析完成时赋值的。

3,对IntentFilter进行匹配

if (intentFilters != null && intentFilters.size() > 0) {
    for (IntentFilter intentFilter : intentFilters) {
         int match = intentFilter.match(context.getContentResolver(), intent, true, "");
         if (match >= 0) {
            ActivityInfo flagInfo = packageParser.getReceiverInfo(new ComponentName(receiver.packageName, receiver.name), flags);
            if ((flags & PackageManager.MATCH_DEFAULT_ONLY) != 0) {
                 if (intentFilter.hasCategory(Intent.CATEGORY_DEFAULT)) {
                      ResolveInfo resolveInfo = newResolveInfo(flagInfo, intentFilter);
                      resolveInfo.match = match;
                      resolveInfo.isDefault = true;
                      outList.add(resolveInfo);
                  } else {
                 //只是匹配默认。这里也算匹配不上。
              }
          } else {
              ResolveInfo resolveInfo = newResolveInfo(flagInfo, intentFilter);
              resolveInfo.match = match;
              resolveInfo.isDefault = false;
              outList.add(resolveInfo);
}
•••

8.4 ContentProvider匹配

ContentProvider的匹配过程在此就不论述了,和前面三大组件的过程完全相同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值