Android Studio多渠道打包的方法,美团打包策略讲解



    在多渠道打包时,我们需要在AndroidManifest.xml文件中手动修改mate-date属性,name和value相对应用市场编号。然后在项目build.gradle下的ProductFlavors标签下定义各种渠道号。其实使用第三方打包工具 ,原理也是修改mate-date属性值,只是将打包的apk复制时进行解压修改。下文将先对一般分渠道打包讲解,然后再对美团打包策略讲解。


关于Android Studio打包推荐博文:


Android  显示SHA1和MD5值并生成签名文件打包APK


一、Android Studio 如何分渠道打包

我们需要用到分渠道打包,那么我们需要解决如下两个问题:

1、怎么区分各个平台的标识?

2、怎么每次版本更新都生成几十个包、几百个包?


1、首先,第一个问题

用过友盟打包的同学肯定不陌生这段代码


    
    
 

value里面填的就是各个平台的值,比如填写uc、yyb(应用宝)、360、baidu替换掉Channel_ID,App安装好,可以读取这个值然后传给后台,从而实现区分各个平台的安装需求。


2、然后,第二个问题

    在Eclipse ADT开发工具时代,最怕版本更新,因为我是手动打的,一次打30个包,基本一下午都在做机械运动,现在想起来手都在抽筋。后来,有了Ant自动打包,快倒是快,只是配置太坑,很麻烦。至从有了Android Studio做开发工具,哪里需要打包点那里,妈妈再也不用担心我不能愉快的打包了。

Android Studio多渠道打包的方法,美团打包策略讲解_第1张图片

Android Studio多渠道打包的方法,美团打包策略讲解_第2张图片
Android Studio多渠道打包的方法,美团打包策略讲解_第3张图片 Android Studio多渠道打包的方法,美团打包策略讲解_第4张图片

app-build.gradle文件:

apply plugin: 'com.android.application'
android {
    signingConfigs {
        config {
            keyAlias 'maker'
            keyPassword '1234make'
            storeFile file('/Users/Nevermore/AndroidStudioProjects/Blog/jks/makeapp.jks')
            storePassword 'make1234'
        }
    }
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    defaultConfig {
        applicationId "com.example.makeapp"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            minifyEnabled false
            debuggable true
        }
 
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
            debuggable false
        }
    }
    productFlavors {
        uc {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
        }
        _360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
        }
        baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
        yyb {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yyb"]
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
}

“signingConfigs”这里是新建的密匙信息;

“buildTypes” 是打包类型,包括了Debug和Release;

“productFlavors” 打包渠道就在这儿配置。但是写法有些冗余,可以减少代码量,美观一点:

productFlavors {
        uc {}
        _360 {}
        baidu {}
        yyb {}
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

同时,在AndroidManifest配置文件中别忘记加上作为渠道标识的这行代码:


 
    
    ...

3、最后,配置写完了,如何生成渠道包

    在命令行输入 ‘gradlew assembleRelease’ :表示生成所有Release包,生成的包在build\outputs\apk目录下,如果你要生成指定的包(uc|360|baidu),指定的版本(Release|Debug),右边的Gradle Project可以帮到你。

Android Studio多渠道打包的方法,美团打包策略讲解_第5张图片


执行完gradlew assembleRelease,发现一个问题,生成的不仅有我们需要的包,unaligned.apk类型的Apk也输出来了

Android Studio多渠道打包的方法,美团打包策略讲解_第6张图片

unaligned.apk 是还没执行对齐命令的包,是中间形态,这个需要删除,没必要不知道为什么Gradle没有帮我们删了这没啥用的玩意儿,问题是我们也不想一个一个的手动删除。好吧,写了一个脚本命令,在输出文件夹的命令行执行如下:

 find . -name "*-unaligned.apk" | xargs rm -rf

如果打包太多,需要清理一下,可以如下图操作:

Android Studio多渠道打包的方法,美团打包策略讲解_第7张图片


二、美团的打包策略讲解

    想一想,如果不通过整个项目多渠道打包,而只是对一个apk进行多渠道操作,是不是效率更快呢?是的,只要直接解压apk,在根目录会有一个META-INF的目录,如果在该目录下添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以去唯一的标识一个渠道。
    结论:采用这种方式,每打一个渠道包只需复制一个apk,在META-INF中添加一个使用渠道号命名的空文件即可。
这种打包方式速度非常快,900多个渠道不到一分钟就能打完。没错,这就是美团的打包策略。

使用工具:https://github.com/GavinCT/AndroidMultiChannelBuildTool,使用时,开发者仅需将ChannelUtil.java放入到工程里使用,以后打包的事情就不用自己动手了。安装个Python环境,运行一下MultiChannelBuildTool.py,谁都可以打包了!


看下实践案例:
拷贝一个,我们刚刚生成的app-uc-release.apk到项目目录

  

Android Studio多渠道打包的方法,美团打包策略讲解_第8张图片

果然厉害,1S就出来这么多包。反编译看看,包打得对不对:

命令行输入:apktool d xxx.apk (可以看下图


这里写图片描述

打开目录,首先确认我们生成的XML里面的标识符

Android Studio多渠道打包的方法,美团打包策略讲解_第9张图片

然后看到,美团极速打包方案也完成

Android Studio多渠道打包的方法,美团打包策略讲解_第10张图片

但是,使用Gradle生成4个渠道,我们花了 26.5秒 人家 只花了目测 1秒,1分钟900个包果然不是梦



你可能感兴趣的:(Android Studio多渠道打包的方法,美团打包策略讲解)