更简便的Android多渠道打包方式。Android的大都渠道打包|SquirrelNote

对发布在每个市场上的apk打上烙印是必须的一步,Android的多渠道打包

正文先想起了昔日兴的大多渠道打包方式,随后引入的mcxiaoke的packer-ng-plugin项目,介绍该型以事实上利用(配合友盟统计)中怎样解决再有利于之Android多渠道打包问题

不计其数文章:
Android的倒编译和代码混淆
Android的起包签名
[Android的多渠道打包

  • 差不多渠道打包方案分析
  • 事实上采用集成

前言

本篇包括以下内容:

  1. 大抵渠道打包概述
  2. 友盟的几近渠道打包
  3. 美团的几近渠道打包
  4. 360底大多渠道打包

大多渠道打包方案分析

android应用市场丰富多彩,应用宝、小米市场、豌豆荚…为了监督每个市场我们的使用下载和放大情况,对发布于每个市场达成的apk打上烙印是必的同一步,这便是多渠道apk的题目,“渠道”就是于apk打及之烙印。
而且友盟统计可以辅助我们统计渠道数据(Channel),方便产品经理对数码解析后举行下一样步产品决策。

时下基本上渠道打包方式大概有:

  1. gradle自带的productFlavor方式,见自己事先的博客
  2. apktool重签名重打包
  3. 当apk文件中之META-INF文件夹着描写副以沟号命名的空文件方式(美团)

老三栽是于快之艺术,据说900差不多单沟不顶平分钟即能于完,参考。但是缺点也是局部,你用维护一个python脚本,为各国一样种植渠道写副一个因为沟名命名的空文件。

本文将介绍的packer-ng-plugin的思路其实是产生硌类似的,由于apk就是一个zip文件,zip文件尾发生一个片段可看作zip文件之笺注,正确修改就同一部分不见面指向ZIP文件造成破坏,利用这个字段,我们得以加上一些起定义之数码,PackerNg项目就是是以这里丰富和朗诵博渠道信息。同时提供了读取渠道信息的接口。

大多渠道打包概述

啊是大抵渠道保险
沟保险就是是使以安装包着上加渠道信息,也就是是channel,对许不同之渠道,例如:小米市场、360市面、应用宝市场当
出品于不同之采取市场或有异的统计需求,需要也每个应用市场之Android包设定一个好分别以市场之标识,这个也Android包设定应用市场标识的进程即是大半渠道打包。

缘何而提供多渠道保险
国内在着发诸多底以市场,产品在不同的水道或产生差之统计需求,为此Android开发人员需要为每个应用市场发布一个安装包,这里就引出了Android的大多渠道打包。
以安包中添加不同之标识,应用在请网络的时候带渠道信息,方便后台做运营统计。

贯彻多渠道打包的原理
透过安排gradle脚本实现多渠道打包
这种打包方式是运用Android
Studio的编译工具gradle配合以的,其基本原理就是经脚本修改AndroidManifest.xml中的mate-date内容,执行N次打包签名操作实现多渠道打包的要求。然后便得于java中通过API获取相应之数目。

哪些促成
当今android渠道多种多样,其实渠道不仅仅局限为采用市场,一种推广方式也可视作一个渠道,比如:通过人数拉人之不二法门去放,官网上拓宽,百度推广等。所以说渠道多,为了加大,有时候一差为会见打成千的装置包,那若半天或者同一上什么还变干了,所以介绍几独十分庄飞速的由包方,借鉴一下。

实际上应用集成

修改项目gradle,加入

buildscript {
    ......
    dependencies{
    // add packer-ng
        classpath 'com.mcxiaoke.gradle:packer-ng:1.0.5'
    }
} 

修改moudle级别gradle,加入

apply plugin: 'packer' 

dependencies {
    // add packer-helper
    compile 'com.mcxiaoke.gradle:packer-helper:1.0.5'
} 

小心:packer-ng 和 packer-helper 的版本号需要保持一致

在公的型根本目录中投入渠道列表文件,比如文件称是market.txt,内容是

YingYongBao
XiaoMi
WanDouJia
Baidu
Qihoo
GooglePlay
...

即便是各级一行即一个水渠号

又于您的类型根本目录在一个bat脚本(windows),比如名build.bat,内容写上(即一个限令)

gradle -Pmarket=markets.txt clean apkRelease

居功至伟告成,以后每次由渠道确保,只要入你的根目录,双击这bat脚本,packer-ng-plugin就从头自行帮您根据market.txt构建每一个沟渠保险;或者直接以android
studio的Terminal中执行build.bat亦可。

观察控制台的出口,packer-ng最终是也各级一个水渠保险的打制形成了一个个的gradle
task:

...
:app:apkRelease processed apk for XiaoMi (4)
:app:apkRelease processed apk for WanDouJia (5)
:app:apkRelease processed apk for Baidu (6)
:app:apkRelease processed apk for Qihoo (7)
:app:apkRelease processed apk for GooglePlay (8)
:app:apkRelease all 8 apks saved to D:\workspace\shine\build\archives
:app:apkRelease PackerNg: Market Packaging Successful!
BUILD SUCCESSFUL
Total time: 1 mins 23.269 secs 

据悉这输出,他合生成了8独沟保险,所有的apk输出在了档次根本目录的build/archives文件夹着

packer-ng-plugin也提供了有起定义配置,比如输入的apk的命名方式,具体参考插件配置说明,同时提供了java和python的一声令下行脚本,供集成到不断集成环境面临,具体参考一声令下行打包脚本。

末得取的某些纵是如何让友盟统计喻目前之apk是哪位渠道。首先你需要去之前的productFlavor或者manifest的占据位符的章程的代码,删除AndroidManifest中友盟的水道Channel的META-Data的布。
下一场在app入口(Application)的onCreate中入下列代码:

final String market = PackerNg.getMarket(this,"defaul_channel);
AnalyticsConfig.setChannel(market); //AnalyticsConfig是友盟的代码方式设置渠道类

友盟的大半渠道打包

友盟就提供了差不多渠道打包的方式,可用以渠道统计等。
今Android的构建工具换成了gradle,通过gradle,简单布置后即可兑现机关从有渠道包。

上知识
问询下BuildTypes、Flavors、BuildVariants三个概念:
1、BuildTypes :
构建类,AndroidStudio的Gradle组件默认提供被了“debug”“release”两个布局。
2、Flavors :
产品渠道,可以根据productFlavors,针对不同的水道布局个性化apk
3、BuildVariants:每一个buildtype和flavor组成一个buildvariant

友盟打包实现步骤

  1. 论umeng的要求,manifest文件中得发(在application下,和activity是一视同仁关系):

<meta-data 
            android:name="UMENG_CHANNEL" 
            android:value="${UMENG_CHANNEL_VALUE}"/>

这段配置,value那里就是wandoujia,360之类的沟渠名称,但是咱以此不见面失去描绘渠道名,写的凡一个据为己有位符,后面gradle编译的时光会动态的替换掉她。

  1. 每当module(一般为就是app)的build.gradle的android{}中补充加如下内容:

    //productFlavors是android节点的一个自节点。你需要打什么渠道的包,就在这里按umeng的要求用渠道名给UMENG_CHANNEL_VALUE赋值。
    /*productFlavors {
        //方式1:里面是三个渠道
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        yingyongbao {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
        }
    }*/

    //优化1:上面只是三个渠道,如果有几十个渠道,都这样写,重复的东西太多,观察到每个渠道就是flavor的名称,所以修改如下:
    /*productFlavors {
        wandoujia {
            //manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
        xiaomi {
            //manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"]
        }
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }*/


    //优化2:上面经过签名打包后生成的apk的名称是有默认命名规则的,
    // 如:xxx-xiaomi-release.apk 但是我们想包含版本信息如:
    // xxx-xiaomi-release-1.0.apk,所以最终打包脚本如下:
    productFlavors {
        wandoujia {
            //manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
        xiaomi {
            //manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"]
        }
    }
    //如果需要在不同渠道统一配置,使用productFlavors.all字段
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }

假如没有错情况,我们见面当Android
studio的BuildVariant看到相应的水道,如下图所示:

图片 1

image.png

  1. 得渠道
    当代码中我们好透过读取mate-data信息来博取渠道,然后上加到请求参数中,获取方式如下:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String channel=getChannel();
        Toast.makeText(MainActivity.this, "channel==" + channel, Toast.LENGTH_SHORT).show();
    }

    private String getChannel() {
        try {
            PackageManager pm = getPackageManager();
            ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            return appInfo.metaData.getString("UMENG_CHANNEL");
        } catch (PackageManager.NameNotFoundException ignored) {
        }
        return "";
    }

然后还拓展签约

签配置
签主要出少种植艺术:

  1. 手动签名打包
  2. 机动签名。

手动签名打包:

图片 2

image.png

使之前签约的公文,输入密码进行签字打包,如下图

图片 3

image.png

挑选打包渠道,如下图

图片 4

image.png

finish后,生成apk文件,如下图

图片 5

image.png

自行签名打包(通过命令的计开展签约):
活动签名,是以咱们的application中的build.gradle(Module:app),先安排好签名文件信息,我们要事先创造好一个签名文件.
(1)加载Key Store:
咱先删掉上面的经过第一种方法所签署的apk文件。接下来开展第二种艺术来签名,即命令行的艺术。
开拓Project Stucture图形化界面:

图片 6

image.png

达到图中,选中app这个module,然后切换至signing标签栏,紧接着点击添加,然后生成release签名信,点击”OK”。

图片 7

image.png

高达图中,切换至Build Types标签,将Signing
config选择吗”release”,即将刚刚生成的release签名信配置上。

操作完后,我们可以看app这个module的build.gradle文件多起了如下红框部分的代码:

图片 8

image.png

接下来实施菜单栏的”build-clean Project”:

图片 9

image.png

(2)生成realease版本的apk:
当指令行Terminal输入如下命令:(AS已经拿命行Terminal集成及了软件当中)
gradlew assembleRelease
假若运行成功,效果如下:

图片 10

image.png

项目/app/build/outputs/apk目录下

图片 11

image.png

(3)为什么要以gradlew命令而未是gradle命令:
在列工目录下有一个gradle文件夹,在gradle/wrapper目录下出一个gradle-wrapper.properties文件,打开:

图片 12

image.png

直达图表示着是工程所依靠的gradle的版本信息。上图的红线表示,如果我们的工程被从不gradle,软件会根据是url去下充斥gradle,终于理解吧底第一次打开AS时会见这么慢了咔嚓?

在意要我们实施了gradlew命令,实际上是实施方的gradle
wrapper,然后找到我们曾生充斥好的gradle
2.2.1。如果今天出成千上万个工,但是每个工程的gradle版本都非雷同,我不怕必要拿每个版本的gradle都使布局到环境变量当中,而尽了gradlew命令,就会见避免这累。

重管装包在手机上安装即可。

缺点:
然的从包方效率比低下,如果是几十个包还可以应付,打一个包快的话语需要十几秒,慢的语句需要几分钟未抵,跟机器性能非常有提到。

春风得意团多渠道打包(速度较快)

原理
将一个Android应用包当作zip文件包进行解压,然后发现于签名生成的目录下(META-INF)添加一个空文件未需再行签名。利用这机制,该公文之公文称就是沟渠名。这种办法不需更签名等手续,非常迅猛。
优点:
这种打包方式速度好抢,900差不多单沟不交均等分钟即能从了
缺点:
1、google如果哪天更改打包规则,使得以META-INF中建立拖欠文件还索要再次包装,这种措施将未可用
2、一些不法之渠道商很爱通过工具修改渠道,如果一个渠道商,通过网劫持和曲解渠道的成方式来获取暴利,对于程序开发者来说恐怕会见存在在巨大的经济损失

争运用
将需要打包的apk放在一个文书夹PythonTool下:

图片 13

image.png

图片 14

image.png

图片 15

image.png

info文件夹下,czt.txt自动生成:

图片 16

image.png

图片 17

image.png

360多渠道打包(如果打包多独)

原理
apk文件精神就是zip文件,利用zip文件“可以添加comment(摘要)”的数据结构特点,在文书之最后写副随便数据,而休用重新解压zip文件,我们便可以拿渠道信息写副摘要区
优点:
1、5M的apk,1秒种能自300只
2、在下载apk的同时,服务端可以描绘副一些消息,例如邀请码,分享信息等

缺点:
沟信息也是杀轻改,可以加密,相对于美团的章程好有的,只是加强了改动的良方。

什么样运用
360大多渠道打包工具放入MCPTool文件夹着
1、将要写副渠道信息之apk放入MCPTool文件夹着
2、修改MCPTool.bat批处理公事,更改渠道及密码(渠道信息以便安全要加密)
3、将apk拖到MCPTool.bat上推行,将会转渠道保险
4、修改MCPTool-check.bat中之密码和MCPTool.bat中的密码一致
5、将渠道包拖到MCPTool-check.bat上实施,就可检查渠道信息是否正确
6、获取渠道:将MCPTool.java添加到工程要将MCPTool.jar导入工程,调用MCPTool.getChannelId(this,”12345678″,””)
第一独参数为context,第二个是密码,第三个凡是默认值

图片 18

image.png

图片 19

image.png

MCPTool.bat打包时候用底,生成多独渠道,是加密的,MCPTool-check.bat查看有信息,是解密的(里面也闹密码)

图片 20

image.png

图片 21

image.png

图片 22

image.png

如上是根据自家的一对了然,做的总结分享,旨在抛砖引玉,希望来重多的心心相印的爱侣共同谈谈上,共同进步!