如何动态禁用Facebook的初始化provider

问题背景

最新的FaceBook的的初始化已经放在了provider中了.这样倒是方便了使用.不过缺少了控制.
比如最近遇到点问题,需要根据渠道号动态的禁用Facebook的初始化.如果去掉sdk.则需要修改挺多的代码.

思路

替换Facebook的初始化provider,因为provider是放在aar中的.所以需要替换的时候有点难度

解决办法

编写替换脚本

创建一个patch.gradle脚本

// Top-level build file where you can add configuration options common to all sub-projects/modules.
def  runtime_config_file =  rootProject.getRootDir().getAbsolutePath() + '/runtime_config'



project.afterEvaluate{


    tasks.getByName("preReleaseBuild"){
        it.doFirst{
            println "generate release configuration for ${project.name}"
            def configFile = new File(runtime_config_file)
            configFile.withOutputStream{os->
                os << "I am release"
            }
        }
    }

    project.tasks.getByName("preDebugBuild") {
        it.doFirst {
            project.android.applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.processManifest.doLast {
                        def manifestFile = "${project.getProjectDir().absolutePath}/build/intermediates/merged_manifests/${variant.dirName}/AndroidManifest.xml"
//                        def configFile = new File(runtime_config_file)
//                        configFile.writeOutputStream{os ->
//                            os << manifestFile
//                        }
                        def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("com.facebook.FacebookContentProvider", "com.wx.app.utils.FacebookContentProvider")
                        new File(manifestFile).write(updatedContent, 'UTF-8')
                    }
                }
            }
        }
    }
}

复制代码

引入脚本

在app的build.gradle中引入下面的代码

apply from: rootProject.getRootDir().getAbsolutePath() + “/patch.gradle”

作用

这个脚本会在编译app模块时,debug模式下修改AndroidManifest.xml中的facebook的初始化provider

替换成自己的初始化类.

检测

可以把生成的apk放在android studio中看下里面的AndroidManifest.xml中是否还有facebook的初始化类.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享