Home | History | Annotate | Download | only in ant
      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <!--
      3     Copyright (C) 2005-2008 The Android Open Source Project
      4 
      5     Licensed under the Apache License, Version 2.0 (the "License");
      6     you may not use this file except in compliance with the License.
      7     You may obtain a copy of the License at
      8 
      9          http://www.apache.org/licenses/LICENSE-2.0
     10 
     11     Unless required by applicable law or agreed to in writing, software
     12     distributed under the License is distributed on an "AS IS" BASIS,
     13     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14     See the License for the specific language governing permissions and
     15     limitations under the License.
     16 -->
     17 
     18 <project default="-dex">
     19   <property name="verbose" value="false" />
     20   <property name="out.dir" location="${OUT_DIR}" />
     21   <!-- Output directories -->
     22   <property name="out.dir" value="bin" />
     23   <property name="out.absolute.dir" location="${out.dir}" />
     24   <property name="out.classes.absolute.dir" location="${out.dir}/classes" />
     25   <property name="out.dexed.absolute.dir" location="${out.dir}/dexedLibs" />
     26   <property name="out.manifest.abs.file" location="${out.dir}/AndroidManifest.xml" />
     27 
     28   <!-- tools location -->
     29   <property name="sdk.dir" location="${ANDROID_SDK_ROOT}"/>
     30   <property name="target" value="android-${ANDROID_SDK_VERSION}"/>
     31   <property name="android.tools.dir" location="${sdk.dir}/tools" />
     32   <property name="android.platform.tools.dir" location="${sdk.dir}/platform-tools" />
     33 
     34   <property name="project.target.android.jar" location="${ANDROID_SDK_JAR}" />
     35   <path id="project.target.class.path">
     36     <pathelement location="${project.target.android.jar}" />
     37   </path>
     38 
     39 
     40   <!-- jar file from where the tasks are loaded -->
     41   <path id="android.antlibs">
     42       <pathelement path="${sdk.dir}/tools/lib/ant-tasks.jar" />
     43   </path>
     44 
     45   <!-- Custom tasks -->
     46   <taskdef resource="anttasks.properties" classpathref="android.antlibs" />
     47 
     48 
     49   <path id="javac.srcdirs.additional">
     50     <filelist files="${ADDITIONAL_SRC_DIRS}"/>
     51     <filelist files="${GENERATED_SRC_DIRS}"/>
     52   </path>
     53 
     54   <!-- Classpath for javac -->
     55   <path id="javac.custom.classpath">
     56     <filelist files="${INPUT_JARS_PATHS}"/>
     57   </path>
     58 
     59   <!--
     60     TODO(cjhopman): This is wrong for proguard builds. In that case, it should be just the
     61     obfuscated jar.
     62   -->
     63   <path id="out.dex.jar.input.ref">
     64     <path refid="javac.custom.classpath"/>
     65   </path>
     66 
     67   <!-- compilation options -->
     68   <property name="java.encoding" value="UTF-8" />
     69   <property name="java.target" value="1.5" />
     70   <property name="java.source" value="1.5" />
     71   <property name="java.compilerargs" value="" />
     72 
     73   <property name="source.dir" value="${SOURCE_DIR}" />
     74   <property name="source.absolute.dir" location="${source.dir}" />
     75   <property name="gen.absolute.dir" value="${out.dir}/gen"/>
     76 
     77   <property name="dx" location="${android.platform.tools.dir}/dx" />
     78 
     79   <property name="need.javac.fork" value="false" />
     80   <condition property="project.is.testapp" value="true" else="false">
     81     <equals arg1="${IS_TEST_APK}" arg2="1" />
     82   </condition>
     83 
     84   <!--
     85     Override the -compile target.
     86     This target requires 'javac.custom.classpath' to be set to reference
     87     of classpath to be used for javac. Also accepts custom path for
     88     sources: 'javac.custom.sourcepath'.
     89   -->
     90   <!-- Compiles this project's .java files into .class files. -->
     91   <target name="-compile">
     92 
     93     <mkdir dir="${out.classes.absolute.dir}" />
     94     <mkdir dir="${out.dexed.absolute.dir}" />
     95     <delete>
     96       <fileset dir="${out.classes.absolute.dir}" includes="**/*.class"/>
     97     </delete>
     98 
     99     <javac
    100         bootclasspathref="project.target.class.path"
    101         classpathref="javac.custom.classpath"
    102         debug="true"
    103         destdir="${out.classes.absolute.dir}"
    104         encoding="${java.encoding}"
    105         extdirs=""
    106         fork="${need.javac.fork}"
    107         includeantruntime="false"
    108         source="${java.source}"
    109         target="${java.target}"
    110         verbose="${verbose}">
    111       <src path="${source.absolute.dir}"/>
    112       <src path="${gen.absolute.dir}"/>
    113       <src>
    114         <path refid="javac.srcdirs.additional"/>
    115       </src>
    116       <compilerarg value="-Xlint:unchecked"/>
    117       <compilerarg line="${java.compilerargs}"/>
    118     </javac>
    119 
    120     <if condition="${project.is.testapp}">
    121       <then>
    122         <!-- get the project manifest package -->
    123         <xpath input="${out.manifest.abs.file}"
    124                 expression="/manifest/@package" output="project.app.package" />
    125         <loadresource property="project.app.packagepath">
    126           <propertyresource name="project.app.package"/>
    127           <filterchain>
    128             <replacestring from="." to="/"/>
    129           </filterchain>
    130         </loadresource>
    131         <property name="create.test.jar.exclusions"
    132                   value="${project.app.packagepath}/R.class ${project.app.packagepath}/R$*.class ${project.app.packagepath}/Manifest.class ${project.app.packagepath}/Manifest$*.class ${project.app.packagepath}/BuildConfig.class"/>
    133         <jar destfile="${TEST_JAR_PATH}"
    134              excludes="${create.test.jar.exclusions}"
    135              duplicate="preserve"
    136              >
    137           <restrict>
    138             <name name="**/*.class"/>
    139             <archives>
    140               <zips>
    141                 <path refid="javac.custom.classpath"/>
    142               </zips>
    143             </archives>
    144           </restrict>
    145           <fileset dir="${out.dir}/classes"/>
    146         </jar>
    147       </then>
    148     </if>
    149 
    150     <!-- Package all the compiled .class files into a .jar. -->
    151     <jar
    152       jarfile="${JAR_PATH}"
    153       basedir="${out.classes.absolute.dir}"
    154     />
    155   </target>
    156 
    157   <property name="proguard.enabled" value="${PROGUARD_ENABLED}" />
    158   <property name="proguard.config" value="${PROGUARD_FLAGS}" />
    159 
    160   <!-- Obfuscate target
    161       This is only active in release builds when proguard.config is defined
    162       in default.properties.
    163 
    164   -->
    165   <!--
    166     Override obfuscate target to pass javac.custom.classpath to Proguard. SDK tools do not provide
    167     any way to pass custom class paths to Proguard.
    168    -->
    169   <target name="-obfuscate" depends="-compile">
    170     <if condition="${proguard.enabled}">
    171       <then>
    172         <path id="out.dex.jar.input.ref" />
    173         <property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard"/>
    174         <property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar"/>
    175         <property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar"/>
    176         <!-- input for dex will be proguard's output -->
    177         <property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}"/>
    178 
    179         <!-- Add Proguard Tasks -->
    180         <property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar"/>
    181         <taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}"/>
    182 
    183         <!-- Set the android classpath Path object into a single property. It'll be
    184                  all the jar files separated by a platform path-separator.
    185                  Each path must be quoted if it contains spaces.
    186         -->
    187         <pathconvert property="project.target.classpath.value" refid="project.target.class.path">
    188           <firstmatchmapper>
    189             <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
    190             <identitymapper/>
    191           </firstmatchmapper>
    192         </pathconvert>
    193 
    194         <!-- Build a path object with all the jar files that must be obfuscated.
    195              This include the project compiled source code and any 3rd party jar
    196              files. -->
    197         <path id="project.all.classes.path">
    198           <pathelement location="${preobfuscate.jar.file}"/>
    199           <!-- Pass javac.custom.classpath for apks. -->
    200           <path refid="javac.custom.classpath"/>
    201         </path>
    202         <!-- Set the project jar files Path object into a single property. It'll be
    203              all the jar files separated by a platform path-separator.
    204              Each path must be quoted if it contains spaces.
    205         -->
    206         <pathconvert property="project.all.classes.value" refid="project.all.classes.path">
    207           <firstmatchmapper>
    208             <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
    209             <identitymapper/>
    210           </firstmatchmapper>
    211         </pathconvert>
    212 
    213         <!-- Turn the path property ${proguard.config} from an A:B:C property
    214              into a series of includes: -include A -include B -include C
    215              suitable for processing by the ProGuard task. Note - this does
    216              not include the leading '-include "' or the closing '"'; those
    217              are added under the <proguard> call below.
    218         -->
    219         <path id="proguard.configpath">
    220           <pathelement path="${proguard.config}"/>
    221         </path>
    222         <pathconvert pathsep='" -include "' property="proguard.configcmd"
    223           refid="proguard.configpath"/>
    224 
    225         <mkdir   dir="${obfuscate.absolute.dir}"/>
    226         <delete file="${preobfuscate.jar.file}"/>
    227         <delete file="${obfuscated.jar.file}"/>
    228         <jar basedir="${out.classes.absolute.dir}"
    229           destfile="${preobfuscate.jar.file}"/>
    230         <proguard>
    231           -include      "${proguard.configcmd}"
    232           -include      "${out.absolute.dir}/proguard.txt"
    233           -injars       ${project.all.classes.value}
    234           -outjars      "${obfuscated.jar.file}"
    235           -libraryjars  ${project.target.classpath.value}
    236           -dump         "${obfuscate.absolute.dir}/dump.txt"
    237           -printseeds   "${obfuscate.absolute.dir}/seeds.txt"
    238           -printusage   "${obfuscate.absolute.dir}/usage.txt"
    239           -printmapping "${obfuscate.absolute.dir}/mapping.txt"
    240         </proguard>
    241       </then>
    242     </if>
    243   </target>
    244 
    245   <property name="dex.file.name" value="classes.dex" />
    246   <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" />
    247 
    248   <!-- Converts this project's .class files into .dex files -->
    249   <target name="-dex" depends="-obfuscate">
    250       <!-- sets the primary input for dex. If a pre-dex task sets it to
    251            something else this has no effect -->
    252       <property name="out.dex.input.absolute.dir" value="${out.classes.absolute.dir}" />
    253       <property name="dex.force.jumbo" value="false" />
    254 
    255       <dex executable="${dx}"
    256               output="${intermediate.dex.file}"
    257               dexedlibs="${out.dexed.absolute.dir}"
    258               nolocals="false"
    259               forceJumbo="${dex.force.jumbo}"
    260               verbose="${verbose}">
    261           <path path="${out.dex.input.absolute.dir}"/>
    262           <path refid="out.dex.jar.input.ref" />
    263       </dex>
    264       <touch file="${STAMP}" />
    265   </target>
    266 </project>
    267