安卓新一代多渠道打包工具Walle

为什么要打多个渠道的包?

大家都知道,android应用商店大大小小有几百个,作为一个有志向的app,就需要做到统计各个应用商店的下载量,不同渠道下的app使用时长、安装数量、使用用户数等等信息,这个时候就需要打多个渠道包。渠道包的原理大致就是往apk中写入不同的渠道信息,对这个问题有疑问的同学可以看看gradle官网或者看看这篇文章

传统多渠道打包

用android studio开发的同学都知道,传统的多渠道打包方法是通过gradle配置productFlavors,在配合grade的manifestPlaceholders插件,就可以实现task打多渠道包了,具体如下。

    //app目录下在build.gradle文件中添加如下代码
    productFlavors {
        yingyongbao {
            manifestPlaceholders = [CUSTOM_CHANNEL_VALUE: "yingyongbao"]
        }
        baidu {
            manifestPlaceholders = [CUSTOM_CHANNEL_VALUE: "baidu"]
        }
    }

    //在AndroidManifest.xml中添加如下代码 如果有使用友盟把CUSTOM_CHANNEL换成UMENG_CHANNEL即可
        <meta-data
            android:name="CUSTOM_CHANNEL"
            android:value="${CUSTOM_CHANNEL_VALUE}" />

这个时候就可以用task要打包了,双击即可。或者直接在命令行输入

./gradlew assembleRelease//打包所有渠道
./gradlew assembleWandoujiaRelease//打包单个渠道 Wandoujia

《安卓新一代多渠道打包工具Walle》 1490758426(1).jpg

没出现渠道打包task的同学请点击左上角的刷新按钮。

Walle多渠道打包

这种方法是很简单省事,但是并不省时啊!通过这种方式打包,gradle每次都要从资源文件开始到生成apk重新走一遍,所以很耗时,每次打包一次要等十几分钟,如果渠道多的app估计要等上半小时以上。这时候我们就要想想有没有其他的打包方式了,刚好在推酷上看到了美团开源的Android Signature V2 Scheme 签名下的新一代渠道包打包神器Walle,跟gradle打包不一样,walle是在APK Signature Block区块添加自定义的渠道信息,具体如下。

《安卓新一代多渠道打包工具Walle》 1490759814(1).jpg

当然了,Walle并不是为了解决打包速度而产生的一个工具,美团研究walle的原因是因为在Android 7.0(Nougat)推出了新的应用签名方案APK Signature Scheme v2后,之前快速生成渠道包的方式(
美团Android自动化之旅—生成渠道包)已经行不通了,具体可以看看
Walle自己是怎么说的。

Walle简单使用

Gradle 插件使用方式

//配置 build.gradle
//在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖, 如下:

buildscript {
    dependencies {
        classpath 'com.meituan.android.walle:plugin:1.0.3'
    }
}

//并在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR,

apply plugin: 'walle'

//如果不需要通过walle获取渠道号 则不需要加
dependencies {compile 'com.meituan.android.walle:library:1.0.3'}
Walle信息配置
//在当前App的 build.gradle 中添加如下信息
walle {
    // 指定渠道包的输出路径
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名称 ${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk
    apkFileNameFormat = '${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")

}

配置项具体解释:
apkOutputFolder:指定渠道包的输出路径, 默认值为new File(“${project.buildDir}/outputs/apk”)

apkFileNameFormat:定制渠道包的APK的文件名称, 默认值为’《安卓新一代多渠道打包工具Walle》{buildType}-${channel}.apk’
可使用以下变量:

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 名

channelFile:包含渠道配置信息的文件路径,channel文件放在module的同级目录下。 具体内容格式详见:渠道配置文件示例,支持使用#号添加注释。

获取渠道

在需要获取渠道信息的地方使用如下代码获取渠道信息

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

通过读取<meta-data>来获取渠道号

    private void readMetaDataFromApplication() {  
        try {  
            ApplicationInfo appInfo = this.getPackageManager()  
                    .getApplicationInfo(getPackageName(),  
                            PackageManager.GET_META_DATA);  
            String mTag = appInfo.metaData.getString("mTag");  
  
            Log.e(TAG, "mTag=" + mTag);  
  
        } catch (NameNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  
打包

生成渠道包的方式是和assemble${variantName}Channels指令结合,渠道包的生成目录默认存放在 build/outputs/apk/,也可以通过walle闭包中的apkOutputFolder参数来指定输出目录

用法示例:

  • 生成渠道包
mac ./gradlew clean assembleReleaseChannels
win  gradlew clean assembleReleaseChannels
  • 支持 productFlavors
mac ./gradlew clean assembleMeituanReleaseChannels
win  gradlew clean assembleMeituanReleaseChannels
  • 生成单个渠道包
mac ./gradlew clean assembleReleaseChannels -PchannelList=google
win   gradlew clean assembleReleaseChannels -PchannelList=google
  • 生成多个渠道包
mac ./gradlew clean assembleReleaseChannels -PchannelList=google,dianping
win  gradlew clean assembleReleaseChannels -PchannelList=google,dianping

释放你的双手,让商务运营自己打包

walle-cli 是walle 提供的命令行工具 ,简单的用法:

获取信息

显示当前apk中的渠道和额外信息:

java -jar walle-cli-all.jar show /Users/Meituan/app/build/outputs/apk/app.apk

写入信息

写入渠道

java -jar walle-cli-all.jar put -c meituan /Users/Meituan/Downloads/app.apk

写入额外信息,不提供渠道时不写入渠道

java -jar walle-cli-all.jar put -c meituan -e buildtime=20161212,hash=xxxxxxx /Users/xxx/Downloads/app.apk

指定输出文件,自定义名称。 不指定时默认与原apk包同目录。

java -jar walle-cli-all.jar put -c meituan /Users/Meituan/Downloads/app.apk /Users/xxx/Downloads/app-new-hahha.apk

批量写入
命令行指定渠道列表
java -jar walle-cli-all.jar batch -c meituan,meituan2,meituan3 /Users/walle/app/build/outputs/apk/app.apk

指定渠道配置文件
java -jar walle-cli-all.jar batch -f /Users/Meituan/walle/app/channel  /Users/Meituan/walle/app/build/outputs/apk/app.apk

配置文件示例 支持使用#号添加注释

输出目录可指定,不指定时默认在原apk包同目录下。

指定渠道&额外信息配置文件
java -jar walle-cli-all.jar batch2 -f /Users/Meituan/walle/app/config.json  /Users/Meituan/walle/app/build/outputs/apk/app.apk

配置文件示例

输出目录可指定,不指定时默认在原apk包同目录下。

更多用法

获取cli所有功能

java -jar walle-cli-all.jar -h
    原文作者:tse1y
    原文地址: https://www.jianshu.com/p/572b59829a08
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞