如果你还不会的话,为什么不用walle呢?
github地址:https://github.com/Meituan-Dianping/walle
美团点评开源的一个项目,教程很详细,一看就会,可以说是非常方便了。
如果还是不会的话,如果想自己实现也不难,只需要在build.gradle中简单配置一下就可以了。
在Manifest中添加渠道标识(名字可以自定义):
<meta-data android:value="${UMENG_CHANNEL}" android:name="CUSTOM_NAME" />
//Android Studio3.0 要求每个flavor必须有dimension
flavorDimensions "xiaomi" "huawei"
//声明你所有的渠道,名字对应Manifest中的
productFlavors {
xiaomi {
dimension "xiaomi"
//渠道标识
manifestPlaceholders = [UMENG_CHANNEL: "702003"]
//渠道包名不一致时可以单独设置每个包的包名
applicationId = "xx.xx.xx"
}
huawei {
dimension "huawei"
//渠道标识
manifestPlaceholders = [UMENG_CHANNEL: "702002"]
//渠道包名不一致时可以单独设置每个包的包名
applicationId = "xx.xx.xx"
}
}
更多Android Studio3.0的规范详见:
https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html
此外,还需要把我们的签名信息配置到build.gradle中,在android下新建一个signingConfigs
signingConfigs{
custom{
keyAlias "xxxxx"
keyPassword "xxxxx"
storePassword "xxxxx"
storeFile "xxxxx"
}
}
如果不想直接把签名信息写在build.gradle中,也可以自己新建一个文件,然后把信息写进去,在build.gradle中直接调用就可以,我个人不想写在build.gradle中是因为只要稍微一动这个文件,就得sync一次,有点麻烦。
比如我是项目里新建了一个keystore.properties来存储项目的签名信息。然后在build.gradle中调用的时候就是这样的:
//调用keystore.properties,传入你keystore的路径 Grovvy语法,其实和java还是有点相似的
def keystorePropertiesFile = rootProject.file(".../keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
keystore.properties中是这样的:
keyAlias=xxxx
keyPassword=xxxx
storePassword=xxxx
storeFile=xxxx
配置好之后,在build.gralde中的配置就是这样的
signingConfigs{
custom{
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storePassword keystoreProperties['storePassword']
storeFile file(keystoreProperties['storeFile'])
}
}
在android 下的 buildTypes 的 release 下添加:
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为apkname_{version}_{productFlavorName}_{releaseTime}.apk
def fileName = "apkname${getVersionName()}_${variant.productFlavors[0].name}_${releaseTime()}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
signingConfig signingConfigs.custom
//releaseTime方法,Grovvy语法
def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
applicationVariants是系统提供的一个属性,只适用于application module,我们这里用到的variant也是自带的,variant也提供了好多属性,这里用到了outputFile,如果想详细了解:
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Advanced-Build-Customization
如果不同渠道代码会有差异的话,只需要在src下声明你对应渠道的package,然后把对应渠道的文件放到对应目录下就可以了,
比如xiaomi渠道需要替换一个drawable-xhdpi下名字为logo.png的图片,直接在src下新建xiaomi->res->drawable-xhdpi->logo.png(新的图片),打出来的xiaomi渠道包logo.png就是和别的不同的。替换别的文件也是同理。
配置完成后只需要运行 assembleRelease Tasks就可以自动编译了,或者Ter输入./gradlew assembleRelease,或者选择Build->Generate Signed APK,就可以了。
来源:CSDN
作者:德超
链接:https://blog.csdn.net/qq_33667176/article/details/78930730