MutiChannelPackup

android多渠道-N种方法-android多渠道-N种方法-
授权协议 Apache
开发语言 Java
所属分类 手机/移动开发、 手机开发包
软件类型 开源软件
地区 国产
投 递 者 干京
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

<h1   MutiChannelPackup <p   Android多渠道打包,有网页版,Gradle版,Python版、BAT脚本、Jar版…看大家的喜好选择

  • META-INF渠道识别型:网页版、Python版、BAT脚本、Jar版、

  •   Manifest渠道识别型:Gradle版

    META-INF渠道识别详情请查看美团team博客 点击查看

功能描述

  • 支持修改manifest渠道配置

  • 支持在apk的META-INFO目录下生成渠道文件

  • APK不需要重新签名

  • 现只对umeng渠道统计做了支持

  • 不需要第二次签名

  • 对包无损害

功能更新中

  • 支持更多的第三方渠道统计工具

  • 编写windowns bat脚本

  • 添加网页版用户体系、权限和数据库配置

  • ……

网页版

  • META-INF渠道识别

  • 使用简单,非技术小白也可以用

  • 功能相对强大(设计中…)

    1、在android中获取渠道名:

    /**  * 友盟配置  */ private void umengConfig() { String channel = getChannelFromApk(this, "channel-"); if (StringUtils.isEmpty(channel)) {
            channel = "paojiao";
        } if ( Constants.DEBUG ) { Toast.makeText(IApplication.this, "当前渠道:" + channel, Toast.LENGTH_SHORT).show();
        } AnalyticsConfig.setChannel(channel);
    } /**  * 从apk中获取版本信息  * @param context  * @param channelPrefix 渠道前缀  * @return  */ public static String getChannelFromApk(Context context, String channelPrefix) { //从apk包中获取 ApplicationInfo appinfo = context.getApplicationInfo(); String sourceDir = appinfo.sourceDir; //默认放在meta-inf/里, 所以需要再拼接一下 String key = "META-INF/" + channelPrefix; String ret = ""; ZipFile zipfile = null; try {
            zipfile = new ZipFile(sourceDir); Enumeration<?> entries = zipfile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = ((ZipEntry) entries.nextElement()); String entryName = entry.getName(); if (entryName.startsWith(key)) {
                    ret = entryName; break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally { if (zipfile != null) { try {
                    zipfile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } String[] split = ret.split(channelPrefix); String channel = ""; if (split != null && split.length >= 2) {
            channel = ret.substring(key.length());
        } return channel;
    }

    2、在build-config.properties中配置渠道识别前缀(可选)

    3、把AndroidChannelBuild.war上传到Java服务CHANNEL_VALUE器上

    4、输入http://www.xxx.yyy/AndroidChannelBuild/

    5、上传文件、填写渠道前缀(可选)、输入渠道名称

    6、下载打包完成的渠道包

Gradle版

  •             支持manifest渠道配置

  •             使用简单不易出错

manifest渠道配置

    网络上有好多人都是通过添加

android {  
    productFlavors {
        xiaomi {}
        360 {}
        baidu {}
        wandoujia {}
    }  

    productFlavors.all { 
        flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name] 
    }
}

    代码实现的多渠道打包,这样有个问题,我们项目渠道号经常变,每个版本都有不同的渠道号,不停的在增加导致gradle文件就非常长。我今天特别为这个事情纠结了一上午发现还可以这么写:

productFlavors {
        for (int i = 0 ; i < channelArray.size(); i++) {
            def channel = channelArray[i]
            "${channel}"{
                manifestPlaceholders = [CHANNEL_VALUE: channel]
            }
        }
    }

    让我格外的惊喜,这里分享给大家

使用方法

    1、添加channels.properties渠道信息配置文件

#默认渠道 channel.default=paojiao #全部渠道列表 channel.list=baidu,360,hiapk....

    2、在module build.gradle引入channels.gradle配置文件

apply from: "https://raw.githubusercontent.com/MutiChannelPackup/gradle-build/master/channels.gradle"

    或者将channels.gradle下载到本地引入

apply from: "../channels.gradle"

    3、在manifest中添加

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

    4、执行打包./gradlew assembleRelease或通过android studio->generate signed apk打包

    5、在module目录下可以看到所有的渠道包

Python版

  •             支持META-INF渠道识别

  •             极速生成渠道包

  •             使用简单不易出错

使用方法

    1、在android中获取渠道名:

    /**  * 友盟配置  */ private void umengConfig() { String channel = getChannelFromApk(this, "channel-"); if (StringUtils.isEmpty(channel)) {
            channel = "paojiao";
        } if ( Constants.DEBUG ) { Toast.makeText(IApplication.this, "当前渠道:" + channel, Toast.LENGTH_SHORT).show();
        } AnalyticsConfig.setChannel(channel);
    } /**  * 从apk中获取版本信息  * @param context  * @param channelPrefix 渠道前缀  * @return  */ public static String getChannelFromApk(Context context, String channelPrefix) { //从apk包中获取 ApplicationInfo appinfo = context.getApplicationInfo(); String sourceDir = appinfo.sourceDir; //默认放在meta-inf/里, 所以需要再拼接一下 String key = "META-INF/" + channelPrefix; String ret = ""; ZipFile zipfile = null; try {
            zipfile = new ZipFile(sourceDir); Enumeration<?> entries = zipfile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = ((ZipEntry) entries.nextElement()); String entryName = entry.getName(); if (entryName.startsWith(key)) {
                    ret = entryName; break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally { if (zipfile != null) { try {
                    zipfile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } String[] split = ret.split(channelPrefix); String channel = ""; if (split != null && split.length >= 2) {
            channel = ret.substring(key.length());
        } return channel;
    }

    2、配置channels-config.ini文件

[Build-Config] #配置apk路径 apk.path = /Users/pengjianbo/Documents/dev/android_dev/workspace/GradleBuildChannels/app/demo.apk #配置渠道识别前缀 channel.prefix = channel- #配置渠道列表 channel.list = baidu,qq,360,paojiao

    3、执行build-channels-script.py脚本

python build-channels-script.py

    4、可以看到生成了一个apks_{apk file name}的文件夹

Jar版

  •             支持META-INF渠道识别

  •             极速生成渠道包

  •             使用简单不易出错

使用方法

    1、在android中获取渠道名:

    /**  * 友盟配置  */ private void umengConfig() { String channel = getChannelFromApk(this, "channel-"); if (StringUtils.isEmpty(channel)) {
            channel = "paojiao";
        } if ( Constants.DEBUG ) { Toast.makeText(IApplication.this, "当前渠道:" + channel, Toast.LENGTH_SHORT).show();
        } AnalyticsConfig.setChannel(channel);
    } /**  * 从apk中获取版本信息  * @param context  * @param channelPrefix 渠道前缀  * @return  */ public static String getChannelFromApk(Context context, String channelPrefix) { //从apk包中获取 ApplicationInfo appinfo = context.getApplicationInfo(); String sourceDir = appinfo.sourceDir; //默认放在meta-inf/里, 所以需要再拼接一下 String key = "META-INF/" + channelPrefix; String ret = ""; ZipFile zipfile = null; try {
            zipfile = new ZipFile(sourceDir); Enumeration<?> entries = zipfile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = ((ZipEntry) entries.nextElement()); String entryName = entry.getName(); if (entryName.startsWith(key)) {
                    ret = entryName; break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally { if (zipfile != null) { try {
                    zipfile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } String[] split = ret.split(channelPrefix); String channel = ""; if (split != null && split.length >= 2) {
            channel = ret.substring(key.length());
        } return channel;
    }

    2、配置build-config.properties文件

#配置apk路径 apk.path = /Users/pengjianbo/Documents/dev/android_dev/workspace/GradleBuildChannels/app/demo.apk #配置渠道识别前缀 channel.prefix = channel- #配置渠道列表 channel.list = baidu,qq,360,paojiao

    3、执行JarBuild.jar

java -jar JarBuild.jar

    4、可以看到在apk.path文件夹下生成了所有渠道包

BAT版

Upcoming...

 相关资料
  • 本文向大家介绍Android多渠道打包时获取当前渠道的方法,包括了Android多渠道打包时获取当前渠道的方法的使用技巧和注意事项,需要的朋友参考一下 作为Android app,发布多个分发平台是常规操作。然后,有时由于个渠道面对的用户不同,或平台审核标准不同,需要在各渠道使用不同的业务逻辑,这就需要根据渠道使用选择差异化代码。 这里把简单的代码记一下。 首先,分渠道打包很简单。 在项目的bui

  • 本文向大家介绍Android Studio多渠道打包的配置方法,包括了Android Studio多渠道打包的配置方法的使用技巧和注意事项,需要的朋友参考一下 说到多渠道,这里不得不提一下友盟统计,友盟统计是大家日常开发中常用的渠道统计工具,而我们的打包方法就是基于友盟统计实施的。按照友盟官方文档说明,渠道信息通常需要在AndroidManifest.xml中配置如下值: 上面的value值Cha

  • 国内Android应用下载有360、小米、豌豆荚、百度等等非常多的渠道, 如果我们想统计每个渠道的下载量和活跃度,就需要使用统计平台. 我们以友盟统计为例,介绍如何配置渠道信息并执行自动化打包. 1.在AndroidMainfest.xml配置可动态替换的渠道参数 友盟集成文档中有说明,使用友盟统计需要在AndroidMainfest.xml配置相应的渠道号: <meta-data andro

  • 我们在日常开发中多多少少都会遇到多渠道打包的情况。这些版本可能会上传到不同的应用市场,也可能是是线下多渠道推荐。有时候可能不同的渠道使用的资源图片都不一样。古老的做法就是,需要打多少个渠道包拉出多少份代码分支,分别替换对应的资源文件和包名配置信息等。这种做法非常的耗时耗力。Gradle 可以帮我们用一份代码通过配置实现打出所有的渠道包。 1. 创建多渠道资源文件目录 首先,我们新创建一个工程,然后

  • 渠道分析 渠道来源细分

  • 国内市场上有许许多多的应用市场,常见的有:百度、360、腾讯应用宝、豌豆荚等。 其他手机厂家如小米、华为、魅族、三星等都有自己的应用市场,总共有上百家! 问题 发版前,Android工程师打包了上百个渠道版本,如何检验渠道号与apk名称是否一致? 希望自动去获取apk的友盟渠道号,并自动进行校验。 怎么做 Android Apk的渠道号一般存放在AndroidManifest.xml文件中。 批量

  • 本文向大家介绍Android Studio多渠道打包套路,包括了Android Studio多渠道打包套路的使用技巧和注意事项,需要的朋友参考一下        说到多渠道,这里不得不提一下友盟统计,友盟统计是大家日常开发中常用的渠道统计工具,而我们的打包方法就是基于友盟统计实施的。按照友盟官方文档说明,渠道信息通常需要在AndroidManifest.xml中配置如下值:        上面的v

  • 点击此处可下载并查看多方主体协议请将多方主体协议下载打印并按要求填写,并将填好的协议快递至: 地址:北京市海淀区东北旺西路8号院尚东数字山谷B区1号楼 收件人:企业级事业部 联系电话:010-83041496具体填写要求如下: 甲方处填写客户已经注册或开户使用的公司名称 甲方关联公司名录处填写贵公司将要关联的公司名称 盖章处需加盖甲方及其关联公司的公章 乙方名称为必填,(名称:滴滴出行科技有限公司