如何排查哪些组件/AAR导入了AndroidManifest中的敏感权限?
这个问题我太熟了!项目模块多的时候逐一排查确实头大,给你几个高效的方法,分分钟定位到引入权限的第三方库:
用Gradle命令输出合并日志(最直接)
直接在终端执行这个命令(Windows用gradlew.bat,Mac/Linux用./gradlew):./gradlew app:mergeDebugAndroidManifest --info执行完后,在输出日志里搜索你关心的权限,比如
android.permission.SEND_SMS或者android.permission.CALL_PHONE,就能看到类似这样的日志:Merging from [com.example:some-library:1.0.0] AndroidManifest.xml:
这条日志直接告诉你,这个权限是来自com.example:some-library:1.0.0这个库。用Android Studio的Manifest合并视图(可视化更直观)
- 打开项目中合并后的Manifest文件:路径一般是
app/build/intermediates/merged_manifests/debug/AndroidManifest.xml(把debug换成release就是发布版的合并文件) - 右键点击这个文件,选择
Show Merged Manifest - 在界面右下角找到
Merging Log面板,在搜索框里输入权限名称,就能看到每个权限的来源库、合并原因,甚至还能看到是否被你的Manifest覆盖或保留。
- 打开项目中合并后的Manifest文件:路径一般是
用dependencyInsight精准排查(针对可疑库)
如果已经通过前两个方法找到了疑似的库,可以用这个命令深入查看它的依赖链:./gradlew app:dependencyInsight --dependency 库的groupId:artifactId比如怀疑是
com.xxx:yyy这个库,就执行./gradlew app:dependencyInsight --dependency com.xxx:yyy,能看到它的所有依赖关系,确认是不是它直接或间接引入了权限。
另外,临时解决的话,你可以在自己的AndroidManifest.xml里添加tools:node="remove"来强制移除这些权限,比如:
<uses-permission android:name="android.permission.SEND_SMS" tools:node="remove" />
不过这只是临时方案,排查到根源后可以考虑替换库或者联系库作者处理。
内容的提问来源于stack exchange,提问作者mianlaoshu

