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
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌面小侠Plus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值