如果你还不会的话,为什么不用walle呢?
github地址:https://github.com/Meituan-Dianping/walle
美团点评开源的一个项目,教程很详细,一看就会,可以说是非常方便了。

如果还是不会的话,如果想自己实现也不难,只需要在build.gradle中简单配置一下就可以了。

Manifest中添加渠道标识(名字可以自定义):data android:value="${UMENG_CHANNEL}" android:name="CUSTOM_NAME" />
//Android Studio3.0 要求每个flavor必须有dimensionflavorDimensions "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=xxxxkeyPassword=xxxxstorePassword=xxxxstoreFile=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,就可以了。

更多相关文章

  1. cocos2d-lua:安卓SDK新手接入准备
  2. Android(安卓)SDK 下载安装及配置
  3. 使用git工具提交上传代码到GitHub上或者远程仓库
  4. Android之AndroidManifest.xml文件解析
  5. lint/pmd/p3c静态代码检查工具的配置与使用
  6. Eclipse+ADT进行Android应用程序的代码混淆和签名
  7. Android(安卓)Fragment的三种应用方式
  8. Android文件存储和读取方式
  9. Android(安卓)Studio报错--记一次学习官方Room教程时踩的各种坑

随机推荐

  1. android 按钮点击的两种方法以及长按事件
  2. Android开发视频教程大总结—23部视频教
  3. Android版块开发资源大汇总
  4. 启动app闪屏问题以及Android自带主题
  5. Android之layout属性介绍
  6. 玩转Android---UI篇---TextView(文本框)
  7. Android(安卓)APN开发流程分析
  8. Akita 一套Android快速开发库 发布1.2版
  9. Andriod AOA协议通信总结
  10. Android多Module合并aar打包