本文将包含两个内容
- 在gralde.build里写代码
- 给gradle.build里的新增代码安置个新家
这篇文章的起因是,as自动生成的包名不是很符合我的需求,随即打算自定义下as所生成的apk名字。
给gradle.build里加点代码
需要的代码如下,放在模块的build.gradle
根节点即可
// 告诉系统我的apk名字叫啥,将在android节点里被我手动调用
def defineApkNameByCustomRules(){
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = generateOutputFileName(output)
}
}
}
// 给上面那个方法用,返回个自定义规则的文件名
def generateOutputFileName(output){
def outputFile = output.outputFile
def outputFileName = "custom"
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def time = new Date().format("YYYYMMdd-HHmmss")
outputFileName = "应用-" + time + ".apk"
}
return outputFileName
}
方法的调用可以在android节点
内执行,如下
android {
// 省略部分代码
defaultConfig {
// 省略部分代码
}
buildTypes {
// 省略部分代码
}
// 使用了下面的自定义方法
defineApkNameByCustomRules()
}
def defineApkNameByCustomRules(){
// 省略代码
}
def generateOutputFileName(){
// 省略代码
}
这样写好后,打出来的包名就会是以下的格式
应用-20200101-121200.apk
结果是想要的,但是代码的摆放不是很好,我们可以优化下代码摆放的位置。
给新增的代码挪个地方
我选择在模块的build.gralde
的同级目录新建一个文件夹,并命名为gradle_methods
,在文件夹内创建文件,并命名为apk_build_helper.gradle
,内部代码如下
// 私有方法,名字和搬家前一样。
// 给下面那个ext.ApkBuildHelper.defineApkNameByCustomRules用的
def generateOutputFileName(output){
def outputFile = output.outputFile
def outputFileName = "custom"
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def time = new Date().format("YYYYMMdd-HHmmss")
outputFileName = "应用-" + time + ".apk"
}
return outputFileName
}
ext.ApkBuildHelper = [
// 方法名和代码搬家前一样
defineApkNameByCustomRules:{ ->
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
// 这里调用了上面那个自定义方法
outputFileName = generateOutputFileName(output)
}
}
}, // 别忘记逗号
// 没具体作用,只是放这里当个打印输出的范例
test: { ->
println('This log from ApkBuildHelper:test ')
},
]
使用的话,只需在模块的build.gradle
里稍作改动即可,如下
// 新增了导入包含所需方法的文件
apply from: 'gradle_methods/apk_build_helper.gradle'
// 省略部分代码
android {
// 省略部分代码
defaultConfig {
// 省略部分代码
}
buildTypes {
// 省略部分代码
}
// 这里的ApkBuildHelper就是自定义文件里的ext.ApkBuildHelper
ApkBuildHelper.defineApkNameByCustomRules()
}
由上面的代码可知道,在外部gralde文件里,def的方法是私有的,如果想要被外部获取到需要和ext建立关系(相关内容后续补充)。
那么自此,一个简单的,使用自定义的,外部脚本的gradle范例,就到此为止了。
感谢阅读 :)
网友评论