需求
没有需求,自己看了一眼自己之前写的打包脚本,简直无法看下去。而且,产品经理的定制化需求越来越多,用shell脚本的可读性也越来越差,再加上里面一堆的sed命令,惨不忍睹。
分析
gradle其实支持自定义参数,关于自定义参数的介绍,参考官方文档: https://docs.gradle.org/current/userguide/build_environment.html,简单说一下用到的:[Gradle properties]( https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties):
有两种方式传给gradle,一种是-P。
1 |
gradlew clean -Pname=zhangsan |
另一种是gradle.properties,我们可以在build.gradle文件所在的目录下创建一个gradle.properties文件,写上
1 |
name=zhangsan |
通过这两种方式,在gradle脚本中就可以直接使用这个变量名。
比如如下的gradle配置,其中包含了int型,String型,boolean型,基本能满足需求了。
1 |
buildConfigField "boolean", "SHOW_INFO", "$SHOW_INFO" |
对应的gradle.properties文件
1 |
VERSION_NAME=1.2 |
结合jenkins的参数化构建
通常用jenkins在构建的时候,都会自定义一些参数,比如上文的VERSION_NAME,VERSION_CODE。当然,我们还有个奇葩的需求,改包名。
jenkins在搭建的时候,构建那一步一定要选
invoke gradle script
,点开下面的高级选项,勾选
Pass all job parameters as Project properties
,勾选这一项会将jenkins参数化构建时的参数写到gradle中,还会替换掉gradle.properties中的默认值。其实就是通过-P把参数传到了gradle,-P传入的优先级高于properties文件。
一定要保证参数名和gradle.properties文件中的名字一样!!!
一定要保证参数名和gradle.properties文件中的名字一样!!!
一定要保证参数名和gradle.properties文件中的名字一样!!!
和包名绑定的配置
1 |
cp -f $PACKAGE_NAME.properties gradle.properties |
像一些构建时jenkins传入的参数,可以不在
包名.properties
里出现,但是,默认的gradle.properties文件必须有这些值,在as run的时候,还是得在gradle.properties中有个默认值的。但jenkins选了
invoke gradle script
,这些参数会通过-P传进去。
manifest文件
manifest文件中,也会配置一些值,可以通过placeHolder传进去。比如channel
1 |
defaultConfig { |
在manifest中可以通过${channel}来使用,manifest中的authorities也可以通过这种方式来处理。
改应用名
1 |
sed -i 's/默认应用名/'"$APP_NAME"'/g' myflavor/res/values/stringfile.xml |