• 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不久,写的很啰嗦,望各位看官见谅。

    下面是一些截图。








  • 相关阅读:
    redmine 安装
    wxformbuilder 如何生成python 代码
    Postman 提示{"msg":"JSON parse error: Unexpected character (' ' (code 160))
    地下矿业务介绍
    第一次线上培训思想感悟
    Navicat 数据库如何再次打开恢复上次的页面
    wxFormBuilder 代码运行报错,尝试删除报错代码部分语句
    MongoDB分片集群部署
    使用XShell结合跳板机直接访问内网服务器文件及执行命令
    Ubuntu Server 21.10设置静态IP
  • 原文地址:https://www.cnblogs.com/liushuibufu/p/4140920.html
Copyright © 2020-2023  润新知