robotium测试工程打包与签名,可以用ant实现,使用ant前,需要创建build.xml文件。
robotium测试工程的打包与普通android工程的不同点在于,构建robotium测试工程前需要先构建android被测工程。
用eclipse导出的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>