文档章节

基于Jenkins + Tomcat 的安卓客户端可持续化构建及发布下载(loltube.cn)

long0419
 long0419
发布于 2015/04/02 15:02
字数 1728
阅读 257
收藏 11

一. Jenkins 可持续化构建环境请参考 文章 http://my.oschina.net/long0419/blog/183299

二. 基于搭好可持续构建环境完成基础上 ,使用Ant 来编写安卓持续化构建环境 (未使用gradle 原理一样)

1、首先要去官网下载ANT代码。

ANT官网下载地址

2、下载ANT循环打包JAR包。

ANT循环JAR包下载地址

网盘下载地址

3、解压得到其中的ant-contrib-1.0b3.jar文件待用。

做完以上3步,ANT多渠道打包所需要的软件就准备完毕了,接下来就是环境配置了(略去)。

4. 打包过程 总共需要编辑4个文件,分别为build.xml、local.properties、customrules.xml、ant.properties. 同时准备好自己的签名文件:androidkey.keystore。

1、编辑local.properties文件内容,主要是配置SDK路径及项目路径

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
# location of the SDK. This is only used by Ant
# For customization when using a Version Control System, please read the
# header note.
#SDK的路径地址
sdk.dir=E:\\Android\\android-studio\\sdk  
#项目路径地址
project.dir=F:\\Android\\sourceCode\\Test

2、编辑ant.properties,主要是配置ANT打包的数据

#项目包名
application.package=com.ecloud.test  
#项目名称
ant.project.name=test  
#项目编码,这里需要注意自己工程的编码格式,需要保证编码格式一致(可不使用)
#java.encoding=utf-8   
#编译中间文件生成目录
out.absolute.dir=F:/Test/compile  
#最终APK生成文件目录
gos.path=F:/Test/test-code1-20140523  
#签名文件全路径
key.store=F:/Test/Test/android_key.keystore 
#签名文件密码
key.store.password=111111  
#别名,这里要注意如果你签名文件的别名为中文,需要和我这个一样转成16进制,不然签名的时候会报错,转码可以用【UltraEdit工具】(自行百度下载)来做。
key.alias=\u5BB9\u6613\u901B  
#别名密码
key.alias.password=111111  
#软件版本号
app_version=1.0.0
#需要打包的渠道名,注意‘,’分格
market_channels=Gfan,3G,360,AndMarket,AnZi


3、编辑custom_rules.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules" >
    <taskdef resource="net/sf/antcontrib/antcontrib.properties" >
        <classpath>
        <!--注意这里要和你拷贝的那个JAR文件相同-->
            <pathelement location="lib/ant-contrib-1.0b3.jar" />
        </classpath>
    </taskdef>
    <target name="deploy" >
        <foreach
            delimiter=","
            list="${market_channels}"
            param="channel"
            target="modify_manifest" >
        </foreach>
    </target>
    <target name="modify_manifest" >
       <replaceregexp flags="g" byline="false">  
       <regexp pattern="android:value=&quot;(.*)&quot; android:name=&quot;UMENG_CHANNEL&quot;" />  
         <substitution expression="android:value=&quot;{channel}&quot; android:name=&quot;UMENG_CHANNEL&quot;" />  
           <fileset
                dir=""
                includes="AndroidManifest.xml" />
        </replaceregexp>
        <property
            name="out.final.file"
            location="${apk.dir}/${ant.project.name}_${channel}.apk" />
        <antcall target="clean" />
        <antcall target="debug" />
    </target>
</project>


4、编辑最终的build.xml文件,这个是才是循环打包的重点

<?xml version="1.0" encoding="UTF-8"?> <!-- 项目名称test,可用全局替换为当前项目名称 -->
    <project
        name="test"
        default="deploy" > <!-- The local.properties file is created and updated by the 'android' tool.
         It contains the path to the SDK. It should *NOT* be checked into
         Version Control Systems. -->
    <property file="local.properties" /> <!-- The ant.properties file can be created by you. It is only edited by the
         'android' tool to add properties to it.
         This is the place to change some Ant specific build properties.
         Here are some properties you may want to change/update:
         source.dir
             The name of the source directory. Default is 'src'.
         out.dir
             The name of the output directory. Default is 'bin'.
         For other overridable properties, look at the beginning of the rules
         files in the SDK, at tools/ant/build.xml
         Properties related to the SDK location or the project target should
         be updated using the 'android' tool with the 'update' action.
         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems. -->
    <property file="ant.properties" />
    <property
        name="manifest.file"
        value="AndroidManifest.xml" >
    </property>
    <property
        name="bin.dir"
        value="bin" >
    </property>
    <property
        name="absolute-out"
        value="${project.dir}/${bin.dir}" >
    </property>
    <property
        name="absolute-file-manifest-out"
        value="${absolute-out}/${manifest.file}" >
    </property>
    <property
        name="absolute-file-manifest-src"
        value="${project.dir}/${manifest.file}" >
    </property> <!-- The project.properties file is created and updated by the 'android'
         tool, as well as ADT.
         This contains project specific properties such as project target, and library
         dependencies. Lower level build properties are stored in ant.properties
         (or in .classpath for Eclipse projects).
         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems. -->
    <loadproperties srcFile="project.properties" />
    <fail
        message="sdk.dir is missing. Make sure to generate local.properties using &apos;android update project&apos; or to inject it through an env var"
        unless="sdk.dir" /> <!-- extension targets. Uncomment the ones where you want to do custom work
     in between standard targets -->
    <!-- <target name="-pre-build">
    </target>
    <target name="-pre-compile">
    </target>
   
    <target name="-post-compile">
    </target> -->
    <!-- Import the actual build file.
         To customize existing targets, there are two options:
         - Customize only one target:
             - copy/paste the target into this file, *before* the
               <import> task.
             - customize it to your needs.
         - Customize the whole content of build.xml
             - copy/paste the content of the rules files (minus the top node)
               into this file, replacing the <import> task.
             - customize to your needs.
         ***********************
         ****** IMPORTANT ******
         ***********************
         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
         in order to avoid having your file be overridden by tools such as "android update project" -->
    <!-- version-tag: 1 -->
    <taskdef resource="net/sf/antcontrib/antcontrib.properties" >
<!---->
######注意这里的JAR包路径,要修改成自己的
        <classpath>
            <pathelement location="D:/Ant/lib/ant-contrib-1.0b3.jar" />
        </classpath>
    </taskdef>
    <import file="${sdk.dir}/tools/ant/build.xml" />
    <target name="deploy" >
        <foreach
            delimiter=","
            list="${market_channels}"
            param="channel"
            target="modify_manifest" >
        </foreach>
    </target>   
<!-- -->
######这里就是修改渠道号的代码,我的渠道值设置的是SETTING_UMENG_CHANNEL_CHANNELID_VALUES你可以替换成你自己的
       <target name="modify_manifest" > <!-- <copy file="${absolute-file-manifest-src}" tofile="${absolute-file-manifest-out}" overwrite="true"/>
        <replace file="${absolute-file-manifest-out}" token="SETTING_UMENG_CHANNEL_CHANNELID_VALUES" value="${channel}" encoding="UTF8"/> -->
        
        <replaceregexp
            encoding="utf-8"
            file="AndroidManifest.xml"
            match="SETTING_UMENG_CHANNEL_CHANNELID_VALUES"
            replace="${channel}" /> <!-- <replaceregexp
            byline="false"
            flags="g" >
            <regexp pattern="android:name="UMENG_CHANNEL" android:value="(.*)" />
            <substitution expression="android:name="UMENG_CHANNEL" android:value="${channel}" />
           
            <fileset
                dir=""
                includes="AndroidManifest.xml" />
                        
        </replaceregexp> -->
        <!-- <property  name="out.release.file" value="${out.absolute.dir}/${channel}.apk"/> -->
        <antcall target="release" />
        <copy tofile="${gos.path}/test_${channel}.apk" >
            <fileset
                dir="${out.absolute.dir}/"
                includes="test-release.apk" />
        </copy>
        <delete includeEmptyDirs="true" >
            <fileset
                dir="${out.absolute.dir}"
                includes="**/*" />
        </delete>  
<!---->
######这里要将替换之后的渠道号值改成默认的值SETTING_UMENG_CHANNEL_CHANNELID_VALUES,不然下一个打包时将不会替换渠道号的值
        <replaceregexp
            encoding="utf-8"
            file="AndroidManifest.xml"
            match="${channel}"
            replace="SETTING_UMENG_CHANNEL_CHANNELID_VALUES" />
        <echo message="===========================" />
    </target>
   </project>


5、把以上4个文件拷贝到项目根目录下,目录结构如下

test--
    --src
    --res
    --libs
    --local.properties
    --custom_rules.xml
    --ant.properties
    --build.xml


6、打开CMD,然后CD到项目根路径下,运行ant deploy即可。注意在运行之前要注意先clean一下项目,不然可能会报错误,切记!!!!

BUILD FAILED
F:\Test\Test\build.xml:113: The following error occurred while executing this line:
F:\Test\Test\build.xml:139: The following error occurred while executing this line:

7、如果你看到BUILD SUCCESS,那么恭喜你,多渠道打包编译成功了,去输出目录查看一下APK文件吧!

错误说明:

a.提示如下

Android build failing with build.xml:479: SDK does not have any Build Tools installed

表示当前sdk 版本过低只需要在控制台中执行下命令行后更新安卓sdk版本即可

android update sdk -u

三 . 当已经构建完成后返回Jenkins 中进行后续配置 截图如下:








由于还使用了每天23点定时构建还需做如下配置



然后执行完把构建后的apk全部移动到web容器中 使用shell 脚本执行

cp ./tmp/diandi100-*.apk /home/test/apache-tomcat-7.0.52/webapps/filedownload/files
rm -rf ./tmp/*.*

三 .在web 容器中发布 然后提供下载

由于可以让在tomcat 中执行下载操作 首先可以在eclipse 中随意建立一个web 工程然后将tomcat conf 目录中的web.xml中的list 熟悉修改为true 即可 然后访问web工程目录如下显示 :

    

后续只需要根据需求下载对面版本安装测试

*-release.apk :签名优化版本

*-release-unaligned.apk :签名版本

*-release-unsigned.apk :未签名版本


© 著作权归作者所有

long0419
粉丝 3
博文 11
码字总数 7319
作品 0
武汉
私信 提问
使用Jenkins实现自动化打包

使用Jenkins实现自动化打包 Jenkins个开源的持续集成工具,不仅可以用来进行Android打包,也可以用来进行iOS打包、NodeJs打包、Java服务打包等。 The leading open source automation serve...

孤狼悲月
05/28
28
0
Fastlane 2.13.0 发布,iOS 和安卓自动构建工具

Fastlane 2.13.0 发布了。Fastlane 是一个针对于 iOS 和 Android(后来才支持的)全方位自动化流程的工具。利用目前支持的工具可以做所有包含自动化和可持续化构建的每个环节,比如单元测试、...

王练
2017/02/03
364
0
Jenkins +Gradle实现Android自动化构建(学习笔记三十二)

https://blog.csdn.net/mabeijianxi/article/details/52680283 http://www.liuling123.com/2016/10/jenkins-gradle-auto-build.html Jenkins简介 Jenkins是一个开源软件项目,旨在提供一个开......

sktj
2018/05/11
0
0
Jenkins+Gradle实现android开发持续集成、打包

Jenkins简介 Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提...

菠萝
2013/08/28
29.1K
14
React Native 【学习总结】-【Jenkins集成】

简述 Jenkins是一个持续集成工具,它本身有很丰富的插件提供使用,方便持续集成,为开发省时省力,下面是项目中对新的RN项目做的持续集成例子,通过该例子学会如何使用jenkins。 Jenkins安装...

Pape
2018/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

怎样在磁盘上查找MySQL表的大小?这里有答案

导读 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎...

问题终结者
13分钟前
3
0
jQuery load() 方法实现加载远程数据

jQuery load() 方法是简单但强大的 AJAX 方法。load() 方法从服务器加载数据,并把返回的数据放入被选元素中。 语法: $(selector).load(URL,data,callback);必需的 URL 参数规定您希望加载的...

前端老手
14分钟前
2
0
Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存-2

问题 上一篇Spring Boot Cache + redis 设置有效时间和自动刷新缓存,时间支持在配置文件中配置,说了一种时间方式,直接扩展注解的Value值,如: @Override@Cacheable(value = "people#${s...

xiaolyuh
23分钟前
7
0
怎样在磁盘上查找MySQL表的大小?这里有答案

我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应...

Linux就该这么学
47分钟前
5
0
Redis

一、Redis支持的几种数据类型:字符串、List、SET、HASH、ZSET 二、Redis的缓存技术主要是为了降低关系数据库的负载并减少网站成本 三、在Redis里面,被MULTI命令和EXEC命令包围的所有命令会...

BobwithB
50分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部