Android脚本打包
最近项目中需要添加应用渠道,我使用的是友盟统计,对于不同渠道需要编译不同版本,对于开发者说编译一次,手动操作还是可以接受的,但是项目发布版本频率较高,而且渠道很多,这就是一个体力活,而且手动打包还比较容易出错,所以就想到了用脚本打包。
利用脚本打包的原理就是把项目中的配置文件给覆盖,然后再次编译的时候,就是你要的apk了。
对于eclipse中项目,可以使用ant来编译,android的sdk中自带一个ant的build.xml文件,所以直接使用就可以了,在使用之前需要配置一下。
首先定义一个ant的配置文件,放在eclipse的项目目录中。
ant.properites
out.path=./build/out
out.absolute.dir=./build/compile
out.config.path=./build_config # sdk的目录,注意是“/”不是“\”
sdk.dir=E:/tool/android-sdk_r22.2.1-windows/android-sdk-windows # 项目的package
application.package=com.example.test
# 项目名称
ant.project.name=test
java.encoding=utf-8 # 签名的信息
key.store=***
key.store.password=***
key.alias=***
key.alias.password=*** # 应用的版本,和渠道
app_version=1.0
channel=wandoujia
上面的是ant的配置文件,下面是项目中使用build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="deploy"> <property file="ant.properties" />
<loadproperties srcFile="project.properties" /> <import file="${sdk.dir}/tools/ant/build.xml" />
<tstamp prefix="time">
<format property="time" pattern="yyyyMMddHHmmss" />
</tstamp>
<target name="deploy"> <antcall target="release" /> <copy tofile="${out.path}/${ant.project.name}_${channel}_${time.time}.apk">
<fileset dir="${out.absolute.dir}/" includes="${ant.project.name}-release.apk" />
</copy> <delete includeEmptyDirs="true">
<fileset dir="${out.absolute.dir}" includes="**/*" />
</delete>
</target>
</project>
上面的xml定义大概意思就是,找到sdk中{sdk}/tools/ant/build.xml文件,然后编译,最后签名,然后拷贝到目标目录下面,同时重命名apk,apk还有编译时候的时间戳。
只要运行deploy的任务就可以完成编译。
上面的配置文件中的渠道只有豌豆荚一个,那么怎么使用多个渠道呢?开发人员很容易就想到了,我们可以顶一个渠道数组,然后遍历数组,分别编译打包。虽然耗时比较长但是不容易出错,相对于手动编译还是比较好的。
在实际项目中我问了下年长的同事,说ant中可以使用for循环不,但是需要添加额外的jar包(ant-contrib-1.0b3.jar)来支持,我就觉的比较麻烦,然后自己就写了一个python的脚步来自动替换ant的配置文件,这样我又多了几个文件。如果想了解ant的for标签使用可以百度一下,这里不多做介绍。其实我也不懂,
python_build.cfg
#market_channels
default
hiapk
baidu
360
tencent
nduo
91
wandoujia
上面配置文件里面是我要打包的渠道,每行一个渠道,#表示注释。
下面是python的脚步build.py。
configname = "python_build.cfg";
antconfigname = "ant.properties";
channels = []; def loadChannels():
global channels;
configfile = file(configname);
while True:
line = configfile.readline();
if len(line) == 0:
break;
line = line.strip();
if line.startswith('#'):
pass;
else:
channels.append(line); configfile.close(); def replaceChannel(channel):
input = open(antconfigname);
lines = input.readlines();
input.close(); output = open(antconfigname,"w");
for line in lines:
if not line:
break;
if line.startswith('channel='):
temp = 'channel='+channel;
output.write(temp);
else:
output.write(line); output.close(); #==============main begin =========================
import os; loadChannels(); for channel in channels:
replaceChannel(channel);
os.system("ant");
print ('channel '+channel+' is build success......');
python是一个比较流行的脚步,入手还是比较简单的,我也只是周末的时候,看了几个小时,敲了几次代码就写了上面的脚本,当然可能还有不足的地方,希望有大神看到不要喷我,我这边使用的是python2.7,使用前需要安装python才行。
上面分别定义了2个函数,=======下面的就是开始运行脚本,python里面是没有main的概念,同时还不支持{},百度来的,好像是发明这个脚本的人,希望强制使用缩进来控制代码块,对一个习惯了用ide来写代码的的人还是比较痛苦滴,。不过我再网上找到了一个比较好的python的ide,叫UliPad。有兴趣的童鞋可以去使用下。
首先是替换渠道名称,当首先需要读取配置文件,使用的是python中文件模块,每次读取一行,如果开始时“#”则认为是注释,不使用,否则加入到一个数组里面,最后遍历数组,每次执行的时候,都替换ant里面的channel一行,然后调用cmd命了,来执行ant。最后完成了渠道打包的功能。
使用cmd,进入到eclipse的项目目录下面,执行python build.py就可以了。
小弟也是开发android不久,写的很啰嗦,望各位看官见谅。
下面是一些截图。
Android脚本打包的更多相关文章
- 更便捷的Android多渠道打包方式
本文先回顾了以往流行的多渠道打包方式,随后引入的mcxiaoke的packer-ng-plugin项目,介绍该项目在实际应用(配合友盟统计)中如何解决更方便的Android多渠道打包问题 多渠道打包方 ...
- 【转】android Apk打包过程概述_android是如何打包apk的
最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程. 流程概述: 1.打包资源文件,生成 ...
- android Apk打包过程概述_android是如何打包apk的
流程概述:1.打包资源文件,生成R.java文件2.处理aidl文件,生成相应java 文件3.编译工程源代码,生成相应class 文件4.转换所有class文件,生成classes.dex文件5.打 ...
- Android tips(八)-->Android Studio打包apk,aar,jar包
文本我们将讲解android studio打包apk,aar,jar包的相关知识.apk包就是android系统的安装包,这里没什么好说的,aar包是android中独有的类库包,而jar包是java ...
- Ant自动化打多渠道包,Android批量打包提速
Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自动编译打包了. ...
- 使用Jenkins进行Android自动打包,自定义版本号等信息【转】
之前App在提交测试和最终部署的过程中App打包一直是由开发人员来完成的,由于项目比较大, 再加上Android打包本身就比较慢,所以每次打包还是很耗时的.并且按照严格的研发流程来讲,开发人员应该只负 ...
- [原] Android自动打包之命令行打包
Android自动打包流程详细图: 总结为以下几个步骤: 1. 生成R文件 2. Java代码编译成class文件 3. class文件生成dex文件 4. 打包资源 5. 生成apk 6. 创建密匙 ...
- Android Studio打包apk,aar,jar包
转载请标明出处:一片枫叶的专栏 文本我们将讲解android studio打包apk,aar,jar包的相关知识.apk包就是android系统的安装包,这里没什么好说的,aar包是android中独 ...
- eclipse 和 android studio 打包签名apk问题
首先,我使用eclipse打包了一个签名apk 然后,我使用同一个签名文件在android studio 打包同一个项目 接下来,首先安装eclipse 打包的apk,然后安装android stud ...
随机推荐
- 最多有k个不同字符的最长子字符串 · Longest Substring with at Most k Distinct Characters(没提交)
[抄题]: 给定一个字符串,找到最多有k个不同字符的最长子字符串.eg:eceba, k = 3, return eceb [暴力解法]: 时间分析: 空间分析: [思维问题]: 怎么想到两根指针的: ...
- Visual Studio2017 设置了vcpkg之后,编译其他程序出问题
博客参考:https://github.com/nodejs/node/issues/23909 错误如下 LNK2005 _SSL_CTX_check_private_key already def ...
- 发现ramnit样本一枚
https://files.cnblogs.com/files/yfish/DesktopLayer.rar
- SNMP++ 编译记录
/************************************************************** 技术博客 http://www.cnblogs.com/itdef/ ...
- 一起做RGB-D SLAM(8) (关于调试与补充内容)
“一起做”系列完结后,我收到不少同学给我的反馈.他们提了一些在程序编译/运行过程中的问题.我把它们汇总起来,组成了这个“补充篇”.你也可以看成是一个Q&A. Q: OpenCV的版本?A: 我 ...
- 14 Finding a Shared Motif
Problem A common substring of a collection of strings is a substring of every member of the collecti ...
- UVa 1614 Hell on the Markets (贪心+推理)
题意:给定一个长度为 n 的序列,满足 1 <= ai <= i,要求确实每一个的符号,使得它们和为0. 析:首先这一个贪心的题目,再首先不是我想出来的,是我猜的,但并不知道为什么,然后在 ...
- pyhon 去除列表中重复元素
Python set() 函数 描述 set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. 语法 set 语法: class set([iterabl ...
- eclipse find 两位数
查找两位数
- 20169202 2016-2017-2《Windows攻击》
Windows攻击 实验要求:使用Metaspoit攻击MS08-067,提交正确得到远程Shell的截图,加上自己的学号水印 (1):MS08-067远程溢出漏洞描述 MS08-067漏洞的全称为& ...