查看 AndroidManifest 合并后的 permission 来自哪里
一、来源
同步后合并的 AndroidManifest.xml 文件位于 /app/build/intermediates/manifests/full/debug/AndroidManifest.xml。
AndroidManifest.xml 中内容的来源:
- 项目自身 AndroidManifest.xml
- 子 module 中的 AndroidManifest.xml
- 依赖中的 AndroidManifest.xml
- gradle 中的代码修改
二、查看
2.1 来自文件
2.1.1 直接查看
项目自身、子 module、依赖中都有 AndroidManifest.xml,最终会合成一份。
项目自身、子 module 可以直接到文件处查看。
依赖中的 AndroidManifest.xml 查看:
在 External Libraries 中点击某个 aar 的 classes.jar,右键选择 Reveal in Finder,在 classes.jar 的上层目录就能看到 AndroidManifest.xml,然后就可以挨个查看了。
2.1.2 自定义 Task
当集成的依赖很多时,一个个查看太麻烦,可以通过一个自定义 Task 来实现。processDebugManifest
这个 Task 用来合并 AndroidManifest.xml,我们可以通过它得到它的输入文件,从而进行分析。
以 android.permission.ACCESS_FINE_LOCATION 为例:
在 build.gradle 中加入
afterEvaluate {
tasks.matching {
(it.name == "processDebugManifest")
}.each { task ->
String permission = "android.permission.ACCESS_FINE_LOCATION"
task.getInputs().files.files.each {
if (findPermission(it, permission)) {
println("输入文件:$it has permission $permission")
}
}
}
}
def findPermission(File xmlFile, String permission) {
def android = new Namespace('http://schemas.android.com/apk/res/android', 'android')
def androidManifest = new XmlParser().parse(xmlFile)
def hasPermission = false
androidManifest["uses-permission"].each {
def permissionName = it.attributes().get(android.name)
if (permissionName == permission) {
hasPermission = true
}
}
return hasPermission
}
同步后,在 build 窗口就可以看到带有该权限的 AndroidManifest.xml,这样就可以分析了
输入文件:/Users/gdeer/.android/build-cache/75763cae25bfa2ec0f31ac42a948b5f67acbc5a9/output/AndroidManifest.xml has permission android.permission.ACCESS_FINE_LOCATION
输入文件:/Users/gdeer/.android/build-cache/129f490776ca4e6c0f5f85d27ab02d9eea983ac8/output/AndroidManifest.xml has permission android.permission.ACCESS_FINE_LOCATION
输入文件:/Users/gdeer/.android/build-cache/113e629d13c24321ffb305db01c8208b9b6e9476/output/AndroidManifest.xml has permission android.permission.ACCESS_FINE_LOCATION
2.1.3 Android Studio 功能
使用 Android Studio 自带的功能就可以很清楚地查看。
也可以直接查看合并日志:/app/build/outputs/logs/manifest-merger-debug-report.txt
2.2 来自代码
Task的修改:查看 Task 代码
插件的修改:一一去除 apply plugin xxx
,查看同步后的 AndroidManifest.xml 是否改变