界面流程

界面如下:

这是一个使用html编写的界面,界面分为两半,两个frame,左边为操作栏,右边为控制台输出。

打包流程:
选择需要打包的渠道后,点击打包,等待服务器打包,并把日志输出到右边的frame。

打包完成后,点击”点击打开下载界面”链接,跳转到下载界面。

实现思路

环境说明

服务器使用的是apache server2.4.12,所以与浏览器的交互是使用cgi,关于cgi可以参考这里。
自动化的实现使用ant。关于ant可以参考这里。

开发工具:vs2013
开发语言:html、javascript、C++
系统:win7 x64

浏览器与服务端的交互。

服务端结构:

在主界面左边的frame中有一个渠道列表,每个渠道对应一个id。

<fieldset align="left" ><legend>渠道列表:</legend><label class="labelChnnel">Debug<input class="btnChnnel" name="chnnel" type="checkbox" value="1" /></label><label class="labelChnnel">小米<input class="btnChnnel" name="chnnel" type="checkbox" value="2" /></label><label class="labelChnnel">360<input class="btnChnnel" name="chnnel" type="checkbox" value="3" /></label><label class="labelChnnel">安智<input class="btnChnnel" name="chnnel" type="checkbox" value="4" /></label><label class="labelChnnel">应用汇<input class="btnChnnel" name="chnnel" type="checkbox" value="5" /></label><label class="labelChnnel">中国移动<input class="btnChnnel" name="chnnel" type="checkbox" value="6" /></label><label class="labelChnnel">中国联通<input class="btnChnnel" name="chnnel" type="checkbox" value="7" /></label><label class="labelChnnel">中国电信<input class="btnChnnel" name="chnnel" type="checkbox" value="8" /></label><label class="labelChnnel">九游<input class="btnChnnel" name="chnnel" type="checkbox" value="9" /></label></fieldset>

当点击打包的时候,会先获取当前选择的所有的渠道id并连接成一个字符串。

// 获取选择的渠道列表function getChnnelList(){//getElementsByTagName:根据标签名获取元素集合//getElementById:根据id获取元素//getElementsByName:根据名称(name属性值)获取元素集合var checkboxes = document.getElementsByName('chnnel');      var len = checkboxes.length;var chnnelList = "";for(var i=0; i<len; ++i){if(checkboxes[i].checked){chnnelList = chnnelList + checkboxes[i].value + " "; //把渠道id连接成字符串}}return chnnelList;}

接着调用requestPkg方法并把渠道id字符串传入,该方法会发送一个异步请求到服务端,并把服务器返回的数据显示在右边的frame中。

// 打包function requestPkg( data ){var img = document.getElementById("loadingImg");// 防止连续点击if('inline' == img.style.display){return}//显示loadingshowLoading();var xmlHttp = new XMLHttpRequest();// 1.提交方式(GET/POST)// 2.url// 3.是否异步xmlHttp.open( "POST", "http://localhost/cgi-bin/apkpkg.cgi", true );xmlHttp.overrideMimeType('text/plain; charset=gbk'); // 解决frame中文乱码问题// response handlerxmlHttp.onreadystatechange = function () {if (xmlHttp.readyState == XMLHttpRequest.DONE) {if (xmlHttp.status == 200) {// 把返回数据显示在右边的framevar doc = parent.right_frame.document;//添加html文本var html = doc.createElement("div");html.className = "description";html.innerHTML = xmlHttp.responseText;doc.body.appendChild(html);// 添加普通文本//var txt=doc.createTextNode(xmlHttp.responseText)      //doc.body.appendChild(txt)//自动向下滚动parent.right_frame.scrollBy(0, html.scrollHeight); } else if (xmlHttp.status == 400) {console.log('There was an error 400');} else {console.log('something else other than 200 was returned');}//隐藏loadinghideLoading();}};// 发送请求xmlHttp.send( data );       }

服务端处理流程如下:
1.服务端接受到渠道id字符串后,对字符串进行分割并转换为整数,添加到chnnelList
2.然后调用git pull(如果是svn则执行svn update)命令更新工程。
3.迭代chnnelList,根据渠道id执行不同的命令(ant可以把一系列操作简化成执行一个命令。其实打包的过程,无非是对文件的一些操作,如删除、拷贝、移动、替换文件内容等,或者是执行一些命令,这些都可以通过ant实现,如果真遇到ant库提供的功能实现不了的需求,ant也提供了扩展的接口,具体可参考这里,可以的话也跟我说说吧。)
4.输出执行结果。

//main.cpp
#include <stdio.h>
#include <iostream>
#include "cmdlib.h"#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>using namespace std;//常量
class Constant{
public:// 工程所在目录static const char* ProjectDir; //声明静态变量
};
// 静态变量的初始化
const char* Constant::ProjectDir = "D:/AndroidDeveloper/workspace2/AntTest";// 根据渠道id执行不同的命令
void exeCmd(int &id){switch (id){//Debugcase 1:cmd::exec_atdir(Constant::ProjectDir, "ant buildDebug", true);break;//小米case 2:cmd::exec_atdir(Constant::ProjectDir, "ant buildXiaoMi", true);break;//360 case 3:break;//安智 case 4:break;//应用汇 case 5:break;//中国移动 case 6:break;//中国联通 case 7:break;//中国电信 case 8:break;//九游case 9:break;}
}void main(){cout<<"Context-type:text/html; charset=UTF-8 \n\n";cout<<"<html>";cout<<"<body>";// 获取提交的参数char params[256] = { 0 };gets_s(params);//获取输入cout << "<p>params=" << params << "</p>";vector<string> chnnelStrList;istringstream iss(params);// 对字符串进行分割,并拷贝到渠道列表copy(istream_iterator<string>(iss),             // 开始位置istream_iterator<string>(),                 // 结束位置back_inserter<vector<string>>(chnnelStrList)); // push_back到vector// 把字符串转换成整数vector<int> chnnelLlist;int chnnel = 0;for_each(chnnelStrList.begin(), chnnelStrList.end(), [&chnnel, &chnnelLlist](string & str){chnnel = atoi(str.c_str());if (chnnel != 0){chnnelLlist.push_back(chnnel);}});// 首先更新工程// svn update / git pullcmd::exec_atdir(Constant::ProjectDir, "git pull", false);// 根据id执行对应的命令for_each(chnnelLlist.begin(), chnnelLlist.end(), [](int & id){exeCmd(id);});cout<<"</body>";cout<<"</html>";
}
// cmdlib.h
#ifndef __CMDLIB_H__
#define __CMDLIB_H__#include <iostream>
#include <stdlib.h>
#include <string.h>using namespace std;namespace cmd{// 执行命令并输出bool exec_output(const char* cmd){// 执行命令,并打印输出FILE* pipe = _popen(cmd, "r"); // 第一个参数是指令字符串,第二个参数是模式(r:读,w:写)// _popen函数用于执行一条指令并把结果输出到内存中的文件对象if (!pipe){return false;}cout << "<p>";// 把执行结果输出到网页char ch = 0;while (!feof(pipe)){ch = fgetc(pipe);// 把'\n'换行符换成网页中的换行符<br />if (ch == '\n'){cout<<"<br />";}else{putchar(ch);}}cout << "</p>";return true;}// 在指定目录下执行一个命令// dir:目录路径// cmd:命令// is_out:是否输出执行结果void exec_atdir(const char* dir, const char* cmd, bool is_out = false){char buff[1024] = { 0 };#if _WIN32sprintf_s(buff, "cd /d %s & %s", dir, cmd);
#elsesprintf_s(buff, "cd %s & %s", dir, cmd);
#endifif (is_out){exec_output(buff);}else{system(buff);}}};#endif

在Apache Server安装目录下有一个htdocs目录,是网站的根目录,我在这里新建了一个apk目录,用于存放所以自动生成的apk,通过http://localhost/apk(这里的localhost指服务器的ip,因为我在本地测试所以使用localhost)可以在浏览器访问该目录。通过ant命令生成的apk最后会被移动到该目录下。

最后,渠道包生成完成后,点击链接,浏览器跳转到渠道包列表网页下载渠道包。

相关文章

1.Ant开发总结
2.CGI编程

项目地址:https://coding.net/u/linchaolong/p/BSBatchPkgTool/git

B/S模式实现批量打包apk相关推荐

  1. linux环境对apk文件写入数据,Linux下7zip命令apk中插入文件标识渠道批量打包

    项目需要:需要对某个包分包,对渠道和下面的包做标记,但又不改变原包的签名,想到在原apk中插入某个带渠道号和包号的文件,服务器Linux环境,采用7zip 压缩格式解压,打包,插入文件到apk解压后的 ...

  2. Android批量打包 如何一秒内打完几百个apk渠道包

    在国内Android常用渠道可能多达几十个,如:  谷歌市场.腾讯应用宝.百度手机助手.91手机商城.360应用平台.豌豆荚.安卓市场.小米.魅族商店.oppo手机.联想乐商.中兴汇天地.华为.安智. ...

  3. linux apk 打包工具,linux下apk批量打包

    1.思路 整个思路就是,把需要修改的参数以的方式定义在项目的AndroidManifest.xml文件中,具体参数如何获取及具体用法这儿我就不多说,然后打包好一个完整的apk包作为参照包.然后用pyt ...

  4. Android 美团批量打包新方案

    参考地址: https://github.com/Meituan-Dianping/walle/blob/master/walle-cli/README.md 配置部分: 1.把channel文件和 ...

  5. ant 实现批量打包android应用

    很多的应用中需要加上应用推广的统计,如果一个一个的去生成不同渠道包的应用,效率低不说,还有可能不小心弄错了分发渠道,使用ant可以批量生成应用. 一.添加渠道包信息 为了统计渠道信息,就不得不在程序的 ...

  6. win8下cocos2dx3.2移植android平台及代码打包APK

      cocos2dx程序不能只在VS2012下运行,迟早是要搬运到Android和IOS上的.Windows下移植IOS平台先搁下不说比较困难,而且只有越狱的苹果机才可以运行,而且毕竟IOS高端.小众 ...

  7. 【Egret】Wing3发布移动APP功能,打包APK流程以及会遇到的问题

    流程:1.安装好wing 3,然后 插件--Egret项目工具--发布移动APP--Build android native project 2.配置发布环境: Android 1.egret eng ...

  8. android打包工具多渠道批量打包,Android 快速渠道批量打包详解教程-美团多渠道打包方案...

    今天写一篇文章来总结下android批量打渠道包美团版本.之前项目上一直用的是gradle 批量打包方式,那个速度啊真是令人发指,15个渠道得跑上半个小时,出去吃顿饭回来,还在跑.特别是赶上项目上线的 ...

  9. 使用Ant 实现批量打包Android应用

    2019独角兽企业重金招聘Python工程师标准>>> 由于公司运维需要以及应用中需要加上应用推广的统计,往往要对应二三十个渠道,按照正常方法一个一个的去生成不同渠道包的应用,不仅浪 ...

最新文章

  1. window10 系统上 ecplise 环境搭建
  2. Python 解决 :NameError: name 'reload' is not defined 问题
  3. C++ 接口(抽象类)的概念
  4. 新版Edge浏览器弹出“ 禁用开发人员模式扩展 ”的解决方案
  5. java怎么在记事本里写过运行_[置顶] 如何运行用记事本写的java程序
  6. linux fastboot 工具,fastboot工具(FastbootCommander)
  7. 淘宝店铺950自定义模块实现1920全屏代码
  8. 单径瑞利信道的BPSK相干解调的理论误码率推导与MATLAB分析(1)
  9. recipe terminated with fatal error: spawn xelatex enoent.
  10. wifi6无线网卡驱动linux,linux2.6.8内核装intel wifi link 5100无线网卡驱动的问题?
  11. woj 1567 - D - Sloth's Angry(贪心)
  12. 在中国,考不上高中的孩子去哪儿了
  13. svn: E170013: Unable to connect to a repository at URL ...
  14. 制导武器的分布式半实物仿真系统研究
  15. PS 修改图片上的文字内容但保留文字格式
  16. 抓包分析SSL/TLS连接建立过程
  17. Git基础(21):GitLab创建组、用户、项目
  18. [VB.NET源码]学习教程(PDF)
  19. 【过程控制工程】第三次在线作业
  20. Python库学习-Pandas

热门文章

  1. 使用snmpwalk采集设备的OID信息
  2. 《Presto(Trino)——The Definitive Guide》CHAPTER 6 Connectors Advanced CHAPTER 7 Connector Examples
  3. 已安装各个模块,程序仍报错:ModuleNotFoundError: No module named 'numpy'
  4. python爬虫中字符串开头b,u,r的含义
  5. Ubuntu怎么念?
  6. android最新直播框架,NDK--Android Studio中直播推流框架的搭建
  7. 量化选股模型—一致预期模型
  8. php菱形循环代码,PHP练习–用for循环打印空心菱形,for菱形_PHP教程
  9. java方法头_java方法学习
  10. 官方正式发布 Java 16