同步发表至 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,此处经提取关键部分

  1. 通过gradle构建的标准项目,文通过如下命令来生成apk,目标apk默认位于app/build/outputs/apk/xxx

    ./gradlew clean assembleRelease

  2. 创建存放渠道包的目录,简单起见就叫做apk,同时拷贝已经生成的apk备用,在cygwin中经常会出现文件的权错误,因此,我们需要在添加读写权限给apk

    rm -rf apk

    mkdir apk

    cp build/outputs/apk/_.apk apk/pregnancy.apk

    cd apk

    chmod a+rw pregnancy.apk

  3. 生成一个新的渠道包,根据当前的渠道名添加文件至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

  4. 仔细的你可能会问渠道名在哪里获取,$1什么意思?

    这里我们从预定义好的channels.properties中读取market_channel的值,并且以“,”分割得到渠道名的数组,而updateApk是我们定义的方法,方法体的内容即第三步中的代码。

    channels=(${market_channels//,/ })

    for channel in ${channels[@]};do

    updateApk $channel &

    done

优化

这里其实还有两个地方可以优化

  1. 多核电脑可以考虑继承多线程,文中用的是background job和多线程应该还是有区别的,最好能控制线程数,已达到最优效果。
  2. ant替换gradle可以减少第一个包生成的时间,目前默认情况下gradle编译要比ant慢一些。

结语

相比较来说这种取巧的方式得到apk的速度非常快,相同配置的情况下生成越多包优势越明显,瓶颈只在于磁盘读取速率和内存。

经实测,90个包在windows+cygwin+8g内存+ssd磁盘配置下,耗时约4分半,生成第一个包的时间约为3分钟左右,虽然没有所谓的1分钟900个包那么神奇,但是已经甩开常规循环打包几条大街了。

极速打包【shell版】的更多相关文章

  1. 新萝卜家园GHOST WIN7系统32,64位极速装机特别版

    系统来自:系统妈:http://www.xitongma.com 新萝卜家园GHOST win7系统32位极速装机特别版 V2016年3月 系统概述 新萝卜家园ghost win7系统32位极速装机特 ...

  2. [Android Studio] Android studio 多渠道打包(超简洁版)

    [Android Studio] Android studio 多渠道打包(超简洁版) 转载:http://xuyazhou.com/archives/461 http://relex.me/usin ...

  3. iOS 批量打包--Shell脚本

    由于公司有批量打包的需要,只是渠道号不一样,网上搜索一番,大致有两个方式:a) 从源程序一次性打出所有渠道的ipa包,大概的思路就是利用脚本循环执行打包过程,而每次打包前都通过脚本修改项目中存放渠道号 ...

  4. Linux定时对日志批量打包Shell脚本及定时任务crontab 详细用法

    一.需求背景     因此次项目的生产环境中部署了多套系统,每天会产生大量的日志(数百GB的量),侵占了服务器宝贵的存储资源空间.为了有效缓解服务器存储压力,考虑通过Linux的Shell脚本结合cr ...

  5. uniapp打包发版到linux服务器步骤----H5端

    最近在写uni-app项目,项目打包部署到服务器后,搞了好一会一直打开是空白页,原来自己有几个地方疏忽了,现把步骤整理一下: 第1步:编辑配置 mainifest.json 文件 tip:运行的基础路 ...

  6. 三分钟:极速体验JAVA版目标检测(YOLO4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. [像黑客一样生活] shell终端听音乐之网易云shell版

    这是一个Python程序,使用Python构建,并以mpg123作为后端.Follow me... 特点: Vim 式的流畅操作,支持快捷键绑定 支持电台.收藏等各种特色功能 支持 OS X 及各类 ...

  8. 增量打包DOC版

    压缩zip的命令有的系统没有的自己去下载一个,否则关闭压缩zip的命令. 有需要的自行更改,这是满足我需求的. 执行 publish.bat 即可,当然需要将文件清单写好放在 resources.tx ...

  9. 并发批量管理500台以上服务器脚本分享(shell版)

    转载于运维笔记 Categories:Shell 也许很多人认为shell不能并发任务,其实可通过其它一些方式来实现.下面的脚本是我批量快速管理500+服务器脚本,阅读该脚本前建议先看<自动执行 ...

随机推荐

  1. supervisor管理进程工具配置

    Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统 ...

  2. python生成指定文件夹目录树

    # -*- coding: utf-8 -*- import sys from pathlib import Path class DirectionTree(object): "" ...

  3. python学习之思维导图

    思维导图——牛刀小试 刚刚学完了python的网络编程,在复习整理知识点的过程中,了解到思维导图是一种强大的工具. 思维导图又叫心智导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种 ...

  4. PCB编译时出现的错误 ( Duplicate Net Names Wire N000-1 (Inferred)意思就是端口名字没有定义)

    再运行这个错误Duplicate Net Names Wire N000-1 (Inferred)的就没有了, 不过还有其他的 错误,有错误不用怕,关我的博客解决.

  5. 当删除某一个jar包时tomcat中出现problem encountered while deleting resources问题

    http://blog.csdn.net/u013226462/article/details/17715031

  6. Javascript中快速退出多重循环的技巧

    在双重循环或多重循环中判断条件,条件符合时跳出整个嵌套循环体是常见的程序逻辑.在Javascript中有哪些跳出的方法呢?楼主简单整理了一下. 一. 使用多个break语句跳出 var breaked ...

  7. 怎样使用ZOL一键安装器下载中关村在线的源安装包

    怎样使用ZOL一键安装器下载中关村在线的源安装包 马根峰               (广东联合电子服务股份有限公司, 广州 510300) 摘要    中关村在线近期開始推出ZOL一键安装器,用户直 ...

  8. AndroidStudio下加入百度地图的使用 (三)——API基本方法及常量属性

    上一章中我们已经完成定位功能,这一章向大家介绍一下常用的方法及常量属性的意思. (1) 手势方法 缩放: setZoomGesturesEnabled() 俯视: setOverlookingGest ...

  9. [Android]_[0基础]_[adb 有用命令]

    场景: 1. ADB 作为pc端和手机端通讯的桥梁, 起到调试手机app,查看手机信息的重要作用. 2. 这里列举了一些比較有用的命令方便速查. 查看开启USB调试的设备列表: adb devices ...

  10. Java中多环境Logback配置与ELK日志发送

    Java中多环境Logback配置与ELK日志发送   一.项目基于SpringBoot实现,引入SpringBoot相关库后,本文还要讲上传到ELK的Logstash,所以需要在pom.xml中加入 ...