gradle多渠道自动化打包

本文参考:https://github.com/D-clock/Doc/blob/master/Android/Gradle/6_Gradle%E5%A4%9A%E6%B8%A0%E9%81%93%E5%92%8C%E8%87%AA%E5%8A%A8%E5%8C%96%E6%89%93%E5%8C%85%EF%BC%88%E6%B7%B1%E5%85%A5%E7%AF%87%EF%BC%89.md

1、基础使用

首先在AndroidMainfest中加入渠道信息:


然后配置app中的gradle:

android {
   ...
    productFlavors{
        wandoujia {}
        qihu360 {}
        baidu {}
    }

    productFlavors.all{
        flavor ->
            flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
    }
}

然后就可以批量打包了:


gradle多渠道自动化打包_第1张图片
批量打包

但是呢,一般多渠道的时候会有一个渠道id,这个也想批量打包的时候加进去,步骤如下:
首先在AndroidMainfest中加入渠道信息和渠道id:

        
        

然后配置app中的gradle:

    productFlavors {
        wandoujia {
            manifestPlaceholders=[CHANNEL_VALUE: 'wandoujia',CHANNEL_ID:100]
        }
        qihu360 {
            manifestPlaceholders=[CHANNEL_VALUE: '360',CHANNEL_ID:101]
        }
        baidu {
            manifestPlaceholders=[CHANNEL_VALUE: 'baidu',CHANNEL_ID:102]
        }
    }

注意:这个地方是没有:

productFlavors.all{
        flavor ->
            flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
    }

这段代码的,其实也能够看出来,这段代码是用来循环的。

二、打包签名配置

打包签名的配置分为两种情况,一种是AS打包,直接输入密码等信息。另外一种是命令行进行打包操作,这时候需要在gradle中配置相关信息,如:

android {
    ...
    signingConfigs {
        debug {
        }
        release {
            storeFile '打包签名路径'
            storePassword 'XXX'
            keyAlias 'XXX'
            keyPassword 'XXX'
        }
    }

}

这样的话提交代码后大家都知道,但是相对不是很安全,还有一种方式是建立signing.properties文件:

gradle多渠道自动化打包_第2张图片
signing.properties

配置好一些信息,提交代码的时候不用提交上去即可:

gradle多渠道自动化打包_第3张图片
配置

然后再gradle中配置:

android {
    ...
    signingConfigs {
        debug {
        }
        release {
            storeFile 
            storePassword 
            keyAlias 
            keyPassword 
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release //设置签名信息
        }
    }
}

//读取文件中的信息来配置打包签名
File propFile = file('signing.properties');
if (propFile.exists()) {
    def Properties props = new Properties()
    props.load(new FileInputStream(propFile))
    if (props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&
            props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {
        android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
        android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
        android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
        android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
    } else {
        android.buildTypes.release.signingConfig = null
    }
} else {
    android.buildTypes.release.signingConfig = null
}

    ....

三、修改生成apk包名

示例:

apply plugin: 'com.android.application'

//获取产品的名字
def getProductName() {
    return "clock"
}
//获取当前系统的时间
def releaseTime() {
    return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
android {
    ...
    signingConfigs {
        ...
    }
    buildTypes {
        ...
    }
    //修改生成的apk名字,格式为 app名_版本号_打包时间_渠道名_release.apk
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def oldFile = output.outputFile
            if (variant.buildType.name.equals('release')) {
                def releaseApkName = getProductName() + "_v${defaultConfig.versionName}_${releaseTime()}_" + variant.productFlavors[0].name + '_release.apk'
                output.outputFile = new File(oldFile.parent, releaseApkName)
            }
        }
    }

}

四、其它

打包的时候还有另外一些配置问题,如:配置混淆规则,配置混淆优化,移除无用的资源文件,压缩对齐apk包,突破65535个方法限制等等。后续会再进行学习。

你可能感兴趣的:(gradle多渠道自动化打包)