如何禁止第三方库的ContentProvider启动

230 阅读1分钟

在打包APK时,删除AndroidManifest.xml中ContentProvider声明即可,示例代码如下(可放在app/build.gradle中):

android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        output.processManifestProvider.getOrNull().doLast { task ->
            def directory = task.getMultiApkManifestOutputDirectory().get()
            def manifestPath = "$directory/AndroidManifest.xml"
            def xml = new groovy.xml.XmlParser().parseText(file(manifestPath).getText())
            NodeList list = xml.application[0].provider
            for (Node node : list) {
                def map = node.attributes()
                for (Map.Entry<Object, Object> entry : map.entrySet()) {
                    def localPart = entry.getKey().getLocalPart()
                    if ("name" != localPart) {
                        continue
                    }
                    String value = entry.getValue()
                    // 移除AndroidX声明的ContentProvider,如androidx.startup.InitializationProvider
                    if (value.contains("androidx") || value.contains("UtilsFileProvider")) {
                        node.parent().remove(node)
                        break
                    }
                }
            }

            def serialize = groovy.xml.XmlUtil.serialize(xml)
            file(manifestPath).write(serialize)
        }
    }
}

前人栽树后人乘凉,感谢大佬(此文章中某些方法在Gradle高版本中没有了): www.jianshu.com/p/21122d666…