极速打包【shell版】
同步发表至 http://avenwu.github.io/2014/12/16/fast_apk_release/
前言
前阵子无意间看到美团的技术文章,一口气读了几篇java、android相关的博文,写的都非常不错,其中有一篇讲得是android渠道包的问题,抱着好奇心读完全文,文中提到了几种渠道包生成方式,从ant+for循环,maven,gradle, zip+python,随着时间的迁移,不断在优化打包方式以满足项目需求,结合个人经历也确实如此。
本文接着zip+python方式打包的思路介绍一下gradle+zip+shell的打包,一来笔者不懂python,而来在之前已经写过结合shell脚本的两种android打包,因此对shell更感兴趣。
思路
这里所说的zip+python是笔者自己取得简称,因为涉及到了对zip压缩的处理,同时用的是python中的zip接口实现.
同理gradle+zip+shell也就是利用shell命令处理zip包,以此得到我们期待的众多apk,apk本质就是zip压缩包,所以可以直接用标准zip处理。
此法的基石在于:
目前在apk中的META-INF目录中增加一个无内容的空文件后apk无需重新签名也可以正常安装运行
当然以后这种取巧的方式能不能行的通要看之后的android编译工具。
- 第一步通过gradle生成一个标准的release apk,其他方式也可。
 - 有了标准的apk包之后我们,拷贝一份,并在其中添加一个表示渠道名称的文件,为了识别方便,可以定义自己的文件名规则,本文采用xxx.channel的格式,其中xxx为渠道名称,.channel为后缀。这样就得到了一个新的渠道包。
 - 修改项目代码,动态获取该文件,从而得到渠道名
 
开工
下面可以开始码代码了,脚本基于windows+cygwin编写,mac下测试无误。(下载cygwin时注意需要额外勾选zip和unzip两个工具)
完整脚本请参考buildtool.git,此处经提取关键部分
通过gradle构建的标准项目,文通过如下命令来生成apk,目标apk默认位于app/build/outputs/apk/xxx
./gradlew clean assembleRelease
创建存放渠道包的目录,简单起见就叫做apk,同时拷贝已经生成的apk备用,在cygwin中经常会出现文件的权错误,因此,我们需要在添加读写权限给apk
rm -rf apk
mkdir apk
cp build/outputs/apk/_.apk apk/pregnancy.apk
cd apk
chmod a+rw pregnancy.apk生成一个新的渠道包,根据当前的渠道名添加文件至apk压缩包内,这里用到了zip、unzip,相关用法不熟悉的google补一下吧
cp app.apk pregnancy_$1.apk && cp META-INF/pregnancy.channel META-INF/$1.channel
zip -r pregnancy_$1.apk META-INF/$1.channel
rm META-INF/$1.channel仔细的你可能会问渠道名在哪里获取,$1什么意思?
这里我们从预定义好的channels.properties中读取market_channel的值,并且以“,”分割得到渠道名的数组,而updateApk是我们定义的方法,方法体的内容即第三步中的代码。channels=(${market_channels//,/ })
for channel in ${channels[@]};do
updateApk $channel &
done
优化
这里其实还有两个地方可以优化
- 多核电脑可以考虑继承多线程,文中用的是background job和多线程应该还是有区别的,最好能控制线程数,已达到最优效果。
 - ant替换gradle可以减少第一个包生成的时间,目前默认情况下gradle编译要比ant慢一些。
 
结语
相比较来说这种取巧的方式得到apk的速度非常快,相同配置的情况下生成越多包优势越明显,瓶颈只在于磁盘读取速率和内存。
经实测,90个包在windows+cygwin+8g内存+ssd磁盘配置下,耗时约4分半,生成第一个包的时间约为3分钟左右,虽然没有所谓的1分钟900个包那么神奇,但是已经甩开常规循环打包几条大街了。
极速打包【shell版】的更多相关文章
- 新萝卜家园GHOST WIN7系统32,64位极速装机特别版
		
系统来自:系统妈:http://www.xitongma.com 新萝卜家园GHOST win7系统32位极速装机特别版 V2016年3月 系统概述 新萝卜家园ghost win7系统32位极速装机特 ...
 - [Android Studio] Android studio 多渠道打包(超简洁版)
		
[Android Studio] Android studio 多渠道打包(超简洁版) 转载:http://xuyazhou.com/archives/461 http://relex.me/usin ...
 - iOS 批量打包--Shell脚本
		
由于公司有批量打包的需要,只是渠道号不一样,网上搜索一番,大致有两个方式:a) 从源程序一次性打出所有渠道的ipa包,大概的思路就是利用脚本循环执行打包过程,而每次打包前都通过脚本修改项目中存放渠道号 ...
 - Linux定时对日志批量打包Shell脚本及定时任务crontab 详细用法
		
一.需求背景 因此次项目的生产环境中部署了多套系统,每天会产生大量的日志(数百GB的量),侵占了服务器宝贵的存储资源空间.为了有效缓解服务器存储压力,考虑通过Linux的Shell脚本结合cr ...
 - uniapp打包发版到linux服务器步骤----H5端
		
最近在写uni-app项目,项目打包部署到服务器后,搞了好一会一直打开是空白页,原来自己有几个地方疏忽了,现把步骤整理一下: 第1步:编辑配置 mainifest.json 文件 tip:运行的基础路 ...
 - 三分钟:极速体验JAVA版目标检测(YOLO4)
		
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
 - [像黑客一样生活] shell终端听音乐之网易云shell版
		
这是一个Python程序,使用Python构建,并以mpg123作为后端.Follow me... 特点: Vim 式的流畅操作,支持快捷键绑定 支持电台.收藏等各种特色功能 支持 OS X 及各类 ...
 - 增量打包DOC版
		
压缩zip的命令有的系统没有的自己去下载一个,否则关闭压缩zip的命令. 有需要的自行更改,这是满足我需求的. 执行 publish.bat 即可,当然需要将文件清单写好放在 resources.tx ...
 - 并发批量管理500台以上服务器脚本分享(shell版)
		
转载于运维笔记 Categories:Shell 也许很多人认为shell不能并发任务,其实可通过其它一些方式来实现.下面的脚本是我批量快速管理500+服务器脚本,阅读该脚本前建议先看<自动执行 ...
 
随机推荐
- Web大前端面试题-Day7
			
1. 你能描述一下渐进增强和优雅降级之间的不同吗? 定义: 优雅降级(graceful degradation): 一开始就构建站点的完整功能, 然后针对浏览器测试和修复 渐进增强(progressi ...
 - BZOJ.4892.[TJOI2017]DNA(后缀自动机/后缀数组)
			
题目链接 \(Description\) 给出两个串\(S,T\),求\(T\)在\(S\)中出现了多少次.出现是指.可以有\(3\)次(\(3\)个字符)不匹配(修改使其匹配). \(Solutio ...
 - Python3NumPy——ndarray对象
			
Python3NumPy——ndarray对象 1.前沿 推荐导入语法:import numpy as np NumPy中使用ndarray对象表示数组,ndarray是NumPy库的核心对象 2.创 ...
 - pho文件操作
			
php文件操作函数 readfile - 适用于打开一个文件并读取文件的内容 echo readfile('e:/webdictionary.txt'); fopen('文件名','打开模式') - ...
 - reac-native环境搭建
			
转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native%E7%8E%AF%E5%A2%83%E6%90% ...
 - Hbase常用Shell命令
			
status 查看系统状态 hbase(main):010:0> status 1 active master, 0 backup masters, 4 servers, 0 dead, 6.5 ...
 - python 环境搭建和Spyder的安装应用
			
http://blog.csdn.net/BurneAris/article/details/75214976
 - Delphi 中big5 转 Unicode 函数
			
function Big5ToUnicode(str Char): widestring; var len: integer; begin len:=MultiByteToWideChar(,,PCh ...
 - 提交JSON修改数据
			
提交JSON修改数据 设计目标: 1)可以一次性提交多个表的修改数据 2)跨语言.跨平台 { "deltas": [ { "table": "tuni ...
 - Python报错:ImportError: No module named src.data_layer
			
ImportError: No module named src.data_layer 解决方案: export PYTHONPATH=path/to/modules