极速打包【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+服务器脚本,阅读该脚本前建议先看<自动执行 ...
随机推荐
- JS 显示周 几和 月 日
function getMyDay(date){ var week; ; var day = date.getDate(); ) week="周日" ) week="周一 ...
- .w调用action
有两种方法发送Action请求,分别是sendBizRequest和sendBizRequest2,前者返回xml格式的参数,后者提供了返回json或者xml格式的参数的能力. 1.sendBizRe ...
- Charles抓包http和https
本来不打算写的,度娘一搜一大堆各种教程,实在是网上的各种设置的各种坑都有,我还是站在巨人的肩膀上汇总一下吧 首先http的就不用说了,各种教程版本区别不大,也没什么坑,主要是https: 第一步先下载 ...
- SharePoint 2019 离线安装准备工具
前言 最近需要安装SharePoint 2019,然而,服务器并没有网络,所以需要离线安装. 离线安装的步骤很简单,就是把所以得准备工具下载下来,然后修改好命令,使用命令安装即可. 准备工具下载路径 ...
- opencv rtsp 人脸识别
import cv2 import dlibimport jsonface_detector = dlib.get_frontal_face_detector() cap = cv2.VideoCap ...
- AB Test 是什么
关于AB Test是什么 一种灰度发布方式. ps:什么是灰度发布 每个灰度对象都是0%(白色)到100%(黑色)的中间值,灰度发布是指在黑白之间,能够平滑过度的一种发布方式. 实现方式 让一部分用户 ...
- 9.5 dubbo事件通知机制
dubbo事件通知机制:http://dubbo.io/books/dubbo-user-book/demos/events-notify.html 一.使用方式 两个服务: DemoService: ...
- WPF应用程序exe接收参数
using System;using System.ServiceProcess; namespace GoShopService{ public partial class Service1 ...
- linux系统下创建oracle表空间和用户权限查询
创建用户和表空间: 1.登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切换成oracle用户) 2.以sysdba方式来打开sqlplus,命令 ...
- Eclipse 插件开发 -- 深入理解菜单(Menu)功能及其扩展点( FROM IBM)
Eclipse 插件开发 -- 深入理解菜单(Menu)功能及其扩展点 菜单是各种软件及开发平台会提供的必备功能,Eclipse 也不例外,提供了丰富的菜单,包括主菜单(Main Menu),视图 / ...