要实现java一键生成渠道包功能,事先我们需要做好准备工作,大概有以下3点
1.准备好所以需要生成的渠道号放在excel文档中
2.需要下载两个jar包,commons-compress-1.16.1.jar和 jxl.jar
3.得准备你需要生成渠道包的apk,也就是说你需要在你的Android开发工具中先打
一个包,然后代码会根据这个包生成不同的渠道包
注:这些资料我都将在文章结尾给出,好废话不多说,现在开始功能的实现

一.首先你的电脑上得有java开发工具,我用的是IntelliJ IDEA 开发工具。

 1.新建一个java项目PackingTools,把commons-compress-1.16.1.jar和 jxl.jar这个两个jar包复制到libs文件中并添加依赖。2.新建一个ApkChannel类,这个类需要实现两个方法1.遍历读取excel文档中事先准备好的渠道号try {//ckjr.xls 是所有要打包的平台渠道名excel表格Workbook book = Workbook.getWorkbook(new FileInputStream(new File("F:/ckjr.xls")));Sheet sheet = book.getSheet(0);for (int i = 1; i < sheet.getRows(); i++) {String contents = sheet.getCell(1, i).getContents();if (contents != null && !"".equals(contents.trim())) {mQueue.offer(contents);                 }}book.close();} catch (Exception e) {e.printStackTrace();}File dfile = new File("F:/渠道打包/" + appName);if(!dfile.exists())dfile.mkdirs();String path = dfile.getPath();int index = 0;while(index++<15) {new Thread(new Runnable() {@Overridepublic void run() {new ApkChannel02().startCopy(path);}}).start();}2.把渠道号通过代码的形式注入到apk中
private void startCopy(String outPath) {try {String channel;while((channel=mQueue.poll(1, TimeUnit.SECONDS))!=null) {File file = new File(apkPath);FileOutputStream fos = new FileOutputStream(outPath+"/"+appName+"_" + channel +versionName);ZipFile zipFile = new ZipFile(file);ZipArchiveOutputStream zos = new ZipArchiveOutputStream(fos);Enumeration<ZipArchiveEntry> entries =  zipFile.getEntries();while(entries.hasMoreElements()) {ZipArchiveEntry entry = entries.nextElement();zos.putArchiveEntry(entry);
//                  zos.putArchiveEntry(new ZipArchiveEntry(entry.getName()));int length;byte[] buffer = new byte[1024];InputStream is = zipFile.getInputStream(entry);while((length=is.read(buffer))!=-1) {zos.write(buffer, 0, length);}is.close();buffer = null;}zos.putArchiveEntry(new ZipArchiveEntry("META-INF/channel_" + channel));zos.closeArchiveEntry();zos.close();System.out.println("剩余" + mQueue.size());}if(mQueue.size()==0) {openOutputFile();
//              System.out.println("done");}} catch (Exception e) {e.printStackTrace();}}

完整代码如下:

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.archivers.zip.ZipFile;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;import jxl.Sheet;
import jxl.Workbook;/***@desc   java实现一键打包工具*@author zhengjun*@created at 2018/5/4 16:59
*/
public class ApkChannel{private static final String versionName = "_3.7.8.apk"; //当前打包的版本号private static final String appName = "ckjr"; //apk名称,根据你的项目自己命名//事先准备好的打包apk,根据这个apk生成不同平台的apk,放在事先在F盘建好的 "渠道打包" 这个文件夹中private static final String apkPath = "F:/渠道打包/"+appName+versionName; static LinkedBlockingQueue<String> mQueue = new LinkedBlockingQueue<>(); //存储从excel中读取到的所有渠道号public static void main(String[] args) {try {//ckjr.xls 是所有要打包的平台渠道名Workbook book = Workbook.getWorkbook(new FileInputStream(new File("F:/ckjr.xls")));Sheet sheet = book.getSheet(0);//这里循环从1开始是因为我的excel文档中空了一行没写内容for (int i = 1; i < sheet.getRows(); i++) {String contents = sheet.getCell(1, i).getContents();if (contents != null && !"".equals(contents.trim())) {mQueue.offer(contents);                 }}book.close();} catch (Exception e) {e.printStackTrace();}File dfile = new File("F:/渠道打包/" + appName);if(!dfile.exists())dfile.mkdirs();String path = dfile.getPath();int index = 0;while(index++<15) {new Thread(new Runnable() {@Overridepublic void run() {new ApkChannel().startCopy(path);}}).start();}}//开始打包private void startCopy(String outPath) {try {String channel;while((channel=mQueue.poll(1, TimeUnit.SECONDS))!=null) {File file = new File(apkPath);FileOutputStream fos = new FileOutputStream(outPath+"/"+appName+"_" + channel +versionName);ZipFile zipFile = new ZipFile(file);ZipArchiveOutputStream zos = new ZipArchiveOutputStream(fos);Enumeration<ZipArchiveEntry> entries =  zipFile.getEntries();while(entries.hasMoreElements()) {ZipArchiveEntry entry = entries.nextElement();zos.putArchiveEntry(entry);int length;byte[] buffer = new byte[1024];InputStream is = zipFile.getInputStream(entry);while((length=is.read(buffer))!=-1) {zos.write(buffer, 0, length);}is.close();buffer = null;}zos.putArchiveEntry(new ZipArchiveEntry("META-INF/channel_" + channel));zos.closeArchiveEntry();zos.close();System.out.println("剩余" + mQueue.size());}if(mQueue.size()==0) {openOutputFile();}} catch (Exception e) {e.printStackTrace();}}boolean opened = false;//打包完成之后 自动打开输出路径private void openOutputFile() {synchronized (this) {if(opened) {return;}opened = true;}String[] cmd = new String[5];  cmd[0] = "cmd";  cmd[1] = "/c";  cmd[2] = "start";  cmd[3] = " ";  cmd[4] = "F:/渠道打包";  try {Runtime.getRuntime().exec(cmd);} catch (IOException e) {e.printStackTrace();}}
}

最后运行main方法即可

二. 还需要在你的Android项目中进行一些处理
1.获取包的渠道号

 /*** 获取渠道号** @param context* @return*/public static String getChannel(Context context) {if (context == null)return "";if (!TextUtils.isEmpty(channel)) {return channel;}try {ZipFile zipFile = new ZipFile(context.getApplicationInfo().sourceDir);Enumeration entries = zipFile.entries();while (entries.hasMoreElements()) {ZipEntry entry = (ZipEntry) entries.nextElement();String entryName = entry.getName();//META-INF/channel_这个标识需要跟你打包时候注入渠道号时的一致if (entryName.contains("META-INF/channel_")) {channel = entryName.replace("META-INF/channel_", "");break;}}} catch (Exception e) {e.printStackTrace();}if (TextUtils.isEmpty(channel)){channel = "ckjr_hos";}return channel;}

2.在application中进行umeng初始化的时候注入进去

   //友盟初始化,第一个参数为友盟的appkey,第二个参数为渠道号UMConfigure.init(this, AppConfig.UMENAPPKEY, getChannel(getApplicationContext()), UMConfigure.DEVICE_TYPE_PHONE, "");

最后附上源码的链接地址:https://download.csdn.net/download/qq_20489601/10692821

java实现Android一键打包,秒秒钟生成上百个渠道包相关推荐

  1. 基于Java的Android区块链开发之生成助记词(位数可选)

    基于Java的Android区块链开发之生成助记词 位数可选 具体实现代码 这里使用bitcoinj库,来实现生成bip39的12个助记词,引用库 implementation 'org.bitcoi ...

  2. 视频剪辑3.5版-一分钟生成上百个电影混剪视频

    3.5版新增多次合成和自定义分段 下面是两个功能的演示 如何一分钟生成上百个影视混剪视频 https://zhuanlan.zhihu.com/p/111542127 10秒种完成多个视频有序或随机合 ...

  3. 一分钟生成上百个电影混剪视频

    3.5-1.png 新增多次合成和自定义分段 下面是两个功能的演示 如何一分钟生成上百个影视混剪视频 10秒种完成多个视频有序或随机合成 关注公众号 golang实战应用,不定期分享密钥 软件地址:h ...

  4. php生成准考证,用这种方法5分钟就可以批量生成上百份带照片的准考证

    如何生成上百份的准考证,还是那种带照片呢?本期分享一种快速实现的技巧即借用邮件合并功能来实现. 实现效果: 想要将表格转换为下图文档格式,需要准备好一份信息表格.Word模板以及相应的照片,如下图所示 ...

  5. Android中打包含有Activity以及资源文件的jar包在工程中调用

    如何将资源以及activity文件打包成jar文件供项目调用,从android的官方文档中找到的完美的解决,这里做一个总结. 最近刚刚发布了一款小应用<诗词大全>,有兴趣的朋友请实用提出您 ...

  6. Mac环境下Android一键自动打包发布到蒲公英平台

    由于项目提测需要编译出apk然后发布到蒲公英平台供测试人员下载,在之前是需要手动编译出apk文件然后打开蒲公英网站再手动上传发布到平台,这样如果要上传几个不同的版本和渠道包就比较麻烦,于是,一个能一键 ...

  7. 新一代开源Android渠道包生成工具Walle

    本文转载自[http://tech.meituan.com/android-apk-v2-signature-scheme.html] 在Android 7.0(Nougat)推出了新的应用签名方案A ...

  8. android快速打包工具下载,【Android】多渠道打包,其实可以更快

    现状 多渠道打包,相信很同学都知道.在Android Studio中只要经过配置,就能打出对应市场的渠道包.打过包的同学可能都会有这样的感受:散热器疯狂地转.打包速度那叫一个慢.这时候除了无奈,还是无 ...

  9. android 多渠道资源,Android多渠道打包

    Android多渠道打包 概述 每当发新版本时,Android客户端会被分发到各个应用市场,比如豌豆荚,360手机助手等.为了统计这些市场的效果(活跃数,下单数等),需要有一种方法来唯一标识它们.客户 ...

最新文章

  1. oracle修改数据高性能,oracle数据库的性能调整
  2. centos6.5下系统编译定制iptables防火墙扩展layer7应用层访问控制功能及应用限制QQ2016上网...
  3. 实施TDD时的常见问题
  4. Jeesite信息化快速开发平台
  5. 使用Mockito在Java中进行模拟入门
  6. 怎么查redis 中的 cache_20、springcloud如何使用spring-cache
  7. 【运维工程师】运维工程师日常摘记
  8. ​Linux 系统 tar 文件压缩打包命令
  9. CSS3 calc() 用法
  10. Dzz1.3测试,增加IM、桌面协作、多选等。修缮问题后发布下载
  11. Android6.0 打开自启动管理页面(华为、小米)
  12. d3d透视逆向篇:第8课 通过虚表函数的获取D3D9函数指针
  13. spyeye手机远程控制手机苹果免越狱封装支持扫码安装
  14. 7.Unity2D 横版 未受伤害时,血条缓慢变透明+伤害数值显示(浮动,大小,颜色)+协程的应用
  15. 网狐【客户端配置杂项】
  16. 大数据智慧交通项目【完整资料】
  17. 海底捞市值蒸发2323亿关店300家,火锅“炼金术”还灵验吗?
  18. Flume之Failover和Load balancing原理及实例
  19. 如何检测支付宝名字性别
  20. 关于游戏开发流程的分析

热门文章

  1. 派费上涨一毛钱,能不能治快递行业的“病”?
  2. 八、输入jps时有DataNode但是网页上没有
  3. 计算机应用技术创业ppt,计算机应用基础教程任务4创业计划书排版.pptx
  4. 怎么把图片调整到合适大小?如何快速调整图片尺寸?
  5. python:返回列表和数组的最大最小值的索引
  6. 正确及时关闭数据库连接
  7. PHP 屏幕亮度,win10屏幕亮度调不了怎么办
  8. 用今天换未来:360 手机深度解析
  9. 演讲预告丨云和恩墨技术专家罗海雄受邀参加2019京津冀国际大健康产业发展高峰论坛...
  10. 深入探讨HashMap的底层结构、原理、扩容机制