美文网首页
Gradle打包APK定制编译信息

Gradle打包APK定制编译信息

作者: dxsdyhm | 来源:发表于2018-04-17 15:14 被阅读0次

    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定制编译信息

          本文链接:https://www.haomeiwen.com/subject/xlzukftx.html