Android笔记(二十二):Gradle自定义插件读取assets目录及修改AndroidManifest.xml

背景

由于项目需求,需要在打出apk包前读取assets目录下的文件,以及修改打出的apk包的AndroidManifest.xml文件的权限

过程

  1. 新建一个library模块,改写build.gradle
apply plugin: 'groovy'

sourceSets {
    
    
    main {
    
    
        groovy {
    
    
            srcDir 'src/main/groovy'
        }
        resources {
    
    
            srcDir 'src/main/resources'
        }
    }
}

dependencies {
    
    
    //gradle sdk
    implementation gradleApi()
    //groovy sdk
    implementation localGroovy()

    implementation "com.android.tools.build:gradle:4.0.2"
}
  1. 新建一个groovy类,继承org.gradle.api.Plugin类
class MyPlugin implements Plugin<Project> {
    
    
    private List variantNames = new ArrayList()
    void apply(Project project) {
    
    
        getAllVariantManifestTask(project)
        MyTaskUtil.config(project, variantNames)
    }

    //获取所有的构建变体名称
    void getAllVariantManifestTask(Project project) {
    
    
        project.extensions.findByType(AppExtension.class)
                .variantFilter {
    
    
                    variantNames.add(it.name)
                }
    }

}
  1. 配置自定义task,动态添加AndroidManifest.xml的android.permission.REQUEST_INSTALL_PACKAGES权限及读取assets目录
class MyTaskUtil{
    
    
    static boolean canProcessManifest = false
    static void config(Project project, List variantNames) {
    
    
        //在项目配置完成后,添加自定义Task
        project.afterEvaluate {
    
    
            variantNames.each {
    
    
                try {
    
    
                    def variantName = it.capitalize()
                    Task mergeAssetsTask = project.getTasks().getByName(String.format("merge%sAssets", variantName))
                    CheckAssetsTask assetsTask = project.getTasks().create(String.format("CheckAssets%sTask", variantName), CheckAssetsTask)
                    assetsTask.setMergeAssetsTask(mergeAssetsTask)
                    executeAddPermissionToManifestTask(project, variantName)
                }catch(Exception e1){
    
    
                    PrintUtil.print("handle assets---error:" + e1)
                }
            }
        }
    }

    static void executeAddPermissionToManifestTask(Project project, String variantName){
    
    
        try {
    
    
            def mergeResourcesTask = project.getTasks().getByName(String.format("merge%sResources", variantName))
            File mainManifestFile = new File(project.buildDir, "/intermediates/merged_manifests/" + variantName.uncapitalize() + "/AndroidManifest.xml")
            mergeResourcesTask.doLast {
    
    
                def root = new XmlParser().parseText(mainManifestFile.text)
                root.appendNode("uses-permission", ["xmlns:android": "http://schemas.android.com/apk/res/android", "android:name" : "android.permission.REQUEST_INSTALL_PACKAGES"])
                def updateXmlContent = XmlUtil.serialize(root)
                mainManifestFile.write(updateXmlContent)
            }
        }catch(Exception e){
    
    
        }
    }
}
  1. 自定义task,读取assets目录
class CheckAssetsTask extends DefaultTask {
    
    
    Task mergeAssetsTask
    @TaskAction
    void run(){
    
    
        def outputs = mergeAssetsTask.getOutputs()
        def files = outputs.files.getFiles()
        files.find{
    
    
            def childFile = it.listFiles()
            childFile.find{
    
    
                if (it.toString().contains("xxx")){
    
    
                    //可读取到合并后的assets的某个文件
                }
            }
        }
    }

    void setMergeAssetsTask(Task task){
    
    
        mergeAssetsTask = task
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_40855673/article/details/127035550
今日推荐