使用Hudson持續集成Android項目

          Hudson是一款持續集成引擎,架構在Subversion等版本控制工具上,依靠構建工具對項目進行集成構建,并且可以根據用戶需求提供相應的反饋,比如發郵件,總的來說是比較實用的。

          這幾天在老師的要求下使用了Hudson,在純JAVA項目的情況下使用MAVEN配置起來還算簡單,無奈項目的客戶端是Android平臺的,在糾結了N天后還是配置不成功,最后改用Ant, 整個過程還是比較簡單,除了build.xml的編寫~~

          注:下面的講述是在Hudson配置好的情況下實現的,換句話說你可以試試你的JAVA項目能否正確被Hudson持續集成

          步驟:
          1)首先按常理新建一個Android;
          2)接著在該項目上右擊,新建一個build.xml(名字可以隨便取,這個在Hudson可以選擇構件所使用的項目文件),然后將下面這段代碼放入文件
            1 <?xml version="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 <project name="SEOA_Client" basedir="." default="debug">
           12  
           13  <!-- 此處應用系統的環境變量 -->
           14  
           15  <property environment="env" />
           16  
           17  <!-- SDK Locations -->
           18  
           19  <!-- 獲取SDK的安裝目錄,注意在我的系統中環境變量的名稱為ANDROID_SDK_HOME,你可以修改成你的環境變量名稱 -->
           20  <!-- 也可以直接指定路徑,下面采用的就是這種方式 -->
           21  <property name="sdk2.2-folder" value="F:\sdk\android-sdk-windows" />
           22  
           23  <!--如若你使用的android版本不一樣,可以在此處修改-->
           24  <property name="sdk-folder" value="${sdk2.2-folder}/platforms/android-8" />
           25  
           26  <property name="android.aidl" value="${sdk-folder}/framework.aidl" />
           27  <property name="sdk-tools" value="${sdk-folder}/tools" />
           28  <property name="android-tools" value="${sdk2.2-folder}/tools" />
           29  
           30  
           31  <property name="verbose" value="false" />
           32  
           33  <!-- 配置使用到的庫,只要保證路徑正確,不需修改-->
           34  
           35  <path id="android.antlibs">
           36         <pathelement location="${env.ANDROID_SDK_HOME}/tools/lib/anttasks.jar"/>
           37          <pathelement location="${env.ANDROID_SDK_HOME}/tools/lib/sdklib.jar"/>
           38          <pathelement location="${env.ANDROID_SDK_HOME}/tools/lib/androidprefs.jar"/>
           39      </path>
           40      
           41 
           42  <!-- step 1.generate R.java by aapt  2.compile java to class by javac  3.generate classes.dex by dx.bat  -->
           43  <!-- 4.package resources by aapt 5. package resource and classes.dex by apkbuilder.bat 6.sign apk by jarsinger -->
           44  
           45  <!-- 配置在整個過程中使用到的Tools,不需修改 -->
           46  <property name="aapt" value="${sdk-tools}/aapt.exe" />
           47  <property name="dx" value="${sdk-tools}/dx.bat" />
           48  <property name="apk-builder" value="${android-tools}/apkbuilder.bat" />
           49  <property name="aidl" value="${sdk-tools}/aidl.exe" />
           50  <property name="adb" value="${android-tools}/adb.exe" />
           51  <property name="android-jar" value="${sdk-folder}/android.jar" />
           52  <property name="jarsigner" value="${env.JAVA_HOME}/bin/jarsigner.exe" />
           53  
           54  <!-- Android項目使用到所有庫,這個地方需修改-->
           55      <path id="android.libraries.jars">
           56         <pathelement location="${android-jar}"/>
           57         <pathelement location="${basedir}/lib/commons-pool-1.5.4.jar"/>
           58      </path>
           59  
           60 
           61  <!-- Application Package Name,包名需修改 -->
           62  <property name="application-package" value="com.android.ant" />
           63  
           64  <!-- 以下都不需要修改 -->
           65  <property name="useragent" value="byAndroidWeb" />
           66  <property name="version" value="1.02" />
           67  <!-- The intermediates directory -->
           68  
           69  <!-- Eclipse uses "bin" for its own output, so we do the same. -->
           70  <property name="outdir-bin" value="bin" />
           71  <property name="outdir-gen" value="gen" />
           72  <!-- source directories -->
           73  <property name="resource-dir" value="res" />
           74  <property name="asset-dir" value="assets" />
           75  <property name="srcdir" value="src" />
           76  <property name="srcdir-ospath" value="${basedir}/${srcdir}" />
           77  <property name="external-libs" value="lib" />
           78  <property name="external-libs-ospath" value="${basedir}/${external-libs}" />
           79 
           80  <!-- dest directories -->
           81  <property name="des-resource-dir" value="${outdir-bin}/res" />
           82  <property name="des-asset-dir" value="${outdir-bin}/assets" />
           83  <property name="des-srcdir" value="${outdir-bin}/src" />
           84  <property name="des-srcdir-ospath" value="${basedir}/${outdir-bin}/${srcdir}" />
           85  <property name="des-external-libs" value="${outdir-bin}/libs" />
           86  <property name="des-external-libs-ospath" value="${basedir}/${outdir-bin}/${external-libs}" />
           87 
           88  <!-- Output directories -->
           89  <property name="outdir-classes" value="${outdir-bin}/src" />
           90  <property name="outdir-obfuscate-classes" value="${outdir-bin}" />
           91  <property name="outdir-obfuscate-classes-ospath" value="${basedir}/${outdir-obfuscate-classes}" />
           92 
           93  <!-- Intermediate files -->
           94  <property name="dex-file" value="classes.dex" />
           95  <property name="intermediate-dex" value="${outdir-bin}/${dex-file}" /> 
           96  <property name="intermediate-dex-ospath" value="${basedir}/${intermediate-dex}" />
           97  
           98  <!-- The final package file to generate -->
           99  <property name="resources-package" value="${outdir-bin}/${ant.project.name}" />
          100  <property name="resources-package-ospath" value="${basedir}/${resources-package}" />
          101  <property name="out-debug-package" value="${outdir-bin}/${ant.project.name}-debug.apk" />
          102  <property name="out-debug-package-ospath" value="${basedir}/${out-debug-package}" />
          103  <property name="out-unsigned-package" value="${outdir-bin}/${ant.project.name}-unsigned.apk" />
          104  <property name="out-unsigned-package-ospath" value="${basedir}/${out-unsigned-package}" />
          105  <property name="out-signed-package" value="${useragent}\${ant.project.name}.apk" />
          106  <property name="out-signed-package-ospath" value="${basedir}\${out-signed-package}" />
          107 
          108 
          109  <!-- init -->
          110  <target name="init">
          111   <echo>Creating all output directories </echo>
          112   <delete dir="${outdir-bin}" />
          113   <mkdir dir="${outdir-bin}" />
          114   <mkdir dir="${outdir-classes}" />
          115  </target>
          116 
          117  <!-- copy original strings and modify useragent -->
          118  <target name="copy" depends="init">   
          119   <echo>copy files to output folder</echo>     
          120  </target>  
          121 
          122 
          123  <!-- Generate the R.java file for this project's resources. -->
          124  
          125  <target name="resource-src" depends="copy">
          126   <echo>Generating R.java / Manifest.java from the resources</echo>
          127   <echo>${aapt}</echo>
          128   <exec executable="${aapt}" failonerror="true">
          129    <arg value="package" />
          130    <arg value="-m" />
          131    <arg value="-J" />
          132    <arg value="${outdir-gen}" />
          133    <arg value="-M" />
          134    <arg value="AndroidManifest.xml" />
          135    <arg value="-S" />
          136    <arg value="${resource-dir}" />
          137    <arg value="-I" />
          138    
          139    <arg value="${android-jar}" />
          140   </exec>
          141  </target>
          142  
          143 
          144  <!-- Generate java classes from .aidl files. -->
          145  <target name="aidl" depends="copy">
          146   <echo>Compiling aidl files into Java classes</echo>
          147   <apply executable="${aidl}" failonerror="true">
          148    <arg value="-p${android.aidl}" />
          149    <arg value="-I${srcdir}" />
          150    <fileset dir="${srcdir}">
          151     <include name="**/*.aidl"/>
          152    </fileset>
          153   </apply>
          154  </target>
          155 
          156  <!-- Compile this project's .java files into .class files. -->
          157  <target name="compile" depends="copy, resource-src, aidl">
          158   <javac encoding="ascii" target="1.6" debug="true" extdirs="" srcdir="." destdir="${outdir-classes}" bootclasspathref="android.libraries.jars">
          159    <classpath>
          160     <fileset dir="${external-libs}" includes="*.jar" />
          161    </classpath>
          162   </javac>
          163  </target>
          164 
          165  <!-- Convert this project's .class files into .dex files. -->
          166  <target name="dex" depends="compile">
          167   <echo>Converting compiled files and external libraries into ${outdir}/${dex-file}</echo>
          168   <apply executable="${dx}" failonerror="true" parallel="false">
          169    <arg value="--dex" />
          170    
          171    <arg value="--output=${intermediate-dex-ospath}" />
          172    <arg path="${outdir-obfuscate-classes-ospath}" />
          173    <fileset dir="${external-libs}" includes="*.jar" />
          174   </apply>
          175  </target>
          176 
          177  <!-- Put the project's resources into the output package file. -->
          178  <target name="package-res-and-assets">
          179   <echo>Packaging resources and assets</echo>
          180   <exec executable="${aapt}" failonerror="true">
          181    <arg value="package" />
          182    <arg value="-f" />
          183    <arg value="-M" />
          184    <arg value="AndroidManifest.xml" />
          185    <arg value="-S" />
          186    <arg value="${resource-dir}" />
          187    <arg value="-A" />
          188    <arg value="${asset-dir}" />
          189    <arg value="-I" />
          190    <arg value="${android-jar}" />
          191    <arg value="-F" />
          192    <arg value="${resources-package}" />
          193   </exec>
          194  </target>
          195 
          196  <!-- Same as package-res-and-assets, but without "-A ${asset-dir}" -->
          197  <target name="package-res-no-assets">
          198   <echo>Packaging resources</echo>
          199   <exec executable="${aapt}" failonerror="true">
          200    <arg value="package" />
          201    <arg value="-f" />
          202    <arg value="-M" />
          203    <arg value="AndroidManifest.xml" />
          204    <arg value="-S" />
          205    <arg value="${resource-dir}" />
          206    <!-- No assets directory -->
          207    <arg value="-I" />
          208    <arg value="${android-jar}" />
          209    <arg value="-F" />
          210    <arg value="${resources-package}" />
          211   </exec>
          212  </target>
          213  
          214  <!-- Invoke the proper target depending on whether or not
          215            an assets directory is present. -->
          216  <!-- TODO: find a nicer way to include the "-A ${asset-dir}" argument
          217            only when the assets dir exists. -->
          218  <target name="package-res">
          219   <available file="${asset-dir}" type="dir" property="res-target" value="and-assets" />
          220   <property name="res-target" value="no-assets" />
          221   <antcall target="package-res-${res-target}" />
          222  </target>
          223 
          224  <!-- Package the application and sign it with a debug key.
          225      This is the default target when building. It is used for debug. -->
          226  <target name="debug" depends="dex, package-res">
          227   <echo>Packaging ${out-debug-package}, and signing it with a debug key</echo>
          228   <exec executable="${apk-builder}" failonerror="false">
          229    <arg value="${out-debug-package-ospath}" />
          230    <arg value="-z" />
          231    <arg value="${resources-package-ospath}" />
          232    <arg value="-f" />
          233    <arg value="${intermediate-dex-ospath}" />
          234    <arg value="-rf" />
          235    <arg value="${srcdir-ospath}" />
          236    <arg value="-rj" />
          237    <arg value="${external-libs-ospath}" />
          238   </exec>
          239  </target>
          240 
          241  <!-- Package the application without signing it.
          242         This allows for the application to be signed later with an official publishing key. -->
          243  <target name="package" depends="dex, package-res">
          244   <echo>Packaging ${out-unsigned-package} for release</echo>
          245   <exec executable="${apk-builder}" failonerror="true">
          246    <arg value="${out-unsigned-package-ospath}" />
          247    <arg value="-u" />
          248    <arg value="-z" />
          249    <arg value="${resources-package-ospath}" />
          250    <arg value="-f" />
          251    <arg value="${intermediate-dex-ospath}" />
          252    <arg value="-rf" />
          253    <arg value="${srcdir-ospath}" />
          254    <arg value="-rj" />
          255    
          256    <arg value="${external-libs-ospath}" />
          257   </exec>
          258   <echo>It will need to be signed with jarsigner before being published.</echo>
          259  </target>
          260 
          261  <target name="jarsigner" depends="package">
          262   <echo>Packaging ${out-unsigned-package} for release</echo>
          263   <exec executable="${jarsigner}" failonerror="true">
          264    <arg value="-verbose" />
          265    <arg value="-storepass" />
          266    <arg value="byread002" />
          267    <arg value="-keypass" />
          268    <arg value="byread002" />
          269    <arg value="-keystore" />
          270    <arg value="bbyread.keystore" />
          271    <arg value="-signedjar" />
          272    <arg value="${out-signed-package-ospath}" />
          273    <arg value="${out-unsigned-package-ospath}" />
          274    <arg value="byread" />
          275   </exec>
          276  </target>
          277 
          278  <target name="release" depends="jarsigner">
          279   <echo>release for release</echo>
          280  </target>
          281 
          282  <!-- Install the package on the default emulator -->
          283  <target name="install" depends="debug">
          284   <echo>Installing ${out-debug-package} onto default emulator</echo>
          285   <exec executable="${adb}" failonerror="true">
          286    <arg value="install" />
          287    <arg value="${out-debug-package}" />
          288   </exec>
          289  </target>
          290 
          291  <target name="reinstall" depends="debug">
          292   <echo>Installing ${out-debug-package} onto default emulator</echo>
          293   <exec executable="${adb}" failonerror="true">
          294    <arg value="install" />
          295    <arg value="-r" />
          296    
          297    <arg value="${out-debug-package}" />
          298   </exec>
          299  </target>
          300 
          301  <!-- Uinstall the package from the default emulator -->
          302  <target name="uninstall">
          303   <echo>Uninstalling ${application-package} from the default emulator</echo>
          304   <exec executable="${adb}" failonerror="true">
          305    <arg value="uninstall" />
          306    <arg value="${application-package}" />
          307   </exec>
          308  </target>
          310 </project>
          代碼比較長,里面有部分需要修改的地方,比如包的名字,比如安裝在服務器上的SDK的路徑等,大家可以按照文字描述慢慢修改,之后就可以將項目提交,在Hudson上建立一個自由風格的項目,選擇使用Ant作為構建工具,選擇build.xml作為構件文件,構建中很可能出現各種問題,大家可以根據Hudson的命令行輸出對build.xml文件進行修改,具體做法目前我還不是很了解,例如: failonerror="true" ,我曾經把true改為false就跳過一個錯誤,大家盡量摸索一下吧

          這個網上資料比較少,尤其是中文的,上面說的也就是我這幾天摸索的一點小成果,肯定有很多說的不全甚至錯誤的地方,希望讀者不吝賜教,有問題也歡迎回復~~

          posted on 2011-08-01 00:01 灰色客棧 閱讀(2718) 評論(2)  編輯  收藏

          評論

          # re: 使用Hudson持續集成Android項目 2011-08-04 16:24 ghlimbrother

          請問怎樣把so文件打到包里面啊  回復  更多評論   

          # re: 使用Hudson持續集成Android項目 2011-09-27 17:18 ylang

          沒有打入第三方包  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2011年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 双鸭山市| 定陶县| 临汾市| 沙湾县| 莱西市| 镇远县| 政和县| 吴川市| 蕉岭县| 梅州市| 兴仁县| 景泰县| 淳安县| 杭锦旗| 松原市| 莱阳市| 金山区| 读书| 大同市| 阿鲁科尔沁旗| 神池县| 沧州市| 万源市| 陕西省| 沙雅县| 安康市| 鹰潭市| 黄平县| 西贡区| 河南省| 绥江县| 宽甸| 哈尔滨市| 且末县| 扎兰屯市| 柳林县| 邹城市| 仁布县| 凯里市| 延庆县| 山西省|