转发屏蔽第三方SDK权限

本文探讨了如何通过`tools:node=remove`在AndroidManifest.xml中移除第三方SDK的互联网权限,揭示了其在合并manifest过程中背后的原理,以及如何利用该技巧进行权限管理。
摘要由CSDN通过智能技术生成

转发:我在前一篇文章有写关于权限删除和收口的文章,使用的是
hook 打包流程的方案,后来有朋友告知我有一种写法是 tools:node=“remove” ,这样可以直接删除三方 SDK 里的权限,讲实话我也是被他说之后才知道有这么一个写法。比如三方 SDK 里有使用 INTERNET 权限,我想移除它,那只需要在自己的 AndroidManifest.xml 里这么写即可:
在这里插入图片描述

那么来研究一波是这样是如何实现的。
上篇文章也说了,APK 里的 AndroidManifest.xml 其实是被引入的各个 AndroidManifest.xml merge 出来的,具体实现代码可以看 com.android.build.gradle.tasks.MergeManifests 。 

下面直接分析下关于  tools:node="remove" 怎么玩的,先看下调用链:

MergeManifests#doFullTaskAction()
🔽 
AndroidBuilder#mergeManifestsForApplication() 
🔽 
ManifestMerger2#merge() 
🔽 
ManifestMerger2#processOptionalFeatures() 
调用链到这个位置就可以开始分析下源码: 

在这里插入图片描述

当我们使用了 tools:node="remove" 后将会走进上图的 if 里,然后在 ToolsInstructionsCleaner#cleanToolsReferences() 里执行具体操作,还是以 INTERNET 权限为例:

在这里插入图片描述

上图 namedNodeMap 内 nodes 会有两个元素,分别是 android:name="android.permission.INTERNET" 和 tools:node="remove",接着遍历 nodes。

SdkConstants.TOOLS_URI 是 http://schemas.android.com/tools,tools:node="remove" 因此走进 if ,它的 localName 和 nodeValue 分别满足 node 和 remove 条件,于是执行  element.getParentNode().removeChild(element); 删除权限。
tools:node 还有些别的值可以使用,有空可以玩玩。

来源:https://juejin.cn/post/6844903734946840590

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值