前言:

因为公司项目需要发布到更多的平台上,以供用户下载。打包就成了一个很大的问题。利用原本的打包方式,又慢油耗。主要是电脑慢的话,打一个包都已经要一俩分钟了,如果需要发布的渠道多的话,那么真的就GG了。

当然第一想到的还是使用第三方框架来实现。原始的做法如何配置渠道打包我这就不介绍啦。咱们主要讲的就是使用VasDolly来配置完成打包的过程。

这个框架是腾讯的开源框架,大家可以了解一下,VasDolly实现原理

大家可以对比一下目前比较流行的三个框架,VasDolly、packer-ng-plugin、Walle。选择适用自己的。

正文:

先贴一下全部的配置代码

apply plugin: 'com.android.application'
apply plugin: 'channel'android {compileSdkVersion rootProject.ext.android.compileSdkVersionbuildToolsVersion rootProject.ext.android.buildToolsVersiondefaultConfig {minSdkVersion rootProject.ext.android.minSdkVersiontargetSdkVersion rootProject.ext.android.targetSdkVersionversionCode rootProject.ext.android.versionCodeversionName rootProject.ext.android.versionNamemultiDexEnabled truendk {abiFilters "armeabi", "armeabi-v7a", "x86", "mips"}}sourceSets rootProject.ext.android.sourceSetsdexOptions {javaMaxHeapSize "4g"}flavorDimensions 'default'//等更新到3.0.0的版本AS更换成这个android.applicationVariants.all { variant ->if (variant.buildType.name == "debug") {// 服务器地址buildConfigField "String", "HOST", "\"http://testBaidu.com/\""} else if (variant.buildType.name == "release") {// 服务器地址buildConfigField "String", "HOST", "\"http://www.baidu.com/\""}variant.outputs.all {outputFileName = "app-${variant.versionName}.apk"}}signingConfigs {debug {storeFile file("test.keystore")storePassword "android"keyAlias "test"keyPassword "123456"}release {storeFile file("test.keystore")storePassword "android"keyAlias testkeyPassword "123456"v1SigningEnabled true//开启V1签名v2SigningEnabled true//开启V2签名}}buildTypes {debug {signingConfig signingConfigs.debugproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'debuggable true}release {signingConfig signingConfigs.releasedebuggable falseminifyEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}dataBinding {enabled = true}packagingOptions{exclude "META-INF/rxjava.properties"exclude 'META-INF/DEPENDENCIES.txt'exclude 'META-INF/NOTICE'exclude 'META-INF/NOTICE.txt'exclude 'META-INF/LICENSE'exclude 'META-INF/LICENSE.txt'}useLibrary 'org.apache.http.legacy'//直接编译生成多渠道包//命令行操作打包,gradlew channelDebug、gradlew channelReleasechannel{//指定渠道文件channelFile = new File(project.rootDir, "channel.txt")//多渠道包的输出目录,默认为new File(project.buildDir,"channel")baseOutputDir = new File(project.rootProject.buildDir,"channel")//多渠道包的命名规则,默认为:${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}apkNameFormat ='${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}'//快速模式:生成渠道包时不进行校验(速度可以提升10倍以上,默认为false)isFastMode = false//buildTime的时间格式,默认格式:yyyyMMdd-HHmmssbuildTimeDateFormat = 'yyyyMMdd-HH:mm:ss'//低内存模式(仅针对V2签名,默认为false):只把签名块、中央目录和EOCD读取到内存,不把最大头的内容块读取到内存,在手机上合成APK时,可以使用该模式lowMemory = false}/*根据已有基础包重新生成多渠道包rebuildChannel {//命令操作打包 gradlew rebuildChannel//指定渠道文件channelFile = new File(project.rootDir, "channel.txt")//存在的基础包路径baseDebugApk = 已有Debug APKbaseReleaseApk = 已有Release APK//默认为new File(project.buildDir, "rebuildChannel/debug")debugOutputDir = Debug渠道包输出目录//默认为new File(project.buildDir, "rebuildChannel/release")releaseOutputDir = Release渠道包输出目录//快速模式:生成渠道包时不进行校验(速度可以提升10倍以上,默认为false)isFastMode = false//低内存模式(仅针对V2签名,默认为false):只把签名块、中央目录和EOCD读取到内存,不把最大头的内容块读取到内存,在手机上合成APK时,可以使用该模式lowMemory = false}*/aaptOptions {cruncherEnabled = falseuseNewCruncher = false}
}dependencies {//extra lib for libs packageimplementation fileTree(include: ['*.jar'], dir: 'libs')androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {exclude group: 'com.android.support', module: 'support-annotations'})testImplementation rootProject.ext.dependencies.junitimplementation rootProject.ext.dependencies.cardviewV7implementation rootProject.ext.dependencies.multideximplementation rootProject.ext.dependencies.percentimplementation rootProject.ext.dependencies.constraintLayoutimplementation rootProject.ext.dependencies.butterknifeannotationProcessor rootProject.ext.dependencies.butterknifeCompilerimplementation rootProject.ext.dependencies.switchbuttonimplementation rootProject.ext.dependencies.easypermissionsimplementation rootProject.ext.dependencies.TimePickerDialogimplementation rootProject.ext.dependencies.chenypAdapterimplementation rootProject.ext.dependencies.journeyappsZxingimplementation rootProject.ext.dependencies.zxingCoreimplementation rootProject.ext.dependencies.systembartintSystembartintimplementation rootProject.ext.dependencies.systembartintSystembartintimplementation rootProject.ext.dependencies.umengAnalyticsimplementation rootProject.ext.dependencies.flowlayoutLibimplementation project(path: ':simple_lib')implementation project(path: ':tribes_module')api 'com.leon.channel:helper:2.0.1'}

接下来说一下步骤细节。

第一步:在项目的build.gradle中添加这行代码

官方GitHub地址:GitHub - Tencent/VasDolly: Android V1 and V2 Signature Channel Package Plugin

classpath 'com.leon.channel:plugin:2.0.1'

第二步:在主APP工程中,添加对VasDolly的引用

apply plugin: 'channel'

第三步:在工程中去引用helper依赖(版本还是看官网当前的版本吧)

 api 'com.leon.channel:helper:2.0.1'

第四步:配置渠道列表,这里呢有两种方式。(以下部分说明,摘自github VasDolly 点击打开链接)

1)第一种:在grable.properties文件指定渠道文件名称,该渠道文件不许位于根工程目录下,一行一个渠道信号

channel_file=channel.txt

2) 第二种:在 channel 或者 rebuildChannel 属性中通过 channelFile 属性指定渠道文件,一行一个渠道信息(目前我是使用的这种方式,方便于我在一个地方可以管理)

其中,多渠道包的命名规则中,可使用以下字段:

  • appName : 当前project的name
  • versionName : 当前Variant的versionName
  • versionCode : 当前Variant的versionCode
  • buildType : 当前Variant的buildType,即debug or release
  • flavorName : 当前的渠道名称
  • appId : 当前Variant的applicationId
  • buildTime : 当前编译构建日期时间,时间格式可以自定义,默认格式:yyyyMMdd-HHmmss

第五步:开始打包,在Android Studio 下的 Terminal 下输入命令行即可

gradlew channelDebug 测试
gradlew channelRelease 正式

一个回车键....进度条跑起来啦!!!

当我们看到这个BUILD SUCCESSFUL的时候,就说明打包成功啦

看一下这速度,25秒,打出了20个包。厉不厉害,牛X不

另外咱们再说一下,VasDolly 还给我们提供的另外一个方式,已经有基础包了,根据基础包生成更多的渠道包。

注意:这里需要配置的东西有,基础包的路径,和输出的目录路径

然后这是的命令就是  gradlew rebuildChannel

    rebuildChannel {//命令操作打包 gradlew rebuildChannel//指定渠道文件channelFile = new File(project.rootDir, "channel.txt")//存在的基础包路径baseDebugApk = 已有Debug APKbaseReleaseApk = 已有Release APK//默认为new File(project.buildDir, "rebuildChannel/debug")debugOutputDir = Debug渠道包输出目录//默认为new File(project.buildDir, "rebuildChannel/release")releaseOutputDir = Release渠道包输出目录//快速模式:生成渠道包时不进行校验(速度可以提升10倍以上,默认为false)isFastMode = false//低内存模式(仅针对V2签名,默认为false):只把签名块、中央目录和EOCD读取到内存,不把最大头的内容块读取到内存,在手机上合成APK时,可以使用该模式lowMemory = false}

还有就是,如果你有集成友盟统计,那么就需要你在,Application 下的 onCreate() 方法中去加多这两行代码了

    private void initUmeng() {//获取渠道标识String channel = ChannelReaderUtil.getChannel(getApplicationContext());MobclickAgent.setDebugMode(true);// SDK在统计Fragment时,需要关闭Activity自带的页面统计,// 然后在每个页面中重新集成页面统计的代码(包括调用了 onResume 和 onPause 的Activity)。MobclickAgent.openActivityDurationTrack(false);//普通统计场景类型MobclickAgent.setScenarioType(this, MobclickAgent.EScenarioType.E_UM_NORMAL);MobclickAgent. startWithConfigure(new MobclickAgent.UMAnalyticsConfig(this,"你的友盟AppKey", channel, MobclickAgent.EScenarioType.E_UM_NORMAL,true));}

好了,到这里就全部介绍完咯。如果不明白的欢迎留言。其他详情可以观看github上作者的描述

VasDolly

Android 使用VasDolly 实现多渠道打包相关推荐

  1. android gradle两种多渠道打包方式

    android gradle两种多渠道打包方式 gradle多渠道打包,目前已经了解到的有两种方式: 一种是利用gradle的manifestPlaceholders属性来替换渠道值 另一种是不同的渠 ...

  2. Android grade语法,多渠道打包

    Android grade语法,多渠道打包 文章目录 Android grade语法,多渠道打包 一.groovy语法 二.自动打包切换测试正式环境 三.gradle多渠道打包 总结 一.groovy ...

  3. Android开发之Gradle多渠道打包总结

    首先老套路看图:分别是小米的渠道和应用宝的渠道 这是渠道的渠道号的截图 先说下Gradle的多渠道打包,个人更喜欢这样写: 第一步:需要在清单文件添加标识: <meta-dataandroid: ...

  4. Android之友盟多渠道打包与数据统计(非原创)

    文章大纲 一.多渠道打包与数据统计介绍 二.友盟实现多渠道打包实战 三.友盟数据统计实战 四.项目源码下载 五.参考文章 一.多渠道打包与数据统计介绍   多渠道打包,相信很多同学都知道.在Andro ...

  5. android一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

    多渠道打包和资源混淆的作用这里我就不再阐述了.网上有很多. 本篇博客我们来介绍一下如何实现多渠道打包之前先进行资源混淆,这样一来我们打出来的包都是已经进行过资源混淆的了. 如果你还有其他的需求,也可以 ...

  6. Android热更新Tinker + 多渠道打包 + 加固的流程详解

    一.Tinker热修复 关于热修复的作用,不用多说了,一句话概括就是通过让用户无感的方式来修复线上应用的bug.这里介绍的是微信Tinker. 下面的接入方式都是参考自Tinker官方文档来.我这里主 ...

  7. android多渠道打包签名配置,Gradle For Android(二) 多渠道打包与签名配置

    <Gradle For Android(二) 多渠道打包与签名配置> 转载请注明来自 傻小孩b(gold.xitu.io/user/57e089-喜欢的能够关注我,不按期总结文章!您的支持 ...

  8. Android Studio 3.0 多渠道打包 解决All flavors must now belong to a named flavor dimension

    首先官方文档地址:这个需要梯子 https://developer.android.com/studio/build/build-variants?utm_source=android-studio# ...

  9. Android国内海外apk多渠道打包了解一下?

    本文主要讲解一个代码工程需要同时需要打包国内外apk包,国外一般只在google play发布,国内发布的平台会更多一些,包括华为.小米.应用宝.vivo等应用市场平台 需求整理 国内和海外版本差异一 ...

最新文章

  1. qthread destroyed while thread is still running
  2. java 调用postgresql 函数_从Java调用PostgreSQL中的存储过程
  3. mac+php7+mysql.so_在Mac上编译安装PHP7的开发环境
  4. intx update task - IB_IBINTX_UPDATE
  5. Linux虚拟机重启后无法获取IP的问题(断网、没网)
  6. FF公布融资及FF 91交付规划 IPO之前还需8.5亿美元资金
  7. java数组综合练习_69期-Java SE-005_二维数组、综合练习-001-002
  8. 关于PCI-E接口你要知道这些点
  9. JavaWeb篇-谷歌验证码的使用
  10. 苹果计算机远程控制软件,向日葵远程控制软件iPhone手机远程控制电脑
  11. 怎么写脚本实现自动输入密码
  12. .netcore3 下Signalr 关于Joson序列化后对象属性变小写的问题
  13. bat脚本打开cmd执行命令
  14. 安装Pillow指定版本出错
  15. 计算机硬盘有坏道,电脑硬盘有坏道怎么办?
  16. HTMLCSS精华知识点——基础标签
  17. 输入在第一行中给出一个正整数n(1)。第二行输入n个整数,用空格分开。在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
  18. 【论文笔记】A Survey on Federated Learning: The Journey From Centralized to Distributed On-Site Learning a
  19. 二十六、 对偶问题(※※※)
  20. Unity发布PC平台exe的窗口花样(WindowsAPI、捕获关闭事件、隐藏窗口标题栏、隐藏最小化最大化关闭按钮等等)

热门文章

  1. 使用gitee pages搭建个人博客
  2. 一个获取ip地址的命令详解
  3. JAVA中空值String拼接的坑!!!
  4. weui uploader java_微信小程序 WeUI·Uploader
  5. 天籁obd接口针脚定义_2013新天籁加装OBD胎压监测+无损改装彻底解决亏电求加精...
  6. qt creator初始化配置,解决No valid kits found
  7. group by rollup 和grouping的使用实例
  8. 吉大计算机学院大一课表,大学计算机基础(吉林大学)大学计算机基础课程计划及方案.doc...
  9. 我真感觉软件测试不难,自己技术也过得去,为什么我找不到工作呢?面了好多家,都没有收到offer。
  10. ABP 使用[DontWrapResult]注解去掉接口返回的“__abp”