android gradle plugin 3.6以上使用 public.xml 固定 id

本文介绍了一种通过Gradle脚本和aapt2工具来固定Android应用程序中资源ID的方法。该方法能够在每次构建时不改变资源ID,确保应用更新时资源引用的一致性。
 androidResources {
        File publicTxtFile = rootProject.file('public.txt')
        /*
         * public文件存在,则应用,不存在则生成 修改要固定的资源
         * 为了固定通知栏资源Id 首次 public.txt 生成不了可用,需要build一次
         * 生成后,保留需要固定的id,以后有新的id也记得要更新
         */
        if (publicTxtFile.exists()) {
            project.logger.info "${publicTxtFile} exists, apply it."
            //aapt2添加--stable-ids参数应用
            additionalParameters "--stable-ids", "${publicTxtFile}"
        } else {
            project.logger.info "${publicTxtFile} not exists, generate it."
            //aapt2添加--emit-ids参数生成 首次生成不了可以用 gradle 命令打包
            additionalParameters "--emit-ids", "${publicTxtFile}"
        }
    }

适配到 3.6.4 [废弃]

afterEvaluate {
    def android = project.getExtensions().findByName('android')
    android.getApplicationVariants().all { def variant ->
        def mergeResourceTask = project.tasks.findByName("merge${variant.getName().capitalize()}Resources")
        if (mergeResourceTask) {
            mergeResourceTask.doLast {
                //目标转换文件,注意public.xml上级目录必须带values目录,否则aapt2执行时会报非法文件路径
                def pubDir = "intermediates/res/public/${variant.getDirName()}"
                File publicXmlFile = new File(project.buildDir, "${pubDir}/values/public.xml")

                copy {
                    from(android.sourceSets.main.res.srcDirs) {
                        include 'values/public.xml'
                    }

                    into(new File(project.buildDir, pubDir))
                }

                def variantData = variant.variantData
                def scope = variantData.getScope()
                def globalScope = scope.getGlobalScope()
                def mBuildToolInfo
                try {
                    mBuildToolInfo = globalScope.androidBuilder.getTargetInfo().getBuildTools()
                } catch(Exception e) {
                    mBuildToolInfo = globalScope.sdkComponents.buildToolInfoProvider.get()
                }

                def mPaths = mBuildToolInfo.mPaths as Map<Object, String>
                def aapt2 = mPaths.keySet().find({
                    return ("AAPT2".equalsIgnoreCase(it.toString()))
                })

                def outputDir
                try {
                    outputDir = mergeResourceTask.outputDir.get().getAsFile()
                } catch(Exception e) {
                    outputDir = mergeResourceTask.outputDir
                }

                println("======= aapt2: ${mPaths.get(aapt2)}")
                println("======= outputDir: ${outputDir}")

                project.exec(new Action<ExecSpec>() {
                    @Override
                    void execute(ExecSpec execSpec) {
                        execSpec.executable ("${mPaths.get(aapt2)}")
                        execSpec.args("compile")
                        execSpec.args("--legacy")
                        execSpec.args("-o")
                        execSpec.args("${outputDir}")
                        execSpec.args("${publicXmlFile}")
                    }
                })
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值