1.起因
打包定制化包含但不限于以下几个方面
- BuildType差异配置
- 生成的APK文件名规范化
- 打包时代码与版本的可追溯
2.解决
BuildType差异配置
buildTypes {
release {
//定制不同打包类型中的控制变量
buildConfigField "boolean", "IS_SERVER_TEST", "false"
buildConfigField "String", "DEBUG_INFO", "\"\""
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//签名信息
signingConfig signingConfigs.release
//不同版本使用不同的桌面图标(清单文件中用android:icon="${icon}")
manifestPlaceholders = [icon: "@mipmap/ic_launcher"]
}
debug{
buildConfigField "boolean", "IS_SERVER_TEST", "true"
buildConfigField "String", "DEBUG_INFO", "\"(${BUILD_TIME}_Debug)\""
manifestPlaceholders = [icon: "@drawable/ic_launcher_debug"]
}
beta{
//使用与release相同的配置,类似于继承
initWith(release)
buildConfigField "boolean", "IS_SERVER_TEST", "true"
buildConfigField "String", "DEBUG_INFO", "\"(${BUILD_TIME}_Beta)\""
manifestPlaceholders = [icon: "@drawable/ic_launcher_beta"]
//解决依赖Modlue中不存在此打包类型导致编译报错
matchingFallbacks = ['debug', 'release']
}
}
生成的APK文件名规范化
我们的APK命名要求是:固定头信息_产品名Vversionname(打包者SVN编号数据库版本buildType)时间.apk
eg:XT_AN_FB_DoorBell_V1.6.49(3_19_beta)04161518.apk
- 有些固定信息可用配置文件配置,配置文件不加入版本控制,也不允许上传到仓库,未避免打包出错,在读取配置文件出错的情况下,应配置默认值
//定制output的apk文件名
applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
// 打包类型
def buildTypeName = variant.buildType.name
def svnNumber=0
def productName="Gwell"
Properties properties = new Properties()
if (rootProject.file('local.properties').exists()) {
properties.load(rootProject.file("local.properties").newDataInputStream())
if(properties.get("svnNumber")!=null){
svnNumber=properties.get("svnNumber")
}
if(properties.get("productName")!=null){
productName=properties.get("productName")
}
}
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 打包名称
def flavorName = variant.buildType.name//variant.productFlavors[0].name
// 版本名称
def versionName = defaultConfig.versionName
// XT_AN_FB_DoorBell_V1.6.30(wxy_14_release_1.6.30).apk
def fileName = "${productName}_V${versionName}(${svnNumber}_${DBVERSION}_${flavorName})${BUILD_TIME}.apk"
//gradle 3.0 API修改
//output.outputFile = new File(outputFile.parent, fileName)
outputFileName = fileName
}
}
}
打包时代码与版本的可追溯
在打包时获取版本控制仓库的唯一版本号,将其嵌入到版本号中,本例中我们设计了版本号规则:大版本号小版本号代码版本控制ID
eg: 1.5.1430
//示例展示地是SVN的方法,git同理(注意自己的环境变量配置)
//这里很多人的方案是使用第三方插件或者库,我觉得这样更轻巧,而不是对gradle文件各种修改引入一个“重”库
def getSvnRevisionNumber() {
String Option="HEAD"
String reg="Revision: (\\d+)"
//建议使用Last Changed
String lastChange="Last Changed Rev: (\\d+)"
String info="svn info -r ${Option}".execute().text.trim()
Pattern pattern = Pattern.compile(lastChange)
Matcher matcher = pattern.matcher(info)
while(matcher.find())
return matcher.group(1)
println("getSvnRevisionNumber error,please check and fix it")
return 0
}
//之所以会多这个方法,为了中途使用此方案的APP版本号不至于升地太快,再此做一个转换,此后提交代码库都会使打包地APK代码版本号增加N
def getVersionCode(){
String svnRevision=getSvnRevisionNumber()
int version=Integer.parseInt(svnRevision)
//这种写法起始于1429(对应版本为31) 所以差值增加
//如果更换仓库,版本号不需要运算直接返回即可
println("svn last revision is "+version)
return version-1429+31
}
网友评论