多渠道打包,主要是为了统计不同的渠道上包的下载数量,渠道越多,我们需要打的包数量越多,这个时候,我们没法去使用单纯的手动打包去一个一个的生成不同的渠道包,我们需要更高效的打包方式。

声明渠道方式一:

通常我们区分渠道都是在我们manifest 文件的 application 用这样来定义渠道信息:

<meta-data android:name="UMENG_CHANNEL" android:value=""></meta-data>

然后在我们的Java 代码中,我们通过以下方法来获取渠道号:

/**
* 获取Umeng渠道号
*
* @param context
* @return 渠道号
*/
public static String getChannel(Context context) {
String channel = "bbliveBYD";
try {
ApplicationInfo info = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
if (info != null && info.metaData != null) {
String metaData = info.metaData.getString("UMENG_CHANNEL");
if (!StringUtil.isBlank(metaData)) {
channel = metaData;
}
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return channel;
}

可以使用这种声明渠道号方式的打包方法有以下几种:

1.友盟的打包工具:

使用方式比较简单,首先按照普通的方式单独打一个签名包,然后打开我们下载的打包工具,建议使用最新的v3.2 (修复了一些前面低版本的Bug)

点击扳手的地方,进行我们应用签名的配置

最下面给我的配置文件取个名字。然后保存。

接下来,将我们前面打的签名包拖进 友盟打包工具的 加号这里,等分析结束,点击 一键打包即可。 这种方式 有的问题,可以看git上面的说明。

2 蓝贝壳儿Eclipse插件打包。

还有一种打包方式,是 插件的形式 放在Eclipse 里面的,叫 蓝贝壳儿,是一个jar包,使用也相当方便,早期公司,多渠道的时候,我也是使用这种方式,优点是:安装该插件后,只需要简单配置,既可批量打包。

需要下载一个200kb的Eclipse插件。

Android开发辅助工具— “兰贝壳儿” Eclipse插件使用指南

1.下载兰贝壳儿Eclipse插件

2.安装兰贝壳儿插件,建立Android工程

3.使用配置文件、默认配置文件

4.使用”在资源管理器中打开”功能

5.使用”依赖更新”功能

6.使用”打包发布”功能

1.下载兰贝壳儿Eclipse插件

http://www.orchidshell.com/

下载后解压缩OrchidShell.rar

确认文件夹路径为OrchidShell---eclipse---plugins

2.安装兰贝壳儿插件,建立Android工程

安装Eclipse插件,将OrchidShell文件夹拷贝到Eclipse的dropins文件夹下后,启动(重启)Eclipse

建立Android工程

在工程上点击右键可看到菜单“兰贝壳儿”,说明安装成功

3.使用”在资源管理器中打开”功能

点击兰贝壳儿菜单中的在资源管理器中打开菜单,可以将当前选中的资源所在的文件夹打开。

如果选中的资源是一个文件夹,那么插件会直接打开这个文件夹

如果选中的资源是一个文件,那么插件会打开文件的父文件夹,并且选中该文件

4.使用配置文件、默认配置文件

兰贝壳儿使用xml作为插件配置文件,当工程中不存在配置文件,而插件的某些功能需要用到配置文件的时候,插件会新建一个默认的配置文件。

该配置文件引用了一个通用的安卓开发工具包。配置了一个签名用的密钥库。你需要根据自己的实际情况修改这个配置文件。在下面两个功能中,有详细介绍。

5.使用”依赖更新”功能

点击插件右键中的“依赖更新”菜单,可以对工程的第三方依赖jar包进行更新管理。

这里使用的第三方jar包,使用maven管理jar包的组织形式

需要指出的是,这里的jar包必须有一个统一的下载网站。该网站可以是任何一家maven库或者maven库镜像。如果您自己有Team的服务器,当然也可以自己建一个Maven库来管理常用的通用组件

点击菜单之后,会在Eclipse的控制台打出更新的过程。

注意,如果配置文件配置不正确,可能会报出一些错误提示,根据错误提示进行修改配置文件即可。

6.使用”打包发布”功能

点击兰贝壳儿菜单中的“打包发布”菜单,可以对工程按渠道分别打包,打包的过程中可以对apk文件进行自动签名。

注意打包发布前,需要修改配置文件中对应的项目:

其中channels的keyname=””是指在你的AndroidManifest.xml文件中配置的Application级的的名称。例如:

这里使用的是友盟的统计SDK和机锋网的统计SDK,所以名称为“UMENG_CHANNEL,gfan_cpid”,你可以修改为你自己应用的统计SDK的渠道项目标识符,如果有多个,使用半角逗号隔开即可。

是对应于你要打包的每个渠道名称,也就是统计SDK中渠道的标识符。对于写在这里的每个渠道,插件会自动为其修改meta-data中的value值,并且打包为一个apk文件。然后为这个apk文件进行签名。

这里的keystore就是你对apk文件进行签名时使用的个人密钥。需要你将path修改为你的密钥库路径,passwd为密钥库的密码。

下面的alias是指每个密钥对应的别名,以及对应的密码。如果你有多个alias,可以在这里指定,插件会选取第一个可用的alias以及密码对应的密钥Key对你的apk文件进行签名。

这个路径就是你的apk文件自动打包生成出来以后的存放路径。注意插件会在这个路径下创建以你的工程名为名称的文件夹。

说明文档&插件下载

3.Gradle 多渠道打包 ,比较新,使用比较简单

暂未使用Android studio 打过签名包,故先贴上 生成签名方法:

点击Android Studio的 Build ,选择 generate Signed APK。

选择 create new key store:

j填完 点击OK

然后next 选择输出apk 位置。

接下来讲一下gradle 多渠道打包

1. 在AndroidManifest.xml中定义占位符

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

2. 在module的gradle脚本中替换占位符

productFlavors {
wangdoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wangdoujia"]
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
anzhi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "anzhi"]
}
}

更多渠道 的话 就按上面的 格式添加, 添加完毕后点击build----->generate signed apk 即可。

声明渠道方式二:

Android批量打包提速 - 1分钟900个市场不是梦

最后一种打包方式,在网上也有很多资料,就是根据美团的打包原理,制作的打包工具。

可以参看这边文章

Android批量打包提速 - 1分钟900个市场不是梦

普通打包方式 时间比较长,是以为需要修改manifest 文件中

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

的value, 然后继续签名 ,因此耗时。

以下为美团提供的打包思路 :(原文美团Android自动化之旅—生成渠道包)

如果能直接修改apk的渠道号,而不需要再重新签名能节省不少打包的时间。幸运的是我们找到了这种方法。直接解压apk,解压后的根目录会有一个META-INF目录,如下图所示:

如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。

添加完空渠道文件后的目录,META-INFO目录多了一个名为mtchannel_meituan的空文件:

接下来就可以在Java代码中读取空渠道文件名了:

public static String getChannel(Context context) {
ApplicationInfo appinfo = context.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
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("mtchannel")) {
ret = entryName;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} String[] split = ret.split("_");
if (split != null && split.length >= ) {
return ret.substring(split[].length() + ); } else {
return "";
}
}

这样,每打一个渠道包只需复制一个apk,在META-INF中添加一个使用渠道号命名的空文件即可。这种打包方式速度非常快,900多个渠道不到一分钟就能打完。

根据美团提供的思路, 在META-INFO中添加一个空的文件 作为 channel,可以满足一般我们的渠道要求,那么不需要签名,则大大减少了打包时间

因此有了Android批量打包提速 - 1分钟900个市场不是梦 这边文章。

下面是具体步骤:

准备

下载python: https://www.python.org
下载别人写好的脚本: https://github.com/GavinCT/AndroidMultiChannelBuildTool

####步骤

1. 拷贝`ChannelUtil.java`到项目中。
2. 代码中通过 ChannelUtil.getChannel(this)方法获取渠道号。
3. 安装Python
4. `..PythonTool\info\channel.txt`,里面去添加自己想要的渠道。
5. 放置apk到`MultiChannelBuildTool.py`所在目录,双击`MultiChannelBuildTool.py`执行脚本,完成多渠道打包。

下面演示一下 打包

我这里配置了65个包,一瞬间就打完了。

并且渠道配置也很方便,在专门的 channel.txt 中配置即可。

总结

各种打包方式的比较:

速度上来说,最后一种方式 是无敌的快,并且使用很方便,只需要我们手动打一个签名包,随后只需要脚本去执行即可。

Umeng 打包工具,普通包也可以,但是渠道多了的话,配置麻烦,并且含有so 动态链接库的 apk 打包可能会出问题

蓝贝壳儿 Eclipse打包插件, 我以前一直用的打包方式,速度比起 美团的打包思路慢,但是一般不会出错。

最新文章

  1. 【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单
  2. 网站fail_over测试(障害测试)
  3. codemirror和ace editor的语法高亮
  4. (转)HBase工程师线上工作经验总结----HBase常见问题及分析
  5. sharding-jdbc-how2work 当当的sharding-jdbc剖析(查询)
  6. MagSpoof:能预测并窃取你下一张信用卡号码的廉价设备
  7. MySQL允许远程访问
  8. linux传送文件至服务器
  9. 无法将 flash.display::Sprite@156b7b1 转换为 mx.core.IUIComponent
  10. ca 证书、签名
  11. 【转】MUD教程--巫师入门教程1
  12. Ubuntu 14.04—无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系 解决办法
  13. 1013团队Beta冲刺day1
  14. 如何使用JPQL写纯SQL语句
  15. MVC实战之排球计分(四)—— View设计与实现
  16. MySql【Insert Select Not Exist】判断记录再添加值的方案
  17. MACD判断定背离,底背离
  18. js在IE与firefox的差别。。。
  19. 在Spark上运行TopK程序
  20. Linux下安装配置Redis

热门文章

  1. 文本框、评论框原生js
  2. 亚马逊免费服务器搭建Discuz!论坛过程(四)
  3. CentOS7下安装ELK三件套
  4. 第十三节:pandas之groupby()分组
  5. 《奋斗吧!菜鸟》 第八次作业:Alpha冲刺
  6. time库
  7. 刷新PHP缓冲区
  8. [bzoj4154][Ipsc2015]Generating Synergy_KD-Tree_dfs序
  9. ZooKeeper的下载方法
  10. v$open_cursor中的相同record