Gradle打包APK定制编译信息

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
}

转载请注明作者链接https://www.jianshu.com/p/68b2ffc9cb04

你可能感兴趣的:(Gradle打包APK定制编译信息)