简单的多渠道自动打包

大家好,这是我入行以来第一次写帖子,有点激动,不知道写帖子有什么规则,也不知道该怎么写,而且我好久好久没有写过这么长的文字了,可能写的不太好比较杂乱。如若使您的眼睛受到了伤害亦或内心受到了重创,还望您能多多包涵。

我以前做的项目至多上两三个市场,所以这种情况下可以在主项目的gradle中配置多个flavor,不需要任何第三方工具也不需要恼人的命令行或者脚本,只需要多次打包就好了。这方面我并不是特别精通,而且简书上一搜一大堆,所以我就不班门弄斧了。

这个是背景

我现在做的项目需要上应用宝、百度、华为等等共18个市场,如果像上面那种方式,一个一个配置然后一个一个打包,要等到打包完成估计是要等到光年以外了。

我作为一个很懒的程序员,断然不会做这种事情,而且听各位大神说过自动化多渠道打包,一直想尝试一下的,总是被各种理由拦住。今天终于下定决心试一试,毕竟,如果不尝试一下,你都不知道你真的可以把所有事情都搞砸!

我尝试过的方法:

  • 美团-安卓多渠道打包工具 AndroidMultiChannelBuildTool;
  • 美团 Walle(瓦力);
  • 极速渠道打包工具 mcxiaoke/packer-ng-plugin(我采用的);

简单介绍一下:

1.AndroidMultiChannelBuildTool:这种方式不支持v2签名(可以看这里);

2.瓦力只支持v2,更多介绍的话可以点击上面的链接有详细介绍和教程。我用的时候按照官方文档gradle方式无法打包,总是报各种奇怪的错误,我无心一一解决就放弃了这种方式,随后采用jar+命令的方式,但是打包后获取不到channel也很奇怪;

3.极速渠道打包工具 是一位大佬告诉我的,我最初采用v1.0.4打包后无法安装提示应用已损坏,随后更新到最新版本按照官方的教程便成功了;

极速渠道完整过程

1.修改项目根目录的build.gradle:

buildscript {

    repositories {

    }
    dependencies {
    classpath 'com.android.tools.build:gradle:3.0.1'
    classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
    //添加这一行
    classpath 'com.mcxiaoke.packer-ng:plugin:2.0.1'
    }
}

2.主模块的 build.gradle添加依赖:

//一定不要忘了这一行啊!
apply plugin: 'packer' 

dependencies {
// 添加 packer-helper
compile 'com.mcxiaoke.packer-ng:helper:2.0.1'
}

3.在主模块buidle.gradle插件配置:

packer {
    archiveNameFormat = '${buildType}-v${versionName}-${channel}'
    archiveOutput = new File(project.rootProject.buildDir, "apks")
    //1.渠道列表的方式
    //channelList = ['*Douban*', 'Google/', '中文/@#市场','Hello@World','GradleTest',   '20070601!@#$%^&*(){}:"<>?-=[]; \',./']

    //2.指定渠道列表文件,file类型
    channelFile = new File(project.rootDir, "markets.txt")

    //3.根据productFlavor指定不同的渠道列表文件
    //channelMap = [
    //      "Cat" : project.rootProject.file("channels/cat.txt"),
    //        "Dog" : project.rootProject.file("channels/dog.txt"),
    //       "Fish": project.rootProject.file("channels/channels.txt")
    //  ]
}

注意:channelList / channelMap / channelFile 不能同时使用,根据实际情况选择一种即可,三个属性同时存在时优先级为: channelList > channelMap > channelFile,另外,这三个属性会被命令行参数 -Pchannels 覆盖;

我使用了第二种方式

4.在主模块builde.gradle中添加打包的签名:

 signingConfigs {
//add
releaseConfig {
    keyAlias 'alias'
    keyPassword 'password'
    storeFile file('...itheima.jks')
    storePassword 'password'
    //支持v2签名,这行不要忘!!
    v2SigningEnabled true
    }
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        //这就是上面配置的
        signingConfig  signingConfigs.releaseConfig
    }
}

5.代码中读取渠道:

// 如果没有找到渠道信息或遇到错误,默认返回的是""
// com.mcxiaoke.packer.helper.PackerNg
final String channel = PackerNg.getChannel(Context)

6.创建markets.txt放到根目录,一个渠道换一行,#号后面是注释

flavor_360 #360
flavor_baidu
flavor_xiaomi
...

7.one more thing,通过终端命令打包:

gradle -P market=markets.txt clean apkRelease

注意:如果你已经配置了flavor,比如说:

productFlavors{
    flavor_release {
        applicationId "com.example.app"
    }
}

那么你需要在这里指定flavorName:

gradle -P market=markets.txt clean apkFlavor_releaseRelease

这里flavor_release首字母需要大写哦!

好了,不到一分钟时间,等读条完成你就可以在输出目录里面看到apk了,那么本次多渠道自动化打包完成了!

__

当时看到打包成功之后,心里真的挺开心的,非常感谢帮助我的大佬!!遗憾的是瓦力打包打包完成获取不到渠道信息,我这两天有时间还会再尝试的。

我一直没有尝试就是因为潜意识里觉得这个很难,很复杂,更不敢去尝试,如此恶性循环。然而现在看到自己通过努力(瞎搞)终于成功了,真相就是这样:有时候觉得自己不会做,努力之后才发现,原来不是难,是因为自己蠢

不瞎掰扯了,睡觉了。。

非常感谢您耐着性子看完我这篇帖子,再次申明:如果这篇帖子使得您的眼睛受到了伤害亦或内心受到了重创————睡一觉就好了!哈哈哈哈哈哈

如果不小心使您做了噩梦————那还不是因为你做了亏心事啊,哈哈哈哈哈哈哈

你可能感兴趣的:(Android架构师之路)