robotium测试工程打包与签名

robotium测试工程打包与签名,可以用ant实现,使用ant前,需要创建build.xml文件。

robotium测试工程的打包与普通android工程的不同点在于,构建robotium测试工程前需要先构建android被测工程。

用eclipse导出的build.xml如下:



自动导出的这个文件普通构建是可以的,但并没有完成打包签名,更无法完成更加智能些的自动化,需要根据情况作出修改。

build.xml文件中主要标签:

1.property,用于定义变量,如<property name="ECLIPSE_HOME" value="../../eclipse"/>,相当于ECLIPSE_HOME=../../eclipse,之后就可以引用这个变量了。

2.path,定义编译文件时所引用的库,<path id="Android 4.0.libraryclasspath">

3.target,定义任务,如<target name="init">,ant就是根据一个个任务执行命令的。

4.depends,定义任务之前的依赖关系,如<target depends="init" name="build-project">,当执行任务build-project时会先执行depends中的任务。

android工程打包签名的一般步骤:

一、打包资源文件,生成R.java文件
【输入】Resource文件(工程中res中的文件)、Assets文件(另外一种资源)、AndroidManifest.xml文件、Android基础类库(Android.jar文件)
【输出】打包好的资源(Android工程的bin目录resources.ap_)、R.java文件(gen目录中)
【工具】aapt工具,路径${ANDROID_SDK_HOME}/platform-tools/aapt

二、处理AIDL文件,生成对应的.java文件(没有用到AIDL,这个过程就可以省了)
【输入】源码文件、aidl文件、framework.aidl文件
【输出】对应的.java文件
【工具】aidl工具

三、编译Java文件,生成对应的.class文件
【输入】源码文件(包括R.java和AIDL生成的.java文件)、库文件(.jar文件)
【输出】.class文件
【工具】javac工具

四、把.class文件转化成Davik VM支持的.dex文件
【输入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),库文件(.jar文件)
【输出】.dex文件
【工具】javac工具

五、打包生成未签名的.apk文件
【输入】打包后的资源文件、打包后类文件(.dex文件)、libs文件(包括.so文件)
【输出】未签名的.apk文件
【工具】apkbuilder工具

六、对未签名.apk文件进行签名
【输入】未签名的.apk文件
【输出】签名的.apk文件
【工具】jarsigner

七、对签名后的.apk文件进行对齐处理(不进行对齐处理不能发布到Google Market)
【输入】签名后的.apk文件
【输出】对齐后的.apk文件
【工具】zipalign工具

了解了一般打包签名步骤后,就可以根据需要修改build.xml文件了


不使用从eclipse导出的build文件,这样便于脱离IDE环境,减少依赖,更有利于持续集成

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

 <project name="ExampleRobotiumTest" default="jarsigner" basedir=".">
    <property environment="env"/>
    
    <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>
    
    <!-- android环境相关路径 -->
    <property name="android_home" value="${env.ANDROID_HOME}" />     
    <property name="android-platform" value="${android_home}/platforms/android-14"/>
    <property name="android-tools" value="${android_home}/tools"/>  
	  <property name="android_platform-tools" value="${android_home}/platform-tools"/>
	  <property name="android-jar" value="${android-platform}/android.jar" />
	  
	  <!-- windows与linux平台判断 -->
	  <condition property="exe" value=".exe" else=""><os family="windows" /></condition>
    <condition property="bat" value=".bat" else=""><os family="windows" /></condition>
 
     <!-- android打包的各工具路径 -->
    <property name="aapt" value="${android_platform-tools}/aapt${exe}" />  
    <property name="aidl" value="${android_platform-tools}/aidl${exe}" />  
    <property name="dx" value="${android_platform-tools}/dx${bat}" />  
    <property name="apk-builder" value="${android-tools}/apkbuilder${bat}" />      
    <property name="proguard-home" value="${android-tools}/proguard/lib"/> 
    <property name="jarsigner" value="${env.JAVA_HOME}/bin/jarsigner" />
	
	  <property name="external-libs" value="libs" />
	  <condition property="external-libs-ospath" value="${basedir}/${external-libs}" else="${basedir}/${external-libs}">  
        <os family="windows" />  
    </condition>    
     
	  <!-- 测试工程额外jar包 -->
	  <property name="robotium_solo" value="robotium-solo-4.1.jar" />
	  
	  <!-- 测试工程打包时生成的all.jar -->
	  <property name="all-jar" value="all.jar" />
	  
	  <!-- 被测工程相关路径 -->
    <property name="Example.location" value="../../Example/Example_1.0"/>
    <property name="Example.outdir" value="../../Example/Examplebuild"/>
    
    <!-- 编译相关参数 -->
    <property name="debuglevel" value="source,vars"/>
    <property name="target" value="1.6"/>
    <property name="source" value="1.6"/>
    
    <!-- 测试工程打包过程中产生的文件 -->
    <property name="outdir" value="../robotiumbuild" />
	  <property name="out.absolute.dir" location="${outdir}" />
	  <property name="out.signedapkdir.dir" location="${outdir}/robosigneddir" />
	  <property name="out.zipalignapkdir.dir" location="${outdir}/robozipalignddir" />
    
    <property name="outdir-gen" value="gen" />    
    <property name="resource-dir" value="res" />
	  <property name="asset-dir" value="assets" />
	  <property name="src-dir" value="src" />
	  <property name="src-dir-path" value="${basedir}/${src-dir}" />	  
	  <property name="outdir-classes" value="${outdir}/classes" />
	  <property name="out.classes.absolute.dir" location="${outdir-classes}" />	  
	  <property name="dex-file" value="classes.dex" />
	  <property name="intermediate-dex" value="${out.absolute.dir}/${dex-file}" />
	  
	  <!-- 最终生成文件所在路径 -->
	  <property name="resources-package" value="${outdir}/resources.ap_" />
	  <property name="resources-package-path" value="${basedir}/${resources-package}" />
	  <property name="out-unsigned-package-first" value="${basedir}/${outdir}/${ant.project.name}-" />
	  <property name="out-unsigned-package-end" value="-unsigned.apk" />
	  <property name="out-signed-package-name" value="ExampleRobotiumTest" />
	  <property name="out-signed-package-first" value="${out.signedapkdir.dir}/${out-signed-package-name}" />
	  <property name="out-signed-package-end" value=".apk" />
	  <property name="out-zipalign-package-first" value="${out.zipalignapkdir.dir}/${out-signed-package-name}" />
	  <property name="out-zipalign-package-end" value=".apk" />
	  <property name="out-unsigned-package-apk" value="${out-signed-package-first}${id}${out-signed-package-end}" />
	  <property name="out-signed-package-apk" value="${out-unsigned-package-first}${id}${out-unsigned-package-end}" />
     
     <!-- 签名的key -->
    <property name="keystorefile" location="Example.key" />
	  <property name="keypass" value="******" />
	  <property name="aliasname" value="Example" /> 
	  
	  <path id="libjar">
		<fileset dir="${external-libs}">
			<include name="*.jar" />
			<exclude name="${robotium_solo}"/>
		</fileset>
	  </path>
	  
	  <target name="makeSuperJar" description="description" depends="isJarExists" if="jarExists">
		<jar destfile="${external-libs}/${all-jar}">
			<zipfileset src="${external-libs}/${robotium_solo}"/>   	
		</jar>
	  </target>
	  
	  <target name="isJarExists" description="description" >
		<condition property="jarExists">
		 <not>
		  <available file="${external-libs}/${all-jar}"></available>
		 </not>
		</condition>
	  </target>
     
     <!-- android基础classpath -->
    <path id="Android 4.0.libraryclasspath">
        <pathelement location="${android-jar}"/>
    </path>
    <path id="Android Dependencies.libraryclasspath">
        <pathelement location="${android_platform-tools}/support/annotations.jar"/>
    </path>
    
    <!-- 被测工程的classpath -->
    <path id="Example.classpath">
        <pathelement location="${Example.outdir}/classes"/>
        <pathelement location="${Example.location}/gen"/>
        <pathelement location="${Example.location}/src"/>
        <path refid="Android 4.0.libraryclasspath"/>
        <path refid="Android Dependencies.libraryclasspath"/>
        <pathelement location="${Example.location}/libs/android-support-v4.jar"/>
    </path>
    
     <!-- 测试工程Example的classpath -->
    <path id="Example_Robotium.classpath">        
        <pathelement location="${outdir}/classes"/>
        <pathelement location="${outdir}/gen"/>
        <pathelement location="${outdir}/src"/>       
        <path refid="libjar"/>
        <path refid="Example.classpath"/>
    </path>
    
    <!-- 初始化 -->
    <target name="init">
    		<echo>Creating all output directories </echo>
    	  <delete file="${external-libs}/all.jar"/>
		    <delete dir="${outdir}" />
		    <delete dir="${outdir-gen}" />
        <mkdir dir="${outdir}" />
		    <mkdir dir="${outdir-classes}" />
	    	<mkdir dir="${outdir-gen}" />
	    	<mkdir dir="${out.signedapkdir.dir}" />
	    	<mkdir dir="${out.zipalignapkdir.dir}" />
        <copy includeemptydirs="false" todir="${outdir-classes}">
            <fileset dir="${outdir-gen}">
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
        <copy includeemptydirs="false" todir="${outdir-classes}">
            <fileset dir="${src-dir}">
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>
    
    
    
    <target name="clean">
        <delete dir="${outdir-classes}"/>
    </target>
    
    <target depends="clean" name="cleanall">
        <ant antfile="build.xml" dir="${Example.location}" inheritAll="false" target="clean"/>
    </target>
    
    <target depends="build-project" name="build"/>
    
    <!--构建被测工程 -->
     <target name="build-subprojects">
        <ant antfile="build.xml" dir="${Example.location}" inheritAll="false">
            <propertyset>
                <propertyref name="build.compiler"/>
            </propertyset>
        </ant>
    </target>   
	
	  <!--步骤 1: aapt生成R.java -->
		<target depends="init,build-subprojects" name="resource-src">
		<echo>Generating R.java...</echo>
		<exec executable="${aapt}" failonerror="true">
			<arg value="package" />
			<arg value="-m" />
			<arg value="-J" />
			<arg value="${outdir-gen}" />
			<arg value="-M" />
			<arg value="AndroidManifest.xml" />
			<arg value="-S" />
			<arg value="${resource-dir}" />
			<arg value="-I" />
			<arg value="${android-jar}" />
		</exec>
	  </target>
	  
	 <!-- 开始构建测试工程. -->
	<target depends="aidl" name="build-project">
		<javac encoding="UTF-8" target="1.6" debug="false" extdirs="" srcdir="." destdir="${outdir-classes}" bootclasspath="${android-jar}" includeantruntime="on">
			<classpath refid="Example_Robotium.classpath"/>
		</javac>
	</target>
	  
	 <target name="aidl" depends="resource-src">
		<echo>Compiling aidl files into Java classes...</echo>
		<apply executable="${aidl}" failonerror="true">
			<arg value="-p${android-framework-aild}" />
			<arg value="-I${src-dir}" />
			<fileset dir="${src-dir}">
				<include name="**/*.aidl" />
			</fileset>
		</apply>
	  </target>
    
    <!-- 步骤 2. 编译所有class文件. -->
    <target name="compile" depends="aidl">
		<javac encoding="UTF-8" target="1.6" debug="false" extdirs="" srcdir="." destdir="${outdir-classes}" bootclasspath="${android-jar}" includeantruntime="on">
			<classpath refid="libjar"/>
			<classpath refid="Example_Robotium.classpath"/>
		</javac>
	</target>
	
	  <!-- 步骤 3. 转换class文件为dex文件. -->
	  <target name="dex" depends="makeSuperJar,compile">
		<echo>${intermediate-dex}</echo>
		<echo>${out.classes.absolute.dir}</echo>
		<apply executable="${dx}" failonerror="true">
			<arg value="--dex" />
			<arg value="--output=${intermediate-dex}" />
			<arg path="${out.classes.absolute.dir}" />
			<fileset dir="${external-libs}">
				<include name="*.jar" />
				<exclude name="${robotium_solo}"/>    
			</fileset>
		</apply >
	  </target>
	  
	  <!-- 步骤 4. 将资源和清单打包. -->
	  <target name="package-res-and-assets">
		<echo>Packaging resources and assets...</echo>
		<echo>resources-package: ${resources-package}</echo>
		<exec executable="${aapt}" failonerror="true">
			<arg value="package" />
			<arg value="-f" />
			<arg value="-M" />
			<arg value="AndroidManifest.xml" />
			<arg value="-S" />
			<arg value="${resource-dir}" />
			<arg value="-A" />
			<arg value="${asset-dir}" />
			<arg value="-I" />
			<arg value="${android-jar}" />
			<arg value="-F" />
			<arg value="${resources-package}" />
		</exec>
	  </target>
	  
	  <!-- 步骤 5. 将打好的包编译为APK文件. -->
	<target name="debug" depends="dex,package-res-and-assets">
		<exec executable="${apk-builder}" failonerror="false">
			<arg value="${out-unsigned-package-first}${out-unsigned-package-end}" />
			<arg value="-u" />
			<arg value="-z" />
			<arg value="${resources-package-path}" />
			<arg value="-f" />
			<arg value="${intermediate-dex}" />
			<arg value="-rf" />
			<arg value="${src-dir-path}" />
			<arg value="-rj" />  
            <arg value="${external-libs-ospath}" />   
            <arg value="-nf" />  
            <arg value="${external-libs-ospath}" /> 
		</exec>
	</target>
	  
	  <!--步骤 6. 签名APK文件 -->
  <target name="jarsigner" depends="init,debug">
		<exec executable="${jarsigner}" failonerror="true">
			<arg value="-verbose" />
			<arg value="-digestalg" />
			<arg value="SHA1" />
			<arg value="-sigalg" />
			<arg value="MD5withRSA" />
			<arg value="-keystore" />
			<arg value="${keystorefile}" />
			<arg value="-storepass" />
			<arg value="${keypass}" />
			<arg value="-keypass" />
			<arg value="${keypass}" />
			<arg value="-signedjar" />
			<arg value="${out-signed-package-first}${out-signed-package-end}" />
			<arg value="${out-unsigned-package-first}${out-unsigned-package-end}" />
			<arg value="${aliasname}" />
		</exec>
		<delete file="${out-unsigned-package-first}${out-unsigned-package-end}">
		</delete>
	</target> 
	
</project>

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念