Android 第三方SDK权限检测

1,679 阅读1分钟

前言

最近app隐私政策相关的事情,搞得人真的是一个头两个大啊,公司法务都发来了个几十MB的法律法规文件让我们看,身为开发者居然还要被迫学习法律,真的是醉了呀!写第三方SDK隐私政策相关的文案时,写了个AndroidManifest文件权限列检测的功能,用来查看第三方SDK有没有过渡申请权限。

源码地址

github.com/SHPDZY/Andr…

具体实现代码


android {
    ...
    this.project.afterEvaluate {
        tasks.matching {
            (it.name == "processDebugManifest")
        }.each { task ->
            checkPermission(task)
        }
    }
}

checkPermissionList = ["WRITE_EXTERNAL_STORAGE","READ_EXTERNAL_STORAGE","READ_PHONE_STATE","ACCESS_FINE_LOCATION"]


def checkPermission(Task task) {
    def warningMap = new HashMap<String, ArrayList<File>>()
    def warningList
    task.getInputs().files.files.each {File file->
        if (file.exists() &&file.name.contains("AndroidManifest.xml") && file.text.contains("uses-permission")){
            def androidManifest = new XmlParser().parse(file)
            androidManifest["uses-permission"].each {Node node->
                checkPermissionList.each { String permission->
                    if (node.attributes().toString().contains(permission)){
                        warningList = warningMap.get(permission)
                        if (warningList == null){
                            warningList = new ArrayList<File>()
                        }
                        warningList.add(file)
                        warningMap.put(permission,warningList)
                    }
                }
            }

        }
    }
    println("检测以下权限:${checkPermissionList}\n")
    println("开始打印检测结果\n")
    warningMap.entrySet().each {
        println("包含${it.key}权限的AndroidManifest:")
        it.value.each {File file->
            println(file)
        }
    }
    println("\n检测结果打印结束")
}