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}")
}
})
}
}
}
}