极速打包【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+服务器脚本,阅读该脚本前建议先看<自动执行 ...
随机推荐
- gradle 汉化
作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com gradle 汉化 android stud ...
- BZOJ.4894.天赋(Matrix Tree定理 辗转相除)
题目链接 有向图生成树个数.矩阵树定理,复习下. 和无向图不同的是,度数矩阵改为入度矩阵/出度矩阵,分别对应外向树/内向树. 删掉第i行第i列表示以i为根节点的生成树个数,所以必须删掉第1行第1列. ...
- ssm数据库中文乱码问题
(1)详解Spring中的CharacterEncodingFilter--forceEncoding为true <a href="http://www.cnblogs.com/ ...
- spring cloud:Edgware.RELEASE版本hystrix超时新坑
升级到Edgware.RELEASE发现,zuul中不管如何设置hystrix的超时时间均不起作用,仍然是默认的1000ms. 降回低版本后正常,但是低版本的fallback方法中,又拿不到详细异常 ...
- GOCN每日新闻(2017-08-12)
1.为什么我们从 Python 转向 Go 2.Go 实现常见数据结构 3.3年半,50万行 Go 代码 4.Go 游戏引擎 oka 5.Go 是隐藏学习曲线的语言
- linux C++ 获取服务器外网IP地址(使用系统调用system)
废话不多说,直接贴代码: #include<string.h> #include<stdlib.h> #include<stdio.h> #include<s ...
- ASP.NET 网站管理工具
ylbtech-Miscellaneos:ASP.NET 网站管理工具 1. 网站管理工具概述返回顶部 网站管理工具概述 介绍 使用网站管理工具,可以通过一个简单的 Web 界面来查看和管理网站配置. ...
- angularjs 动态表单, 原生事件中调用angular方法
1. 原生事件中调用angular方法, 比如 input的onChange事件想调用angular里面定义的方法 - onChange="angular.element(this).sco ...
- mysql存储引擎的一点学习心得总结
首先我们应该了解mysql中的一个重要特性--插件式存储引擎,从名字就能够看出在mysql中,用户能够依据自己的需求随意的选择存储引擎.实际上也是这样.即使在同一个数据库中.不同的表也能够使用不同的存 ...
- 【tp5】tp5实现空模块、空控制器、空操作的页面404跳转
写在最开始:本教程适用于tp5路由的[强制模式+半pathinfo模式+pathinfo模式],通用. 比网上的[通过路由去控制空模块更强力.更全面]. PS:路由控制空模块缺点:仅仅在[强制模式下才 ...