`
coolerbaosi
  • 浏览: 729173 次
文章分类
社区版块
存档分类
最新评论

使用Hudson持续集成Android项目

 
阅读更多
Hudson是一款持续集成引擎,架构在Subversion等版本控制工具上,依靠构建工具对项目进行集成构建,并且可以根据用户需求提供相应的反馈,比如发邮件,总的来说是比较实用的。

这几天在老师的要求下使用了Hudson,在纯JAVA项目的情况下使用MAVEN配置起来还算简单,无奈项目的客户端是Android平台的,在纠结了N天后还是配置不成功,最后改用Ant, 整个过程还是比较简单,除了build.xml的编写~~

注:下面的讲述是在Hudson配置好的情况下实现的,换句话说你可以试试你的JAVA项目能否正确被Hudson持续集成

步骤:
1)首先按常理新建一个Android;
2)接着在该项目上右击,新建一个build.xml(名字可以随便取,这个在Hudson可以选择构件所使用的项目文件),然后将下面这段代码放入文件

1<?xmlversion="1.0"encoding="UTF-8"?>
2<!--步骤:
3第一.生成R.java
4第二.JAVAC编译JAVA文件
5第三.批处理生成classes.dex
6第四.aapt打包资源
7第五.apkbuilder包资源和类文件为APK文件
8第六.jarsinger对APK进行签名-->
9<!--此处的项目名需修改为你的项目名-->
10
11<projectname="SEOA_Client"basedir="."default="debug">
12
13<!--此处应用系统的环境变量-->
14
15<propertyenvironment="env"/>
16
17<!--SDKLocations-->
18
19<!--获取SDK的安装目录,注意在我的系统中环境变量的名称为ANDROID_SDK_HOME,你可以修改成你的环境变量名称-->
20<!-- 也可以直接指定路径,下面采用的就是这种方式 -->
21<propertyname="sdk2.2-folder"value="F:\sdk\android-sdk-windows"/>
22
23<!--如若你使用的android版本不一样,可以在此处修改-->
24<propertyname="sdk-folder"value="${sdk2.2-folder}/platforms/android-8"/>
25
26<propertyname="android.aidl"value="${sdk-folder}/framework.aidl"/>
27<propertyname="sdk-tools"value="${sdk-folder}/tools"/>
28<propertyname="android-tools"value="${sdk2.2-folder}/tools"/>
29
30
31<propertyname="verbose"value="false"/>
32
33<!--配置使用到的库,只要保证路径正确,不需修改-->
34
35<pathid="android.antlibs">
36<pathelementlocation="${env.ANDROID_SDK_HOME}/tools/lib/anttasks.jar"/>
37<pathelementlocation="${env.ANDROID_SDK_HOME}/tools/lib/sdklib.jar"/>
38<pathelementlocation="${env.ANDROID_SDK_HOME}/tools/lib/androidprefs.jar"/>
39</path>
40
41
42<!--step1.generateR.javabyaapt2.compilejavatoclassbyjavac3.generateclasses.dexbydx.bat-->
43<!--4.packageresourcesbyaapt5.packageresourceandclasses.dexbyapkbuilder.bat6.signapkbyjarsinger-->
44
45<!--配置在整个过程中使用到的Tools,不需修改-->
46<propertyname="aapt"value="${sdk-tools}/aapt.exe"/>
47<propertyname="dx"value="${sdk-tools}/dx.bat"/>
48<propertyname="apk-builder"value="${android-tools}/apkbuilder.bat"/>
49<propertyname="aidl"value="${sdk-tools}/aidl.exe"/>
50<propertyname="adb"value="${android-tools}/adb.exe"/>
51<propertyname="android-jar"value="${sdk-folder}/android.jar"/>
52<propertyname="jarsigner"value="${env.JAVA_HOME}/bin/jarsigner.exe"/>
53
54<!--Android项目使用到所有库,这个地方需修改-->
55<pathid="android.libraries.jars">
56<pathelementlocation="${android-jar}"/>
57<pathelementlocation="${basedir}/lib/commons-pool-1.5.4.jar"/>
58</path>
59
60
61<!--ApplicationPackageName,包名需修改-->
62<propertyname="application-package"value="com.android.ant"/>
63
64<!--以下都不需要修改-->
65<propertyname="useragent"value="byAndroidWeb"/>
66<propertyname="version"value="1.02"/>
67<!--Theintermediatesdirectory-->
68
69<!--Eclipseuses"bin"foritsownoutput,sowedothesame.-->
70<propertyname="outdir-bin"value="bin"/>
71<propertyname="outdir-gen"value="gen"/>
72<!--sourcedirectories-->
73<propertyname="resource-dir"value="res"/>
74<propertyname="asset-dir"value="assets"/>
75<propertyname="srcdir"value="src"/>
76<propertyname="srcdir-ospath"value="${basedir}/${srcdir}"/>
77<propertyname="external-libs"value="lib"/>
78<propertyname="external-libs-ospath"value="${basedir}/${external-libs}"/>
79
80<!--destdirectories-->
81<propertyname="des-resource-dir"value="${outdir-bin}/res"/>
82<propertyname="des-asset-dir"value="${outdir-bin}/assets"/>
83<propertyname="des-srcdir"value="${outdir-bin}/src"/>
84<propertyname="des-srcdir-ospath"value="${basedir}/${outdir-bin}/${srcdir}"/>
85<propertyname="des-external-libs"value="${outdir-bin}/libs"/>
86<propertyname="des-external-libs-ospath"value="${basedir}/${outdir-bin}/${external-libs}"/>
87
88<!--Outputdirectories-->
89<propertyname="outdir-classes"value="${outdir-bin}/src"/>
90<propertyname="outdir-obfuscate-classes"value="${outdir-bin}"/>
91<propertyname="outdir-obfuscate-classes-ospath"value="${basedir}/${outdir-obfuscate-classes}"/>
92
93<!--Intermediatefiles-->
94<propertyname="dex-file"value="classes.dex"/>
95<propertyname="intermediate-dex"value="${outdir-bin}/${dex-file}"/>
96<propertyname="intermediate-dex-ospath"value="${basedir}/${intermediate-dex}"/>
97
98<!--Thefinalpackagefiletogenerate-->
99<propertyname="resources-package"value="${outdir-bin}/${ant.project.name}"/>
100<propertyname="resources-package-ospath"value="${basedir}/${resources-package}"/>
101<propertyname="out-debug-package"value="${outdir-bin}/${ant.project.name}-debug.apk"/>
102<propertyname="out-debug-package-ospath"value="${basedir}/${out-debug-package}"/>
103<propertyname="out-unsigned-package"value="${outdir-bin}/${ant.project.name}-unsigned.apk"/>
104<propertyname="out-unsigned-package-ospath"value="${basedir}/${out-unsigned-package}"/>
105<propertyname="out-signed-package"value="${useragent}\${ant.project.name}.apk"/>
106<propertyname="out-signed-package-ospath"value="${basedir}\${out-signed-package}"/>
107
108
109<!--init-->
110<targetname="init">
111<echo>Creatingalloutputdirectories</echo>
112<deletedir="${outdir-bin}"/>
113<mkdirdir="${outdir-bin}"/>
114<mkdirdir="${outdir-classes}"/>
115</target>
116
117<!--copyoriginalstringsandmodifyuseragent-->
118<targetname="copy"depends="init">
119<echo>copyfilestooutputfolder</echo>
120</target>
121
122
123<!--GeneratetheR.javafileforthisproject'sresources.-->
124
125<targetname="resource-src"depends="copy">
126<echo>GeneratingR.java/Manifest.javafromtheresources</echo>
127<echo>${aapt}</echo>
128<execexecutable="${aapt}"failonerror="true">
129<argvalue="package"/>
130<argvalue="-m"/>
131<argvalue="-J"/>
132<argvalue="${outdir-gen}"/>
133<argvalue="-M"/>
134<argvalue="AndroidManifest.xml"/>
135<argvalue="-S"/>
136<argvalue="${resource-dir}"/>
137<argvalue="-I"/>
138
139<argvalue="${android-jar}"/>
140</exec>
141</target>
142
143
144<!--Generatejavaclassesfrom.aidlfiles.-->
145<targetname="aidl"depends="copy">
146<echo>CompilingaidlfilesintoJavaclasses</echo>
147<applyexecutable="${aidl}"failonerror="true">
148<argvalue="-p${android.aidl}"/>
149<argvalue="-I${srcdir}"/>
150<filesetdir="${srcdir}">
151<includename="**/*.aidl"/>
152</fileset>
153</apply>
154</target>
155
156<!--Compilethisproject's.javafilesinto.classfiles.-->
157<targetname="compile"depends="copy,resource-src,aidl">
158<javacencoding="ascii"target="1.6"debug="true"extdirs=""srcdir="."destdir="${outdir-classes}"bootclasspathref="android.libraries.jars">
159<classpath>
160<filesetdir="${external-libs}"includes="*.jar"/>
161</classpath>
162</javac>
163</target>
164
165<!--Convertthisproject's.classfilesinto.dexfiles.-->
166<targetname="dex"depends="compile">
167<echo>Convertingcompiledfilesandexternallibrariesinto${outdir}/${dex-file}</echo>
168<applyexecutable="${dx}"failonerror="true"parallel="false">
169<argvalue="--dex"/>
170
171<argvalue="--output=${intermediate-dex-ospath}"/>
172<argpath="${outdir-obfuscate-classes-ospath}"/>
173<filesetdir="${external-libs}"includes="*.jar"/>
174</apply>
175</target>
176
177<!--Puttheproject'sresourcesintotheoutputpackagefile.-->
178<targetname="package-res-and-assets">
179<echo>Packagingresourcesandassets</echo>
180<execexecutable="${aapt}"failonerror="true">
181<argvalue="package"/>
182<argvalue="-f"/>
183<argvalue="-M"/>
184<argvalue="AndroidManifest.xml"/>
185<argvalue="-S"/>
186<argvalue="${resource-dir}"/>
187<argvalue="-A"/>
188<argvalue="${asset-dir}"/>
189<argvalue="-I"/>
190<argvalue="${android-jar}"/>
191<argvalue="-F"/>
192<argvalue="${resources-package}"/>
193</exec>
194</target>
195
196<!--Sameaspackage-res-and-assets,butwithout"-A${asset-dir}"-->
197<targetname="package-res-no-assets">
198<echo>Packagingresources</echo>
199<execexecutable="${aapt}"failonerror="true">
200<argvalue="package"/>
201<argvalue="-f"/>
202<argvalue="-M"/>
203<argvalue="AndroidManifest.xml"/>
204<argvalue="-S"/>
205<argvalue="${resource-dir}"/>
206<!--Noassetsdirectory-->
207<argvalue="-I"/>
208<argvalue="${android-jar}"/>
209<argvalue="-F"/>
210<argvalue="${resources-package}"/>
211</exec>
212</target>
213
214<!--Invokethepropertargetdependingonwhetherornot
215anassetsdirectoryispresent.-->
216<!--TODO:findanicerwaytoincludethe"-A${asset-dir}"argument
217onlywhentheassetsdirexists.-->
218<targetname="package-res">
219<availablefile="${asset-dir}"type="dir"property="res-target"value="and-assets"/>
220<propertyname="res-target"value="no-assets"/>
221<antcalltarget="package-res-${res-target}"/>
222</target>
223
224<!--Packagetheapplicationandsignitwithadebugkey.
225Thisisthedefaulttargetwhenbuilding.Itisusedfordebug.-->
226<targetname="debug"depends="dex,package-res">
227<echo>Packaging${out-debug-package},andsigningitwithadebugkey</echo>
228<execexecutable="${apk-builder}"failonerror="false">
229<argvalue="${out-debug-package-ospath}"/>
230<argvalue="-z"/>
231<argvalue="${resources-package-ospath}"/>
232<argvalue="-f"/>
233<argvalue="${intermediate-dex-ospath}"/>
234<argvalue="-rf"/>
235<argvalue="${srcdir-ospath}"/>
236<argvalue="-rj"/>
237<argvalue="${external-libs-ospath}"/>
238</exec>
239</target>
240
241<!--Packagetheapplicationwithoutsigningit.
242Thisallowsfortheapplicationtobesignedlaterwithanofficialpublishingkey.-->
243<targetname="package"depends="dex,package-res">
244<echo>Packaging${out-unsigned-package}forrelease</echo>
245<execexecutable="${apk-builder}"failonerror="true">
246<argvalue="${out-unsigned-package-ospath}"/>
247<argvalue="-u"/>
248<argvalue="-z"/>
249<argvalue="${resources-package-ospath}"/>
250<argvalue="-f"/>
251<argvalue="${intermediate-dex-ospath}"/>
252<argvalue="-rf"/>
253<argvalue="${srcdir-ospath}"/>
254<argvalue="-rj"/>
255
256<argvalue="${external-libs-ospath}"/>
257</exec>
258<echo>Itwillneedtobesignedwithjarsignerbeforebeingpublished.</echo>
259</target>
260
261<targetname="jarsigner"depends="package">
262<echo>Packaging${out-unsigned-package}forrelease</echo>
263<execexecutable="${jarsigner}"failonerror="true">
264<argvalue="-verbose"/>
265<argvalue="-storepass"/>
266<argvalue="byread002"/>
267<argvalue="-keypass"/>
268<argvalue="byread002"/>
269<argvalue="-keystore"/>
270<argvalue="bbyread.keystore"/>
271<argvalue="-signedjar"/>
272<argvalue="${out-signed-package-ospath}"/>
273<argvalue="${out-unsigned-package-ospath}"/>
274<argvalue="byread"/>
275</exec>
276</target>
277
278<targetname="release"depends="jarsigner">
279<echo>releaseforrelease</echo>
280</target>
281
282<!--Installthepackageonthedefaultemulator-->
283<targetname="install"depends="debug">
284<echo>Installing${out-debug-package}ontodefaultemulator</echo>
285<execexecutable="${adb}"failonerror="true">
286<argvalue="install"/>
287<argvalue="${out-debug-package}"/>
288</exec>
289</target>
290
291<targetname="reinstall"depends="debug">
292<echo>Installing${out-debug-package}ontodefaultemulator</echo>
293<execexecutable="${adb}"failonerror="true">
294<argvalue="install"/>
295<argvalue="-r"/>
296
297<argvalue="${out-debug-package}"/>
298</exec>
299</target>
300
301<!--Uinstallthepackagefromthedefaultemulator-->
302<targetname="uninstall">
303<echo>Uninstalling${application-package}fromthedefaultemulator</echo>
304<execexecutable="${adb}"failonerror="true">
305<argvalue="uninstall"/>
306<argvalue="${application-package}"/>
307</exec>
308</target>
310</project>
代码比较长,里面有部分需要修改的地方,比如包的名字,比如安装在服务器上的SDK的路径等,大家可以按照文字描述慢慢修改,之后就可以将项目提交,在Hudson上建立一个自由风格的项目,选择使用Ant作为构建工具,选择build.xml作为构件文件,构建中很可能出现各种问题,大家可以根据Hudson的命令行输出对build.xml文件进行修改,具体做法目前我还不是很了解,例如:failonerror="true",我曾经把true改为false就跳过一个错误,大家尽量摸索一下吧

这个网上资料比较少,尤其是中文的,上面说的也就是我这几天摸索的一点小成果,肯定有很多说的不全甚至错误的地方,希望读者不吝赐教,有问题也欢迎回复~~
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics