分享

robotium测试工程打包与签名

 liuchangxin81 2014-09-11

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

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

用eclipse导出的build.xml如下:

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>  
  2. <!-- WARNING: Eclipse auto-generated file.  
  3.               Any modifications will be overwritten.  
  4.               To include a user specific buildfile here, simply create one in the same  
  5.               directory with the processing instruction <?eclipse.ant.import?>  
  6.               as the first entry and export the buildfile again. -->  
  7. <project basedir="." default="build" name="RobotiumTest">  
  8.     <property environment="env">  
  9.     <property name="ECLIPSE_HOME" value="../../eclipse">  
  10.     <property name="ExampleProject.location" value="../../eclipse/workspace/ExampleProject">  
  11.     <property name="debuglevel" value="source,lines,vars">  
  12.     <property name="target" value="1.6">  
  13.     <property name="source" value="1.6">  
  14.     <path id="Android 4.0.libraryclasspath">  
  15.         <pathelement location="../../android-sdk-windows/platforms/android-14/android.jar">  
  16.     </pathelement></path>  
  17.     <path id="Android Dependencies.libraryclasspath">  
  18.         <pathelement location="../../android-sdk-windows/tools/support/annotations.jar">  
  19.         <pathelement location="libs/all.jar">  
  20.         <pathelement location="libs/robotium-solo-4.1.jar">  
  21.     </pathelement></pathelement></pathelement></path>  
  22.     <path id="ExampleProject.classpath">  
  23.         <path refid="Android 4.0.libraryclasspath">  
  24.         <path refid="Android Dependencies.libraryclasspath">  
  25.         <pathelement location="${ExampleProject.location}/bin/classes">  
  26.         <pathelement location="${ExampleProject.location}/libs/android-support-v4.jar">  
  27.     </pathelement></pathelement></path>  
  28.     <path id="RobotiumTest.classpath">  
  29.         <pathelement location="bin/classes">  
  30.         <path refid="Android 4.0.libraryclasspath">  
  31.         <pathelement location="Robotium/robotium-solo-4.1.jar">  
  32.         <path refid="Android Dependencies.libraryclasspath">  
  33.         <path refid="ExampleProject.classpath">  
  34.     </path>  
  35.     <target name="init">  
  36.         <mkdir dir="bin/classes">  
  37.         <copy includeemptydirs="false" todir="bin/classes">  
  38.             <fileset dir="gen">  
  39.                 <exclude name="**/*.java">  
  40.             </exclude></fileset>  
  41.         </copy>  
  42.         <copy includeemptydirs="false" todir="bin/classes">  
  43.             <fileset dir="src">  
  44.                 <exclude name="**/*.java">  
  45.             </exclude></fileset>  
  46.         </copy>  
  47.     </mkdir></target>  
  48.     <target name="clean">  
  49.         <delete dir="bin/classes">  
  50.     </delete></target>  
  51.     <target depends="clean" name="cleanall">  
  52.         <ant antfile="build.xml" dir="${ExampleProject.location}" inheritall="false" target="clean">  
  53.     </ant></target>  
  54.     <target depends="build-subprojects,build-project" name="build">  
  55.     <target name="build-subprojects">  
  56.         <ant antfile="build.xml" dir="${ExampleProject.location}" inheritall="false" target="build-project">  
  57.             <propertyset>  
  58.                 <propertyref name="build.compiler">  
  59.             </propertyref></propertyset>  
  60.         </ant>  
  61.     </target>  
  62.     <target depends="init" name="build-project">  
  63.         <echo message="${ant.project.name}: ${ant.file}">  
  64.         <javac debug="true" debuglevel="${debuglevel}" destdir="bin/classes" source="${source}" target="${target}">  
  65.             <src path="gen">  
  66.             <classpath refid="RobotiumTest.classpath">  
  67.         </classpath></src></javac>  
  68.         <javac debug="true" debuglevel="${debuglevel}" destdir="bin/classes" source="${source}" target="${target}">  
  69.             <src path="src">  
  70.             <classpath refid="RobotiumTest.classpath">  
  71.         </classpath></src></javac>  
  72.     </echo></target>  
  73.     <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects">  
  74.     <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">  
  75.         <copy todir="${ant.library.dir}">  
  76.             <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar">  
  77.         </fileset></copy>  
  78.         <unzip dest="${ant.library.dir}">  
  79.             <patternset includes="jdtCompilerAdapter.jar">  
  80.             <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar">  
  81.         </fileset></patternset></unzip>  
  82.     </target>  
  83.     <target description="compile project with Eclipse compiler" name="build-eclipse-compiler">  
  84.         <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter">  
  85.         <antcall target="build">  
  86.     </project>  


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

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环境,减少依赖,更有利于持续集成

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>  
  2.   
  3.  <project name="ExampleRobotiumTest" default="jarsigner" basedir=".">  
  4.     <property environment="env"/>  
  5.       
  6.     <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>  
  7.       
  8.     <!-- android环境相关路径 -->  
  9.     <property name="android_home" value="${env.ANDROID_HOME}" />       
  10.     <property name="android-platform" value="${android_home}/platforms/android-14"/>  
  11.     <property name="android-tools" value="${android_home}/tools"/>    
  12.       <property name="android_platform-tools" value="${android_home}/platform-tools"/>  
  13.       <property name="android-jar" value="${android-platform}/android.jar" />  
  14.         
  15.       <!-- windows与linux平台判断 -->  
  16.       <condition property="exe" value=".exe" else=""><os family="windows" /></condition>  
  17.     <condition property="bat" value=".bat" else=""><os family="windows" /></condition>  
  18.    
  19.      <!-- android打包的各工具路径 -->  
  20.     <property name="aapt" value="${android_platform-tools}/aapt${exe}" />    
  21.     <property name="aidl" value="${android_platform-tools}/aidl${exe}" />    
  22.     <property name="dx" value="${android_platform-tools}/dx${bat}" />    
  23.     <property name="apk-builder" value="${android-tools}/apkbuilder${bat}" />        
  24.     <property name="proguard-home" value="${android-tools}/proguard/lib"/>   
  25.     <property name="jarsigner" value="${env.JAVA_HOME}/bin/jarsigner" />  
  26.       
  27.       <property name="external-libs" value="libs" />  
  28.       <condition property="external-libs-ospath" value="${basedir}/${external-libs}" else="${basedir}/${external-libs}">    
  29.         <os family="windows" />    
  30.     </condition>      
  31.        
  32.       <!-- 测试工程额外jar包 -->  
  33.       <property name="robotium_solo" value="robotium-solo-4.1.jar" />  
  34.         
  35.       <!-- 测试工程打包时生成的all.jar -->  
  36.       <property name="all-jar" value="all.jar" />  
  37.         
  38.       <!-- 被测工程相关路径 -->  
  39.     <property name="Example.location" value="../../Example/Example_1.0"/>  
  40.     <property name="Example.outdir" value="../../Example/Examplebuild"/>  
  41.       
  42.     <!-- 编译相关参数 -->  
  43.     <property name="debuglevel" value="source,lines,vars"/>  
  44.     <property name="target" value="1.6"/>  
  45.     <property name="source" value="1.6"/>  
  46.       
  47.     <!-- 测试工程打包过程中产生的文件 -->  
  48.     <property name="outdir" value="../robotiumbuild" />  
  49.       <property name="out.absolute.dir" location="${outdir}" />  
  50.       <property name="out.signedapkdir.dir" location="${outdir}/robosigneddir" />  
  51.       <property name="out.zipalignapkdir.dir" location="${outdir}/robozipalignddir" />  
  52.       
  53.     <property name="outdir-gen" value="gen" />      
  54.     <property name="resource-dir" value="res" />  
  55.       <property name="asset-dir" value="assets" />  
  56.       <property name="src-dir" value="src" />  
  57.       <property name="src-dir-path" value="${basedir}/${src-dir}" />      
  58.       <property name="outdir-classes" value="${outdir}/classes" />  
  59.       <property name="out.classes.absolute.dir" location="${outdir-classes}" />       
  60.       <property name="dex-file" value="classes.dex" />  
  61.       <property name="intermediate-dex" value="${out.absolute.dir}/${dex-file}" />  
  62.         
  63.       <!-- 最终生成文件所在路径 -->  
  64.       <property name="resources-package" value="${outdir}/resources.ap_" />  
  65.       <property name="resources-package-path" value="${basedir}/${resources-package}" />  
  66.       <property name="out-unsigned-package-first" value="${basedir}/${outdir}/${ant.project.name}-" />  
  67.       <property name="out-unsigned-package-end" value="-unsigned.apk" />  
  68.       <property name="out-signed-package-name" value="ExampleRobotiumTest" />  
  69.       <property name="out-signed-package-first" value="${out.signedapkdir.dir}/${out-signed-package-name}" />  
  70.       <property name="out-signed-package-end" value=".apk" />  
  71.       <property name="out-zipalign-package-first" value="${out.zipalignapkdir.dir}/${out-signed-package-name}" />  
  72.       <property name="out-zipalign-package-end" value=".apk" />  
  73.       <property name="out-unsigned-package-apk" value="${out-signed-package-first}${id}${out-signed-package-end}" />  
  74.       <property name="out-signed-package-apk" value="${out-unsigned-package-first}${id}${out-unsigned-package-end}" />  
  75.        
  76.      <!-- 签名的key -->  
  77.     <property name="keystorefile" location="Example.key" />  
  78.       <property name="keypass" value="******" />  
  79.       <property name="aliasname" value="Example" />   
  80.         
  81.       <path id="libjar">  
  82.         <fileset dir="${external-libs}">  
  83.             <include name="*.jar" />  
  84.             <exclude name="${robotium_solo}"/>  
  85.         </fileset>  
  86.       </path>  
  87.         
  88.       <target name="makeSuperJar" description="description" depends="isJarExists" if="jarExists">  
  89.         <jar destfile="${external-libs}/${all-jar}">  
  90.             <zipfileset src="${external-libs}/${robotium_solo}"/>       
  91.         </jar>  
  92.       </target>  
  93.         
  94.       <target name="isJarExists" description="description" >  
  95.         <condition property="jarExists">  
  96.          <not>  
  97.           <available file="${external-libs}/${all-jar}"></available>  
  98.          </not>  
  99.         </condition>  
  100.       </target>  
  101.        
  102.      <!-- android基础classpath -->  
  103.     <path id="Android 4.0.libraryclasspath">  
  104.         <pathelement location="${android-jar}"/>  
  105.     </path>  
  106.     <path id="Android Dependencies.libraryclasspath">  
  107.         <pathelement location="${android_platform-tools}/support/annotations.jar"/>  
  108.     </path>  
  109.       
  110.     <!-- 被测工程的classpath -->  
  111.     <path id="Example.classpath">  
  112.         <pathelement location="${Example.outdir}/classes"/>  
  113.         <pathelement location="${Example.location}/gen"/>  
  114.         <pathelement location="${Example.location}/src"/>  
  115.         <path refid="Android 4.0.libraryclasspath"/>  
  116.         <path refid="Android Dependencies.libraryclasspath"/>  
  117.         <pathelement location="${Example.location}/libs/android-support-v4.jar"/>  
  118.     </path>  
  119.       
  120.      <!-- 测试工程Example的classpath -->  
  121.     <path id="Example_Robotium.classpath">          
  122.         <pathelement location="${outdir}/classes"/>  
  123.         <pathelement location="${outdir}/gen"/>  
  124.         <pathelement location="${outdir}/src"/>         
  125.         <path refid="libjar"/>  
  126.         <path refid="Example.classpath"/>  
  127.     </path>  
  128.       
  129.     <!-- 初始化 -->  
  130.     <target name="init">  
  131.             <echo>Creating all output directories </echo>  
  132.           <delete file="${external-libs}/all.jar"/>  
  133.             <delete dir="${outdir}" />  
  134.             <delete dir="${outdir-gen}" />  
  135.         <mkdir dir="${outdir}" />  
  136.             <mkdir dir="${outdir-classes}" />  
  137.             <mkdir dir="${outdir-gen}" />  
  138.             <mkdir dir="${out.signedapkdir.dir}" />  
  139.             <mkdir dir="${out.zipalignapkdir.dir}" />  
  140.         <copy includeemptydirs="false" todir="${outdir-classes}">  
  141.             <fileset dir="${outdir-gen}">  
  142.                 <exclude name="**/*.java"/>  
  143.             </fileset>  
  144.         </copy>  
  145.         <copy includeemptydirs="false" todir="${outdir-classes}">  
  146.             <fileset dir="${src-dir}">  
  147.                 <exclude name="**/*.java"/>  
  148.             </fileset>  
  149.         </copy>  
  150.     </target>  
  151.       
  152.       
  153.       
  154.     <target name="clean">  
  155.         <delete dir="${outdir-classes}"/>  
  156.     </target>  
  157.       
  158.     <target depends="clean" name="cleanall">  
  159.         <ant antfile="build.xml" dir="${Example.location}" inheritAll="false" target="clean"/>  
  160.     </target>  
  161.       
  162.     <target depends="build-project" name="build"/>  
  163.       
  164.     <!--构建被测工程 -->  
  165.      <target name="build-subprojects">  
  166.         <ant antfile="build.xml" dir="${Example.location}" inheritAll="false">  
  167.             <propertyset>  
  168.                 <propertyref name="build.compiler"/>  
  169.             </propertyset>  
  170.         </ant>  
  171.     </target>     
  172.       
  173.       <!--步骤 1: aapt生成R.java -->  
  174.         <target depends="init,build-subprojects" name="resource-src">  
  175.         <echo>Generating R.java...</echo>  
  176.         <exec executable="${aapt}" failonerror="true">  
  177.             <arg value="package" />  
  178.             <arg value="-m" />  
  179.             <arg value="-J" />  
  180.             <arg value="${outdir-gen}" />  
  181.             <arg value="-M" />  
  182.             <arg value="AndroidManifest.xml" />  
  183.             <arg value="-S" />  
  184.             <arg value="${resource-dir}" />  
  185.             <arg value="-I" />  
  186.             <arg value="${android-jar}" />  
  187.         </exec>  
  188.       </target>  
  189.         
  190.      <!-- 开始构建测试工程. -->  
  191.     <target depends="aidl" name="build-project">  
  192.         <javac encoding="UTF-8" target="1.6" debug="false" extdirs="" srcdir="." destdir="${outdir-classes}" bootclasspath="${android-jar}" includeantruntime="on">  
  193.             <classpath refid="Example_Robotium.classpath"/>  
  194.         </javac>  
  195.     </target>  
  196.         
  197.      <target name="aidl" depends="resource-src">  
  198.         <echo>Compiling aidl files into Java classes...</echo>  
  199.         <apply executable="${aidl}" failonerror="true">  
  200.             <arg value="-p${android-framework-aild}" />  
  201.             <arg value="-I${src-dir}" />  
  202.             <fileset dir="${src-dir}">  
  203.                 <include name="**/*.aidl" />  
  204.             </fileset>  
  205.         </apply>  
  206.       </target>  
  207.       
  208.     <!-- 步骤 2. 编译所有class文件. -->  
  209.     <target name="compile" depends="aidl">  
  210.         <javac encoding="UTF-8" target="1.6" debug="false" extdirs="" srcdir="." destdir="${outdir-classes}" bootclasspath="${android-jar}" includeantruntime="on">  
  211.             <classpath refid="libjar"/>  
  212.             <classpath refid="Example_Robotium.classpath"/>  
  213.         </javac>  
  214.     </target>  
  215.       
  216.       <!-- 步骤 3. 转换class文件为dex文件. -->  
  217.       <target name="dex" depends="makeSuperJar,compile">  
  218.         <echo>${intermediate-dex}</echo>  
  219.         <echo>${out.classes.absolute.dir}</echo>  
  220.         <apply executable="${dx}" failonerror="true">  
  221.             <arg value="--dex" />  
  222.             <arg value="--output=${intermediate-dex}" />  
  223.             <arg path="${out.classes.absolute.dir}" />  
  224.             <fileset dir="${external-libs}">  
  225.                 <include name="*.jar" />  
  226.                 <exclude name="${robotium_solo}"/>      
  227.             </fileset>  
  228.         </apply >  
  229.       </target>  
  230.         
  231.       <!-- 步骤 4. 将资源和清单打包. -->  
  232.       <target name="package-res-and-assets">  
  233.         <echo>Packaging resources and assets...</echo>  
  234.         <echo>resources-package: ${resources-package}</echo>  
  235.         <exec executable="${aapt}" failonerror="true">  
  236.             <arg value="package" />  
  237.             <arg value="-f" />  
  238.             <arg value="-M" />  
  239.             <arg value="AndroidManifest.xml" />  
  240.             <arg value="-S" />  
  241.             <arg value="${resource-dir}" />  
  242.             <arg value="-A" />  
  243.             <arg value="${asset-dir}" />  
  244.             <arg value="-I" />  
  245.             <arg value="${android-jar}" />  
  246.             <arg value="-F" />  
  247.             <arg value="${resources-package}" />  
  248.         </exec>  
  249.       </target>  
  250.         
  251.       <!-- 步骤 5. 将打好的包编译为APK文件. -->  
  252.     <target name="debug" depends="dex,package-res-and-assets">  
  253.         <exec executable="${apk-builder}" failonerror="false">  
  254.             <arg value="${out-unsigned-package-first}${out-unsigned-package-end}" />  
  255.             <arg value="-u" />  
  256.             <arg value="-z" />  
  257.             <arg value="${resources-package-path}" />  
  258.             <arg value="-f" />  
  259.             <arg value="${intermediate-dex}" />  
  260.             <arg value="-rf" />  
  261.             <arg value="${src-dir-path}" />  
  262.             <arg value="-rj" />    
  263.             <arg value="${external-libs-ospath}" />     
  264.             <arg value="-nf" />    
  265.             <arg value="${external-libs-ospath}" />   
  266.         </exec>  
  267.     </target>  
  268.         
  269.       <!--步骤 6. 签名APK文件 -->  
  270.   <target name="jarsigner" depends="init,debug">  
  271.         <exec executable="${jarsigner}" failonerror="true">  
  272.             <arg value="-verbose" />  
  273.             <arg value="-digestalg" />  
  274.             <arg value="SHA1" />  
  275.             <arg value="-sigalg" />  
  276.             <arg value="MD5withRSA" />  
  277.             <arg value="-keystore" />  
  278.             <arg value="${keystorefile}" />  
  279.             <arg value="-storepass" />  
  280.             <arg value="${keypass}" />  
  281.             <arg value="-keypass" />  
  282.             <arg value="${keypass}" />  
  283.             <arg value="-signedjar" />  
  284.             <arg value="${out-signed-package-first}${out-signed-package-end}" />  
  285.             <arg value="${out-unsigned-package-first}${out-unsigned-package-end}" />  
  286.             <arg value="${aliasname}" />  
  287.         </exec>  
  288.         <delete file="${out-unsigned-package-first}${out-unsigned-package-end}">  
  289.         </delete>  
  290.     </target>   
  291.       
  292. </project>  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多