转载请说明,本文来自:https://blog.csdn.net/shijianduan1/article/details/86681256
前言:
- 在看学习资料的时候,看见美团的打包机制很厉害,而android 原生的虽然功能很强大,但是当渠道包多了之后,打包速度很慢。所以这里就手动学习验证下。
条件:
- 新建项目,没有其他代码
- 54个渠道,打包debug和release两个,一共108个apk
Gradle方式:
- 耗时26m10s
美团方式:
- 和 greendao,Tinker 都有点类似,
- 项目根目录下build.gradle 添加依赖库
dependencies {
classpath 'com.android.tools.build:gradle:3.3.0'
//美团 瓦利打包
classpath 'com.meituan.android.walle:plugin:1.1.6'
}
- 在app目录下,新建walle_channel.gradle文件(根据GitHub文档直接拷贝)
//美团瓦利打包
apply plugin: 'walle'
walle {
/*//可用的变量
projectName - 项目名字
appName - App模块名字
packageName - applicationId (App包名packageName)
buildType - buildType (release/debug等)
channel - channel名称 (对应渠道打包中的渠道名字)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)
fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)
flavorName - 编译构建 productFlavors 名
*/
// 指定渠道包的输出路径
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// 定制渠道包的APK的文件名称
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
- 在app目录下,新建 channel 文件(创建的时候没有后缀名,就字体加粗的这个。这个文件是要打包的哪些渠道)
meituan # 美团
samsungapps #三星
hiapk
anzhi
xiaomi # 小米
91com
gfan
appchina
nduoa
3gcn
mumayi
10086com
wostore
189store
lenovomm
hicloud
meizu
wandou
# Google Play
# googleplay
# 百度
baidu
#
# 360
360cn
#
# 应用宝
myapp
- 在app目录的build.gradle下添加
apply from: 'walle_channel.gradle'
dependencies {
implementation 'com.meituan.android.walle:library:1.1.6'
}
-
代码里读取
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
-
最后 执行:最后 执行:
可能会在build的时候,遇见的V2打包的问题。见:Android - 美团 walle报错:Plugin requires ‘APK Signature Scheme v2 Enabled’ for smart1Release.
- 简易方法:通常是全部渠道生成使用。 在右侧gradle, app - tasks - package, 选择需要的选项。
- 命令方法:
多渠道:
./gradlew clean assembleReleaseChannels -PchannelList=meituan,dianping
额外信息:
./gradlew clean assembleReleaseChannels -PchannelList=meituan -PextraInfo=buildtime:20161212,hash:xxxxxxx
注意: 这里的extraInfo以key:value形式提供,多个以,分隔
附加:
渠道信息的读写,需要额外依赖两个类。
-
读取:
依赖:
dependencies { implementation 'com.meituan.android.walle:payload_reader:1.1.6' }
- ChannelReader:读取Walle内置id对应的信息,一般用来存放渠道和额外信息。
- PayloadReader: 读取自定义id对应的信息。
-
写入:
依赖:dependencies { implementation 'com.meituan.android.walle:payload_writer:1.1.6' }
- ChannelWriter:向Walle内置id对应区域写入/移除信息,一般存放渠道和额外信息。额外信息key相同时覆盖写入。
- PayloadWriter: 自定义id写入,id相同时覆盖。 注意:请确保Android未使用此id
-
非Android系统,使用上述:需要添加依赖:(减少Android方法数)
compile ‘org.json:json:20080701’
总结:
如果你注意到上述截图的话,可以发现,我使用walle 打包 54个版本,仅12s;
而 gradle原生项目打包108个apk 则是 26min。
结果很明显,walle打包速度很快。
但是,这仅仅是渠道打包,仅修改了一个变量值(渠道名),那么当涉及到 代码、引用jar包、资源文件的时候,又应该怎么样呢
有缘见下次分析