文档章节

Jenkins中使用ant管理Android应用开发生命周期

m
 miscellanea
发布于 2013/11/19 12:15
字数 1288
阅读 3779
收藏 5

软件环境

OS:CentOS 6.0 64-bit

Android SDK:adt-bundle-linux-x86_64

Jenkins:1.529

Ant:1.8.2

配置管理

1.Jenkins中配置JDK,直接配置1.7+以上JDK。过程略。

2.把Android工程改造成具有Ant特性

(如果项目本身已经ant化了,略过此步。)

先从源码库,比如SVN检出源码,然后进行工作空间执行

# cd /myworkspace
# $ANDROID_HOME/sdk/tools/android update project -p my-android-app

再把生成的文件上传到SVN。

也可以从头开始生成一个全新的空白ant特性的android工程,

# $ANDROID_HOME/sdk/tools/android create project -n myandroidapp -t a
ndroid-19 -p my-android-app -k pragmatic.pkg -a Pragmatic

-n Project name.
-t android target id,必选
-p 工程文件夹目录位置,必选
-k 安卓包名称即AndroidManifest.xml中<manifest package=的名称,必选
-a 安卓Activity名称,AndroidManifest.xml中<activity android:name=的名称

不清楚参数用法使用# $ANDROID_HOME/sdk/tools/android create project命令行会告诉你用法

然后打开ADT,import -> Andorid下面的Existing Android Code Into Workspace。再然后Team -> Share Project到SVN服务器。

3.源码库配置

在Jenkins项目配置页面,找到源码管理栏,作如下设置


4.Jenkins中配置Ant

方式一,把ant作为一个Jenkins内置的工具使用。


新增一个ant安装

保存后,进行项目构建配置页面,如下

方式二,引用一个外部已有的ant安装。

jenkins系统设置ant栏中,

然后jenkins系统设置全局属性栏中

保存后,进行项目构建配置页面,Invoke Ant中,Ant Version下拉列表选择ant-1.8.2-external。


执行各项任务

利用andorid sdk中ant提供的build.xml脚本(位于%ANDROID_HOME%/sdk/tools/ant目录)可轻松完成各种日常任务

1.打包APK

直须在Jenkins项目配置页面,找到Invoke Ant栏,作如下设置

2.打包APK后同时对apk进行签名和zipalign优化

如果查看%ANDROID_HOME%/sdk/tools/ant/build.xml文件,会看到ant执行release操作的同时会根据local.properies和ant.properties中配置的属性,决定是否执行签名和zipalign。为些要在Invoke ant中如下设置


这样ant在打包时会自动根据密钥库、密码信息对生成的apk进行签名,而无需再手工输入密钥的密码。


3.打包APK,签名和zipalign优化后把APK装到与Jenkins主机相连的手机上。

在Jenkins构建Invoke Ant脚本后,增加一个Shell调用步骤,内容如下:

#!/bin/bash
adb uninstall com.aaa.pragmatic(.apk)
adb install /target/dir/apks/com.aaa.pragmatic.apk

前提是:(1)安装android usb driver  (2)手机与电脑相连  (3)电脑进程中没有tadb.exe、豌豆夹等运行。(4)如果不需要在设备上进行debug,可以更新AndroidManifest.xml文件,去掉android:debuggable。


Troubleshootings


1 Execute failed: java.io.IOException: Cannot run program "/android/sdk/build-tools/android-4.4/aapt": error=2, 没有那个文件或目录 
-code-gen:
[mergemanifest] Merging AndroidManifest files into one.
[mergemanifest] Manifest merger disabled. Using project manifest only.
     [echo] Handling aidl files...
     [aidl] No AIDL files to compile.
     [echo] ----------
     [echo] Handling RenderScript files...
     [echo] ----------
     [echo] Handling Resources...
     [aapt] Generating resource IDs...


BUILD FAILED
/android/sdk/tools/ant/build.xml:653: The following error occurred while executing this line:
/android/sdk/tools/ant/build.xml:698: Execute failed: java.io.IOException: Cannot run program "/android/sdk/build-tools/android-4.4/aapt": error=2, 没有那个文件或目录
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
at java.lang.Runtime.exec(Runtime.java:615)
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:862)
at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:481)
at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:495)
at org.apache.tools.ant.taskdefs.ExecTask.runExecute(ExecTask.java:631)
at org.apache.tools.ant.taskdefs.ExecTask.runExec(ExecTask.java:672)
at org.apache.tools.ant.taskdefs.ExecTask.execute(ExecTask.java:498)
at com.android.ant.AaptExecTask.execute(AaptExecTask.java:699)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
at com.android.ant.IfElseTask.execute(IfElseTask.java:120)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:390)
at org.apache.tools.ant.Target.performTasks(Target.java:411)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
at org.apache.tools.ant.Main.runBuild(Main.java:809)
at org.apache.tools.ant.Main.startAnt(Main.java:217)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: java.io.IOException: error=2, 没有那个文件或目录
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:135)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021)
... 46 more


原因:在64位Linux下打包成APK时缺少x86下C++语言库。

解决:
# yum install -y compat-libstdc++-296.i686
# yum install -y compat-libstdc++-33.i686


2.   [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
-code-gen:
[mergemanifest] Merging AndroidManifest files into one.
[mergemanifest] Manifest merger disabled. Using project manifest only.
     [echo] Handling aidl files...
     [aidl] No AIDL files to compile.
     [echo] ----------
     [echo] Handling RenderScript files...
     [echo] ----------
     [echo] Handling Resources...
     [aapt] Generating resource IDs...
     [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

解决:
# yum install -y zlib


3.  [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
-code-gen:
[mergemanifest] Merging AndroidManifest files into one.
[mergemanifest] Manifest merger disabled. Using project manifest only.
     [echo] Handling aidl files...
     [aidl] No AIDL files to compile.
     [echo] ----------
     [echo] Handling RenderScript files...
     [echo] ----------
     [echo] Handling Resources...
     [aapt] Generating resource IDs...
     [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory


原因:在64位Linux下打包成APK时缺少x86下C++语言库。

解决:
# yum install -y libstdc++.so.6


参考文献

https://wiki.jenkins-ci.org/display/JENKINS/Building+an+Android+app+and+test+project

http://jenkins-ci.org/content/getting-started-building-android-apps-hudson


© 著作权归作者所有

共有 人打赏支持
m
粉丝 6
博文 86
码字总数 22525
作品 0
海淀
私信 提问
Linux,maven,redis,android,java,yum,ant部署相关命令

(linux系统查看) getconf LONG_BIT 查看系统位数 (java环境变量) export JAVAHOME=/home/gcweb/usr/java/jdk1.7.045 export PATH=$JAVA_HOME/bin:$PATH 如果需要修改到系统变量中: cd ~ vi .......

shengguimin
2018/06/26
0
0
Android Gradle(一)为什么现在要用Gradle?

前言 又要开启一个新系列了,这个系列我们来学习Gradle,它是一个基于JVM的新一代构建工具,关于Gradle完全可以写一本书,这个系列会针对Android开发来对Gradle的知识进行精简讲解。Gradle目...

刘望舒
2018/08/21
0
0
用jenkins搭建android自动打包环境

这里假设你已经搭建了jenkins的环境。否则,请阅读我的另一篇文章: http://my.oschina.net/u/930967/blog/298980 其实那个文章里面有用的就两句话的事儿,还是直接写在这里吧 jenkins是一个...

赵占涛
2014/08/07
0
14
基于Jenkins + Tomcat 的安卓客户端可持续化构建及发布下载(loltube.cn)

一. Jenkins 可持续化构建环境请参考 文章 http://my.oschina.net/long0419/blog/183299 二. 基于搭好可持续构建环境完成基础上 ,使用Ant 来编写安卓持续化构建环境 (未使用gradle 原理一样...

long0419
2015/04/02
0
0
使用Ant 实现批量打包Android应用

由于公司运维需要以及应用中需要加上应用推广的统计,往往要对应二三十个渠道,按照正常方法一个一个的去生成不同渠道包的应用,不仅浪费了时间,而且大大降低了效率. 上一篇讲到使用Ant进行...

Easince
2012/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库技术-Mysql主从复制与数据备份

数据库技术-Mysql 主从复制的原理: MySQL中数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”...

须臾之余
昨天
12
0
Git远程仓库——GitHub的使用(一)

Git远程仓库——GitHub的使用(一) 一 、 Git远程仓库 由于你的本地仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要一下设置: 步骤一、 创建SSH key 在用户主目录下,看看有没有.ss...

lwenhao
昨天
2
0
SpringBoot 整合

springBoot 整合模板引擎 SpringBoot 整合Mybatis SpringBoot 整合redis SpringBoot 整合定时任务 SpringBoot 整合拦截器...

细节探索者
昨天
0
0
第二个JAVA应用

第二个JAVA应用 方法一:配置文件: # cd /usr/local/tomcat/conf/# vim server.xml</Host> <Host name="www.wangzb.cc" appBase="/data/wwwroot/www.wangzb.cc" //引用所......

wzb88
昨天
0
0
2019年阿里Java面试必问:JVM与性能优化+Redis+设计模式+分布式

前言 一年之计在于春 金三银四已经要到来,2019的新的开始,作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是对...

火力全開
昨天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部