Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 <?xml version="1.0" encoding="UTF-8"?> | |
| 2 <project name="android_rules" default="debug"> | |
| 3 | |
| 4 <!-- | |
| 5 This build file is imported by the project build file. It contains | |
| 6 all the targets and tasks necessary to build Android projects, be they | |
| 7 regular projects, library projects, or test projects. | |
| 8 | |
| 9 At the beginning of the file is a list of properties that can be overrid den | |
| 10 by adding them to your ant.properties (properties are immutable, so thei r | |
| 11 first definition sticks and is never changed). | |
| 12 | |
| 13 Follows: | |
| 14 - custom task definitions, | |
| 15 - more properties (do not override those unless the whole build system i s modified). | |
| 16 - macros used throughout the build, | |
| 17 - base build targets, | |
| 18 - debug-specific build targets, | |
| 19 - release-specific build targets, | |
| 20 - instrument-specific build targets, | |
| 21 - test project-specific build targets, | |
| 22 - install targets, | |
| 23 - help target | |
| 24 --> | |
| 25 | |
| 26 <!-- ******************************************************* --> | |
| 27 <!-- **************** Overridable Properties *************** --> | |
| 28 <!-- ******************************************************* --> | |
| 29 | |
| 30 <!-- You can override these values in your build.xml or ant.properties. | |
| 31 Overriding any other properties may result in broken build. --> | |
| 32 | |
| 33 <!-- Tells adb which device to target. You can change this from the command line | |
| 34 by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg= -e" for | |
| 35 the emulator. --> | |
| 36 <property name="adb.device.arg" value="" /> | |
| 37 | |
| 38 <!-- fileset exclude patterns (space separated) to prevent | |
| 39 files inside src/ from being packaged. --> | |
| 40 <property name="android.package.excludes" value="" /> | |
| 41 | |
| 42 <!-- set some properties used for filtering/override. If those weren't defin ed | |
| 43 before, then this will create them with empty values, which are then ig nored | |
| 44 by the custom tasks receiving them. --> | |
| 45 <property name="version.code" value="" /> | |
| 46 <property name="version.name" value="" /> | |
| 47 <property name="aapt.resource.filter" value="" /> | |
| 48 <!-- 'aapt.ignore.assets' is the list of file patterns to ignore under /res and /assets. | |
| 49 Default is "!.svn:!.git:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*.scc:* ~" | |
| 50 | |
| 51 Overall patterns syntax is: | |
| 52 [!][<dir>|<file>][*suffix-match|prefix-match*|full-match]:more:patter ns... | |
| 53 | |
| 54 - The first character flag ! avoids printing a warning. | |
| 55 - Pattern can have the flag "<dir>" to match only directories | |
| 56 or "<file>" to match only files. Default is to match both. | |
| 57 - Match is not case-sensitive. | |
| 58 --> | |
| 59 <property name="aapt.ignore.assets" value="" /> | |
| 60 | |
| 61 <!-- dex force jumbo options, to be used when dex merging fails with | |
| 62 UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dx.util.DexException: Canno t handle conversion to jumbo index! | |
| 63 at com.android.dx.merge.InstructionTransformer.jumboCheck(Instruction Transformer.java:103) | |
| 64 ... | |
| 65 --> | |
| 66 <property name="dex.force.jumbo" value="false" /> | |
| 67 | |
| 68 <!-- compilation options --> | |
| 69 <property name="java.encoding" value="UTF-8" /> | |
| 70 <property name="java.target" value="1.5" /> | |
| 71 <property name="java.source" value="1.5" /> | |
| 72 <property name="java.compilerargs" value="" /> | |
| 73 | |
| 74 <!-- Renderscript options --> | |
| 75 <property name="renderscript.debug.opt.level" value="O0" /> | |
| 76 <property name="renderscript.release.opt.level" value="O3" /> | |
| 77 | |
| 78 <!-- manifest merger default value --> | |
| 79 <property name="manifestmerger.enabled" value="false" /> | |
| 80 | |
| 81 <!-- instrumentation options --> | |
| 82 <property name="emma.filter" value="" /> | |
| 83 | |
| 84 <!-- Verbosity --> | |
| 85 <property name="verbose" value="false" /> | |
| 86 | |
| 87 <!-- Output location of the HTML report for the "lint" target. | |
| 88 Ideally this would be specified as | |
| 89 value="${out.dir}/lint.html" | |
| 90 but we can't make a forward reference to the definition for | |
| 91 ${out.dir}, and it is not a configurable property (yet). | |
| 92 --> | |
| 93 <property name="lint.out.html" value="bin/lint.html" /> | |
| 94 | |
| 95 <!-- Output location of the XML report for the "lint" target --> | |
| 96 <property name="lint.out.xml" value="bin/lint.xml" /> | |
| 97 | |
| 98 <!-- ******************************************************* --> | |
| 99 <!-- ********************* Custom Tasks ******************** --> | |
| 100 <!-- ******************************************************* --> | |
| 101 | |
| 102 <!-- jar file from where the tasks are loaded --> | |
| 103 <path id="android.antlibs"> | |
| 104 <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" /> | |
| 105 </path> | |
| 106 | |
| 107 <!-- Custom tasks --> | |
| 108 <taskdef resource="anttasks.properties" classpathref="android.antlibs" /> | |
| 109 | |
| 110 <!-- Emma configuration --> | |
| 111 <property name="emma.dir" value="${sdk.dir}/tools/lib" /> | |
| 112 <path id="emma.lib"> | |
| 113 <pathelement location="${emma.dir}/emma.jar" /> | |
| 114 <pathelement location="${emma.dir}/emma_ant.jar" /> | |
| 115 </path> | |
| 116 <taskdef resource="emma_ant.properties" classpathref="emma.lib" /> | |
| 117 <!-- End of emma configuration --> | |
| 118 | |
| 119 | |
| 120 <!-- ******************************************************* --> | |
| 121 <!-- ******************* Other Properties ****************** --> | |
| 122 <!-- ******************************************************* --> | |
| 123 <!-- overriding these properties may break the build | |
| 124 unless the whole file is updated --> | |
| 125 | |
| 126 <!-- Input directories --> | |
| 127 <property name="source.dir" value="src" /> | |
| 128 <property name="source.absolute.dir" location="${source.dir}" /> | |
| 129 <property name="gen.absolute.dir" location="gen" /> | |
| 130 <property name="resource.absolute.dir" location="res" /> | |
| 131 <property name="asset.dir" value="assets" /> | |
| 132 <property name="asset.absolute.dir" location="${asset.dir}" /> | |
| 133 <property name="jar.libs.dir" value="libs" /> | |
| 134 <property name="jar.libs.absolute.dir" location="${jar.libs.dir}" /> | |
| 135 <property name="native.libs.absolute.dir" location="libs" /> | |
| 136 | |
| 137 <property name="manifest.file" value="AndroidManifest.xml" /> | |
| 138 <property name="manifest.abs.file" location="${manifest.file}" /> | |
| 139 | |
| 140 <!-- Output directories --> | |
| 141 <property name="out.dir" value="bin" /> | |
| 142 <property name="out.absolute.dir" location="${out.dir}" /> | |
| 143 <property name="out.classes.absolute.dir" location="${out.dir}/classes" /> | |
| 144 <property name="out.res.absolute.dir" location="${out.dir}/res" /> | |
| 145 <property name="out.aidl.absolute.dir" location="${out.dir}/aidl" /> | |
| 146 <property name="out.dexed.absolute.dir" location="${out.dir}/dexedLibs" /> | |
| 147 <property name="out.manifest.abs.file" location="${out.dir}/AndroidManifest. xml" /> | |
| 148 | |
| 149 <!-- tools location --> | |
| 150 <property name="android.tools.dir" location="${sdk.dir}/tools" /> | |
| 151 <property name="android.platform.tools.dir" location="${sdk.dir}/platform-to ols" /> | |
| 152 <condition property="exe" value=".exe" else=""><os family="windows" /></cond ition> | |
| 153 <condition property="bat" value=".bat" else=""><os family="windows" /></cond ition> | |
| 154 <property name="adb" location="${android.platform.tools.dir}/adb${exe}" /> | |
| 155 <property name="zipalign" location="${android.tools.dir}/zipalign${exe}" /> | |
| 156 <property name="aidl" location="${android.platform.tools.dir}/aidl${exe}" /> | |
| 157 <property name="aapt" location="${android.platform.tools.dir}/aapt${exe}" /> | |
| 158 <property name="dx" location="${android.platform.tools.dir}/dx${bat}" /> | |
| 159 <property name="renderscript" location="${android.platform.tools.dir}/llvm-r s-cc${exe}"/> | |
| 160 <property name="lint" location="${android.tools.dir}/lint${bat}" /> | |
| 161 | |
| 162 <!-- Renderscript include Path --> | |
| 163 <path id="android.renderscript.include.path"> | |
| 164 <pathelement location="${android.platform.tools.dir}/renderscript/includ e" /> | |
| 165 <pathelement location="${android.platform.tools.dir}/renderscript/clang- include" /> | |
| 166 </path> | |
| 167 | |
| 168 <!-- Intermediate files --> | |
| 169 <property name="dex.file.name" value="classes.dex" /> | |
| 170 <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.f ile.name}" /> | |
| 171 <property name="resource.package.file.name" value="${ant.project.name}.ap_" /> | |
| 172 | |
| 173 <!-- Build property file --> | |
| 174 <property name="out.build.prop.file" location="${out.absolute.dir}/build.pro p" /> | |
| 175 | |
| 176 | |
| 177 <!-- This is needed by emma as it uses multilevel verbosity instead of simpl e 'true' or 'false' | |
| 178 The property 'verbosity' is not user configurable and depends exclusive ly on 'verbose' | |
| 179 value.--> | |
| 180 <condition property="verbosity" value="verbose" else="quiet"> | |
| 181 <istrue value="${verbose}" /> | |
| 182 </condition> | |
| 183 | |
| 184 <!-- properties for signing in release mode --> | |
| 185 <condition property="has.keystore"> | |
| 186 <and> | |
| 187 <isset property="key.store" /> | |
| 188 <length string="${key.store}" when="greater" length="0" /> | |
| 189 <isset property="key.alias" /> | |
| 190 </and> | |
| 191 </condition> | |
| 192 <condition property="has.password"> | |
| 193 <and> | |
| 194 <isset property="has.keystore" /> | |
| 195 <isset property="key.store.password" /> | |
| 196 <isset property="key.alias.password" /> | |
| 197 </and> | |
| 198 </condition> | |
| 199 | |
| 200 <!-- properties for packaging --> | |
| 201 <property name="build.packaging.nocrunch" value="true" /> | |
| 202 | |
| 203 <!-- whether we need to fork javac. | |
| 204 This is only needed on Windows when running Java < 7 --> | |
| 205 <condition else="false" property="need.javac.fork"> | |
| 206 <and> | |
| 207 <matches pattern="1\.[56]" string="${java.specification.version}"/> | |
| 208 <not> | |
| 209 <os family="unix"/> | |
| 210 </not> | |
| 211 </and> | |
| 212 </condition> | |
| 213 | |
| 214 <!-- ******************************************************* --> | |
| 215 <!-- ************************ Macros *********************** --> | |
| 216 <!-- ******************************************************* --> | |
| 217 | |
| 218 <!-- macro to do a task on if project.is.library is false. | |
| 219 elseText attribute is displayed otherwise --> | |
| 220 <macrodef name="do-only-if-not-library"> | |
| 221 <attribute name="elseText" /> | |
| 222 <element name="task-to-do" implicit="yes" /> | |
| 223 <sequential> | |
| 224 <if condition="${project.is.library}"> | |
| 225 <else> | |
| 226 <task-to-do /> | |
| 227 </else> | |
| 228 <then> | |
| 229 <echo level="info">@{elseText}</echo> | |
| 230 </then> | |
| 231 </if> | |
| 232 </sequential> | |
| 233 </macrodef> | |
| 234 | |
| 235 <!-- macro to do a task on if manifest.hasCode is true. | |
| 236 elseText attribute is displayed otherwise --> | |
| 237 <macrodef name="do-only-if-manifest-hasCode"> | |
| 238 <attribute name="elseText" default=""/> | |
| 239 <element name="task-to-do" implicit="yes" /> | |
| 240 <sequential> | |
| 241 <if condition="${manifest.hasCode}"> | |
| 242 <then> | |
| 243 <task-to-do /> | |
| 244 </then> | |
| 245 <else> | |
| 246 <if> | |
| 247 <condition> | |
| 248 <length string="@{elseText}" trim="true" when="greater" length="0" /> | |
| 249 </condition> | |
| 250 <then> | |
| 251 <echo level="info">@{elseText}</echo> | |
| 252 </then> | |
| 253 </if> | |
| 254 </else> | |
| 255 </if> | |
| 256 </sequential> | |
| 257 </macrodef> | |
| 258 | |
| 259 | |
| 260 <!-- Configurable macro, which allows to pass as parameters output directory , | |
| 261 output dex filename and external libraries to dex (optional) --> | |
| 262 <macrodef name="dex-helper"> | |
| 263 <element name="external-libs" optional="yes" /> | |
| 264 <attribute name="nolocals" default="false" /> | |
| 265 <sequential> | |
| 266 <!-- sets the primary input for dex. If a pre-dex task sets it to | |
| 267 something else this has no effect --> | |
| 268 <property name="out.dex.input.absolute.dir" value="${out.classes.abs olute.dir}" /> | |
| 269 | |
| 270 <!-- set the secondary dx input: the project (and library) jar files | |
| 271 If a pre-dex task sets it to something else this has no effect --> | |
| 272 <if> | |
| 273 <condition> | |
| 274 <isreference refid="out.dex.jar.input.ref" /> | |
| 275 </condition> | |
| 276 <else> | |
| 277 <path id="out.dex.jar.input.ref"> | |
| 278 <path refid="project.all.jars.path" /> | |
| 279 </path> | |
| 280 </else> | |
| 281 </if> | |
| 282 | |
| 283 <dex executable="${dx}" | |
| 284 output="${intermediate.dex.file}" | |
| 285 dexedlibs="${out.dexed.absolute.dir}" | |
| 286 nolocals="@{nolocals}" | |
| 287 forceJumbo="${dex.force.jumbo}" | |
| 288 verbose="${verbose}"> | |
| 289 <path path="${out.dex.input.absolute.dir}"/> | |
| 290 <path refid="out.dex.jar.input.ref" /> | |
| 291 <external-libs /> | |
| 292 </dex> | |
| 293 </sequential> | |
| 294 </macrodef> | |
| 295 | |
| 296 <!-- This is macro that enable passing variable list of external jar files t o ApkBuilder | |
| 297 Example of use: | |
| 298 <package-helper> | |
| 299 <extra-jars> | |
| 300 <jarfolder path="my_jars" /> | |
| 301 <jarfile path="foo/bar.jar" /> | |
| 302 <jarfolder path="your_jars" /> | |
| 303 </extra-jars> | |
| 304 </package-helper> --> | |
| 305 <macrodef name="package-helper"> | |
| 306 <element name="extra-jars" optional="yes" /> | |
| 307 <sequential> | |
| 308 <apkbuilder | |
| 309 outfolder="${out.absolute.dir}" | |
| 310 resourcefile="${resource.package.file.name}" | |
| 311 apkfilepath="${out.packaged.file}" | |
| 312 debugpackaging="${build.is.packaging.debug}" | |
| 313 debugsigning="${build.is.signing.debug}" | |
| 314 verbose="${verbose}" | |
| 315 hascode="${manifest.hasCode}" | |
| 316 previousBuildType="${build.last.is.packaging.debug}/${build. last.is.signing.debug}" | |
| 317 buildType="${build.is.packaging.debug}/${build.is.signing.de bug}"> | |
| 318 <dex path="${intermediate.dex.file}"/> | |
| 319 <sourcefolder path="${source.absolute.dir}"/> | |
| 320 <jarfile refid="project.all.jars.path" /> | |
| 321 <nativefolder path="${native.libs.absolute.dir}" /> | |
| 322 <nativefolder refid="project.library.native.folder.path" /> | |
| 323 <extra-jars/> | |
| 324 </apkbuilder> | |
| 325 </sequential> | |
| 326 </macrodef> | |
| 327 | |
| 328 <!-- This is macro which zipaligns in.package and outputs it to out.package. Used by targets | |
| 329 debug, -debug-with-emma and release.--> | |
| 330 <macrodef name="zipalign-helper"> | |
| 331 <attribute name="in.package" /> | |
| 332 <attribute name="out.package" /> | |
| 333 <sequential> | |
| 334 <zipalign | |
| 335 executable="${zipalign}" | |
| 336 input="@{in.package}" | |
| 337 output="@{out.package}" | |
| 338 verbose="${verbose}" /> | |
| 339 </sequential> | |
| 340 </macrodef> | |
| 341 | |
| 342 <macrodef name="run-tests-helper"> | |
| 343 <attribute name="emma.enabled" default="false" /> | |
| 344 <element name="extra-instrument-args" optional="yes" /> | |
| 345 <sequential> | |
| 346 <echo level="info">Running tests ...</echo> | |
| 347 <exec executable="${adb}" failonerror="true"> | |
| 348 <arg line="${adb.device.arg}" /> | |
| 349 <arg value="shell" /> | |
| 350 <arg value="am" /> | |
| 351 <arg value="instrument" /> | |
| 352 <arg value="-w" /> | |
| 353 <arg value="-e" /> | |
| 354 <arg value="coverage" /> | |
| 355 <arg value="@{emma.enabled}" /> | |
| 356 <extra-instrument-args /> | |
| 357 <arg value="${project.app.package}/${test.runner}" /> | |
| 358 </exec> | |
| 359 </sequential> | |
| 360 </macrodef> | |
| 361 | |
| 362 <macrodef name="record-build-key"> | |
| 363 <attribute name="key" default="false" /> | |
| 364 <attribute name="value" default="false" /> | |
| 365 <sequential> | |
| 366 <propertyfile file="${out.build.prop.file}" comment="Last build type "> | |
| 367 <entry key="@{key}" value="@{value}"/> | |
| 368 </propertyfile> | |
| 369 </sequential> | |
| 370 </macrodef> | |
| 371 | |
| 372 <macrodef name="record-build-info"> | |
| 373 <sequential> | |
| 374 <record-build-key key="build.last.target" value="${build.target}" /> | |
| 375 <record-build-key key="build.last.is.instrumented" value="${build.is .instrumented}" /> | |
| 376 <record-build-key key="build.last.is.packaging.debug" value="${build .is.packaging.debug}" /> | |
| 377 <record-build-key key="build.last.is.signing.debug" value="${build.i s.signing.debug}" /> | |
| 378 </sequential> | |
| 379 </macrodef> | |
| 380 | |
| 381 <macrodef name="uninstall-helper"> | |
| 382 <attribute name="app.package" default="false" /> | |
| 383 <sequential> | |
| 384 <echo level="info">Uninstalling @{app.package} from the default emul ator or device...</echo> | |
| 385 <exec executable="${adb}" failonerror="true"> | |
| 386 <arg line="${adb.device.arg}" /> | |
| 387 <arg value="uninstall" /> | |
| 388 <arg value="@{app.package}" /> | |
| 389 </exec> | |
| 390 </sequential> | |
| 391 </macrodef> | |
| 392 | |
| 393 <!-- ******************************************************* --> | |
| 394 <!-- ******************** Build Targets ******************** --> | |
| 395 <!-- ******************************************************* --> | |
| 396 | |
| 397 <!-- Basic Ant + SDK check --> | |
| 398 <target name="-check-env"> | |
| 399 <checkenv /> | |
| 400 </target> | |
| 401 | |
| 402 <!-- target to disable building dependencies --> | |
| 403 <target name="nodeps"> | |
| 404 <property name="dont.do.deps" value="true" /> | |
| 405 </target> | |
| 406 | |
| 407 <!-- generic setup --> | |
| 408 <target name="-setup" depends="-check-env"> | |
| 409 <echo level="info">Project Name: ${ant.project.name}</echo> | |
| 410 <gettype projectTypeOut="project.type" /> | |
| 411 | |
| 412 <!-- sets a few boolean based on project.type | |
| 413 to make the if task easier --> | |
| 414 <condition property="project.is.library" value="true" else="false"> | |
| 415 <equals arg1="${project.type}" arg2="library" /> | |
| 416 </condition> | |
| 417 <condition property="project.is.test" value="true" else="false"> | |
| 418 <equals arg1="${project.type}" arg2="test" /> | |
| 419 </condition> | |
| 420 <condition property="project.is.testapp" value="true" else="false"> | |
| 421 <equals arg1="${project.type}" arg2="test-app" /> | |
| 422 </condition> | |
| 423 | |
| 424 <!-- If a test project, resolve absolute path to tested project. --> | |
| 425 <if condition="${project.is.test}"> | |
| 426 <then> | |
| 427 <property name="tested.project.absolute.dir" location="${tested. project.dir}" /> | |
| 428 </then> | |
| 429 </if> | |
| 430 | |
| 431 <!-- get the project manifest package --> | |
| 432 <xpath input="${manifest.abs.file}" | |
| 433 expression="/manifest/@package" output="project.app.package" /> | |
| 434 | |
| 435 </target> | |
| 436 | |
| 437 <!-- empty default pre-clean target. Create a similar target in | |
| 438 your build.xml and it'll be called instead of this one. --> | |
| 439 <target name="-pre-clean"/> | |
| 440 | |
| 441 <!-- clean target --> | |
| 442 <target name="clean" depends="-setup, -pre-clean" | |
| 443 description="Removes output files created by other targets."> | |
| 444 <delete dir="${out.absolute.dir}" verbose="${verbose}" /> | |
| 445 <delete dir="${gen.absolute.dir}" verbose="${verbose}" /> | |
| 446 | |
| 447 <!-- if we know about a tested project or libraries, we clean them too. --> | |
| 448 <if condition="${project.is.test}"> | |
| 449 <then> | |
| 450 <property name="tested.project.absolute.dir" location="${tested. project.dir}" /> | |
| 451 <subant failonerror="true"> | |
| 452 <fileset dir="${tested.project.absolute.dir}" includes="buil d.xml" /> | |
| 453 <target name="clean" /> | |
| 454 </subant> | |
| 455 </then> | |
| 456 </if> | |
| 457 | |
| 458 <!-- get all the libraries --> | |
| 459 <if> | |
| 460 <condition><not><isset property="dont.do.deps" /></not></condition> | |
| 461 <then> | |
| 462 <getlibpath libraryFolderPathOut="project.library.folder.path" / > | |
| 463 <if> | |
| 464 <condition> | |
| 465 <isreference refid="project.library.folder.path" /> | |
| 466 </condition> | |
| 467 <then> | |
| 468 <!-- clean the libraries with nodeps since we already | |
| 469 know about all the libraries even the indirect one --> | |
| 470 <subant | |
| 471 buildpathref="project.library.folder.path" | |
| 472 antfile="build.xml" | |
| 473 failonerror="true"> | |
| 474 <target name="nodeps" /> | |
| 475 <target name="clean" /> | |
| 476 </subant> | |
| 477 </then> | |
| 478 </if> | |
| 479 </then> | |
| 480 </if> | |
| 481 </target> | |
| 482 | |
| 483 <!-- Pre build setup --> | |
| 484 <target name="-build-setup" depends="-setup"> | |
| 485 | |
| 486 <!-- read the previous build mode --> | |
| 487 <property file="${out.build.prop.file}" /> | |
| 488 <!-- if empty the props won't be set, meaning it's a new build. | |
| 489 To force a build, set the prop to empty values. --> | |
| 490 <property name="build.last.target" value="" /> | |
| 491 <property name="build.last.is.instrumented" value="" /> | |
| 492 <property name="build.last.is.packaging.debug" value="" /> | |
| 493 <property name="build.last.is.signing.debug" value="" /> | |
| 494 | |
| 495 <!-- If the "debug" build type changed, clear out the compiled code. | |
| 496 This is to make sure the new BuildConfig.DEBUG value is picked up | |
| 497 as javac can't deal with this type of change in its dependency comp utation. --> | |
| 498 <if> | |
| 499 <condition> | |
| 500 <and> | |
| 501 <length string="${build.last.is.packaging.debug}" trim="true " when="greater" length="0" /> | |
| 502 <not><equals | |
| 503 arg1="${build.is.packaging.debug}" | |
| 504 arg2="${build.last.is.packaging.debug}" /></not> | |
| 505 </and> | |
| 506 </condition> | |
| 507 <then> | |
| 508 <echo level="info">Switching between debug and non debug build: Deleting previous compilation output...</echo> | |
| 509 <delete dir="${out.classes.absolute.dir}" verbose="${verbose}" / > | |
| 510 </then> | |
| 511 <else> | |
| 512 <!-- Else, we may still need to clean the code, for another reas on. | |
| 513 special case for instrumented: if the previous build was | |
| 514 instrumented but not this one, clear out the compiled code --> | |
| 515 <if> | |
| 516 <condition> | |
| 517 <and> | |
| 518 <istrue value="${build.last.is.instrumented}" /> | |
| 519 <isfalse value="${build.is.instrumented}" /> | |
| 520 </and> | |
| 521 </condition> | |
| 522 <then> | |
| 523 <echo level="info">Switching from instrumented to non-in strumented build: Deleting previous compilation output...</echo> | |
| 524 <delete dir="${out.classes.absolute.dir}" verbose="${ver bose}" /> | |
| 525 </then> | |
| 526 </if> | |
| 527 </else> | |
| 528 </if> | |
| 529 | |
| 530 <echo level="info">Resolving Build Target for ${ant.project.name}...</ec ho> | |
| 531 <!-- load project properties, resolve Android target, library dependenci es | |
| 532 and set some properties with the results. | |
| 533 All property names are passed as parameters ending in -Out --> | |
| 534 <gettarget | |
| 535 androidJarFileOut="project.target.android.jar" | |
| 536 androidAidlFileOut="project.target.framework.aidl" | |
| 537 bootClassPathOut="project.target.class.path" | |
| 538 targetApiOut="project.target.apilevel" | |
| 539 minSdkVersionOut="project.minSdkVersion" /> | |
| 540 | |
| 541 <!-- Value of the hasCode attribute (Application node) extracted from ma nifest file --> | |
| 542 <xpath input="${manifest.abs.file}" expression="/manifest/application/@a ndroid:hasCode" | |
| 543 output="manifest.hasCode" default="true"/> | |
| 544 | |
| 545 <echo level="info">----------</echo> | |
| 546 <echo level="info">Creating output directories if needed...</echo> | |
| 547 <mkdir dir="${resource.absolute.dir}" /> | |
| 548 <mkdir dir="${jar.libs.absolute.dir}" /> | |
| 549 <mkdir dir="${out.absolute.dir}" /> | |
| 550 <mkdir dir="${out.res.absolute.dir}" /> | |
| 551 <do-only-if-manifest-hasCode> | |
| 552 <mkdir dir="${gen.absolute.dir}" /> | |
| 553 <mkdir dir="${out.classes.absolute.dir}" /> | |
| 554 <mkdir dir="${out.dexed.absolute.dir}" /> | |
| 555 </do-only-if-manifest-hasCode> | |
| 556 | |
| 557 <echo level="info">----------</echo> | |
| 558 <echo level="info">Resolving Dependencies for ${ant.project.name}...</ec ho> | |
| 559 <dependency | |
| 560 libraryFolderPathOut="project.library.folder.path" | |
| 561 libraryPackagesOut="project.library.packages" | |
| 562 libraryManifestFilePathOut="project.library.manifest.file.path" | |
| 563 libraryResFolderPathOut="project.library.res.folder.path" | |
| 564 libraryBinAidlFolderPathOut="project.library.bin.aidl.folder.pat h" | |
| 565 libraryRFilePathOut="project.library.bin.r.file.path" | |
| 566 libraryNativeFolderPathOut="project.library.native.folder.path" | |
| 567 jarLibraryPathOut="project.all.jars.path" | |
| 568 targetApi="${project.target.apilevel}" | |
| 569 verbose="${verbose}" /> | |
| 570 | |
| 571 <!-- compile the libraries if any --> | |
| 572 <if> | |
| 573 <condition> | |
| 574 <and> | |
| 575 <isreference refid="project.library.folder.path" /> | |
| 576 <not><isset property="dont.do.deps" /></not> | |
| 577 </and> | |
| 578 </condition> | |
| 579 <then> | |
| 580 <!-- figure out which target must be used to build the library p rojects. | |
| 581 If emma is enabled, then use 'instrument' otherwise, use 'd ebug' --> | |
| 582 <condition property="project.libraries.target" value="instrument " else="${build.target}"> | |
| 583 <istrue value="${build.is.instrumented}" /> | |
| 584 </condition> | |
| 585 | |
| 586 <echo level="info">----------</echo> | |
| 587 <echo level="info">Building Libraries with '${project.libraries. target}'...</echo> | |
| 588 | |
| 589 <!-- no need to build the deps as we have already | |
| 590 the full list of libraries --> | |
| 591 <subant failonerror="true" | |
| 592 buildpathref="project.library.folder.path" | |
| 593 antfile="build.xml"> | |
| 594 <target name="nodeps" /> | |
| 595 <target name="${project.libraries.target}" /> | |
| 596 <property name="emma.coverage.absolute.file" location="${out .absolute.dir}/coverage.em" /> | |
| 597 </subant> | |
| 598 </then> | |
| 599 </if> | |
| 600 | |
| 601 <!-- compile the main project if this is a test project --> | |
| 602 <if condition="${project.is.test}"> | |
| 603 <then> | |
| 604 <!-- figure out which target must be used to build the tested pr oject. | |
| 605 If emma is enabled, then use 'instrument' otherwise, use 'd ebug' --> | |
| 606 <condition property="tested.project.target" value="instrument" e lse="debug"> | |
| 607 <isset property="emma.enabled" /> | |
| 608 </condition> | |
| 609 | |
| 610 <echo level="info">----------</echo> | |
| 611 <echo level="info">Building tested project at ${tested.project.a bsolute.dir} with '${tested.project.target}'...</echo> | |
| 612 <subant target="${tested.project.target}" failonerror="true"> | |
| 613 <fileset dir="${tested.project.absolute.dir}" includes="buil d.xml" /> | |
| 614 </subant> | |
| 615 | |
| 616 <!-- get the tested project full classpath to be able to build | |
| 617 the test project --> | |
| 618 <testedprojectclasspath | |
| 619 projectLocation="${tested.project.absolute.dir}" | |
| 620 projectClassPathOut="tested.project.classpath"/> | |
| 621 </then> | |
| 622 <else> | |
| 623 <!-- no tested project, make an empty Path object so that javac doesn't | |
| 624 complain --> | |
| 625 <path id="tested.project.classpath" /> | |
| 626 </else> | |
| 627 </if> | |
| 628 </target> | |
| 629 | |
| 630 <!-- empty default pre-build target. Create a similar target in | |
| 631 your build.xml and it'll be called instead of this one. --> | |
| 632 <target name="-pre-build"/> | |
| 633 | |
| 634 <!-- Code Generation: compile resources (aapt -> R.java), aidl, renderscript --> | |
| 635 <target name="-code-gen"> | |
| 636 <!-- always merge manifest --> | |
| 637 <mergemanifest | |
| 638 appManifest="${manifest.abs.file}" | |
| 639 outManifest="${out.manifest.abs.file}" | |
| 640 enabled="${manifestmerger.enabled}"> | |
| 641 <library refid="project.library.manifest.file.path" /> | |
| 642 </mergemanifest> | |
| 643 | |
| 644 <do-only-if-manifest-hasCode | |
| 645 elseText="hasCode = false. Skipping aidl/renderscript/R.java"> | |
| 646 <echo level="info">Handling aidl files...</echo> | |
| 647 <aidl executable="${aidl}" | |
| 648 framework="${project.target.framework.aidl}" | |
| 649 libraryBinAidlFolderPathRefid="project.library.bin.aidl.fold er.path" | |
| 650 genFolder="${gen.absolute.dir}" | |
| 651 aidlOutFolder="${out.aidl.absolute.dir}"> | |
| 652 <source path="${source.absolute.dir}"/> | |
| 653 </aidl> | |
| 654 | |
| 655 <!-- renderscript generates resources so it must be called before aa pt --> | |
| 656 <echo level="info">----------</echo> | |
| 657 <echo level="info">Handling RenderScript files...</echo> | |
| 658 <renderscript executable="${renderscript}" | |
| 659 includePathRefId="android.renderscript.include.path" | |
| 660 genFolder="${gen.absolute.dir}" | |
| 661 resFolder="${out.res.absolute.dir}/raw" | |
| 662 targetApi="${project.minSdkVersion}" | |
| 663 optLevel="${renderscript.opt.level}" | |
| 664 buildType="${build.is.packaging.debug}" | |
| 665 previousBuildType="${build.last.is.packaging.debug}"> | |
| 666 <source path="${source.absolute.dir}"/> | |
| 667 </renderscript> | |
| 668 | |
| 669 <echo level="info">----------</echo> | |
| 670 <echo level="info">Handling Resources...</echo> | |
| 671 <aapt executable="${aapt}" | |
| 672 command="package" | |
| 673 verbose="${verbose}" | |
| 674 manifest="${out.manifest.abs.file}" | |
| 675 androidjar="${project.target.android.jar}" | |
| 676 rfolder="${gen.absolute.dir}" | |
| 677 nonConstantId="${android.library}" | |
| 678 libraryResFolderPathRefid="project.library.res.folder.path" | |
| 679 libraryPackagesRefid="project.library.packages" | |
| 680 libraryRFileRefid="project.library.bin.r.file.path" | |
| 681 ignoreAssets="${aapt.ignore.assets}" | |
| 682 binFolder="${out.absolute.dir}" | |
| 683 proguardFile="${out.absolute.dir}/proguard.txt"> | |
| 684 <res path="${out.res.absolute.dir}" /> | |
| 685 <res path="${resource.absolute.dir}" /> | |
| 686 </aapt> | |
| 687 | |
| 688 <echo level="info">----------</echo> | |
| 689 <echo level="info">Handling BuildConfig class...</echo> | |
| 690 <buildconfig | |
| 691 genFolder="${gen.absolute.dir}" | |
| 692 package="${project.app.package}" | |
| 693 buildType="${build.is.packaging.debug}" | |
| 694 previousBuildType="${build.last.is.packaging.debug}"/> | |
| 695 | |
| 696 </do-only-if-manifest-hasCode> | |
| 697 </target> | |
| 698 | |
| 699 <!-- empty default pre-compile target. Create a similar target in | |
| 700 your build.xml and it'll be called instead of this one. --> | |
| 701 <target name="-pre-compile"/> | |
|
Yaron
2013/03/11 23:32:19
We don't delete all class files anymore cause Newt
Yaron
2013/03/11 23:33:17
nvm. I missed it.
| |
| 702 | |
| 703 <!-- Compiles this project's .java files into .class files. --> | |
| 704 <target name="-compile" depends="-build-setup, -pre-build, -code-gen, -pre-c ompile"> | |
| 705 <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping..."> | |
| 706 <!-- merge the project's own classpath and the tested project's clas spath --> | |
| 707 <path id="project.javac.classpath"> | |
| 708 <path refid="project.all.jars.path" /> | |
| 709 <path refid="tested.project.classpath" /> | |
| 710 </path> | |
| 711 <javac encoding="${java.encoding}" | |
| 712 source="${java.source}" target="${java.target}" | |
| 713 debug="true" extdirs="" includeantruntime="false" | |
| 714 destdir="${out.classes.absolute.dir}" | |
| 715 bootclasspathref="project.target.class.path" | |
| 716 verbose="${verbose}" | |
| 717 classpathref="project.javac.classpath" | |
| 718 fork="${need.javac.fork}"> | |
| 719 <src path="${source.absolute.dir}" /> | |
| 720 <src path="${gen.absolute.dir}" /> | |
| 721 <compilerarg line="${java.compilerargs}" /> | |
| 722 </javac> | |
| 723 | |
| 724 <!-- if the project is instrumented, intrument the classes --> | |
| 725 <if condition="${build.is.instrumented}"> | |
| 726 <then> | |
| 727 <echo level="info">Instrumenting classes from ${out.absolute .dir}/classes...</echo> | |
| 728 | |
| 729 <!-- build the filter to remove R, Manifest, BuildConfig --> | |
| 730 <getemmafilter | |
| 731 appPackage="${project.app.package}" | |
| 732 libraryPackagesRefId="project.library.packages" | |
| 733 filterOut="emma.default.filter"/> | |
| 734 | |
| 735 <!-- define where the .em file is going. This may have been | |
| 736 setup already if this is a library --> | |
| 737 <property name="emma.coverage.absolute.file" location="${out .absolute.dir}/coverage.em" /> | |
| 738 | |
| 739 <!-- It only instruments class files, not any external libs --> | |
| 740 <emma enabled="true"> | |
| 741 <instr verbosity="${verbosity}" | |
| 742 mode="overwrite" | |
| 743 instrpath="${out.absolute.dir}/classes" | |
| 744 outdir="${out.absolute.dir}/classes" | |
| 745 metadatafile="${emma.coverage.absolute.file}"> | |
| 746 <filter excludes="${emma.default.filter}" /> | |
| 747 <filter value="${emma.filter}" /> | |
| 748 </instr> | |
| 749 </emma> | |
| 750 </then> | |
| 751 </if> | |
| 752 | |
| 753 <!-- if the project is a library then we generate a jar file --> | |
| 754 <if condition="${project.is.library}"> | |
| 755 <then> | |
| 756 <echo level="info">Creating library output jar file...</echo > | |
| 757 <property name="out.library.jar.file" location="${out.absolu te.dir}/classes.jar" /> | |
| 758 <if> | |
| 759 <condition> | |
| 760 <length string="${android.package.excludes}" trim="t rue" when="greater" length="0" /> | |
| 761 </condition> | |
| 762 <then> | |
| 763 <echo level="info">Custom jar packaging exclusion: $ {android.package.excludes}</echo> | |
| 764 </then> | |
| 765 </if> | |
| 766 | |
| 767 <propertybyreplace name="project.app.package.path" input="${ project.app.package}" replace="." with="/" /> | |
| 768 | |
| 769 <jar destfile="${out.library.jar.file}"> | |
| 770 <fileset dir="${out.classes.absolute.dir}" | |
| 771 includes="**/*.class" | |
| 772 excludes="${project.app.package.path}/R.class ${ project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.clas s"/> | |
| 773 <fileset dir="${source.absolute.dir}" excludes="**/*.jav a ${android.package.excludes}" /> | |
| 774 </jar> | |
| 775 </then> | |
| 776 </if> | |
| 777 | |
| 778 </do-only-if-manifest-hasCode> | |
| 779 </target> | |
| 780 | |
| 781 <!-- empty default post-compile target. Create a similar target in | |
| 782 your build.xml and it'll be called instead of this one. --> | |
| 783 <target name="-post-compile"/> | |
| 784 | |
| 785 <!-- Obfuscate target | |
| 786 This is only active in release builds when proguard.config is defined | |
| 787 in default.properties. | |
| 788 | |
| 789 To replace Proguard with a different obfuscation engine: | |
| 790 Override the following targets in your build.xml, before the call to <se tup> | |
| 791 -release-obfuscation-check | |
| 792 Check whether obfuscation should happen, and put the result in a property. | |
| 793 -debug-obfuscation-check | |
| 794 Obfuscation should not happen. Set the same property to false. | |
| 795 -obfuscate | |
| 796 check if the property set in -debug/release-obfuscation-check is set to true. | |
| 797 If true: | |
| 798 Perform obfuscation | |
| 799 Set property out.dex.input.absolute.dir to be the output of the obfuscation | |
| 800 --> | |
| 801 <target name="-obfuscate"> | |
| 802 <if condition="${proguard.enabled}"> | |
| 803 <then> | |
| 804 <property name="obfuscate.absolute.dir" location="${out.absolute .dir}/proguard" /> | |
| 805 <property name="preobfuscate.jar.file" value="${obfuscate.absolu te.dir}/original.jar" /> | |
| 806 <property name="obfuscated.jar.file" value="${obfuscate.absolute .dir}/obfuscated.jar" /> | |
| 807 <!-- input for dex will be proguard's output --> | |
| 808 <property name="out.dex.input.absolute.dir" value="${obfuscated. jar.file}" /> | |
| 809 | |
| 810 <!-- Add Proguard Tasks --> | |
| 811 <property name="proguard.jar" location="${android.tools.dir}/pro guard/lib/proguard.jar" /> | |
| 812 <taskdef name="proguard" classname="proguard.ant.ProGuardTask" c lasspath="${proguard.jar}" /> | |
| 813 | |
| 814 <!-- Set the android classpath Path object into a single propert y. It'll be | |
| 815 all the jar files separated by a platform path-separator. | |
| 816 Each path must be quoted if it contains spaces. | |
| 817 --> | |
| 818 <pathconvert property="project.target.classpath.value" refid="pr oject.target.class.path"> | |
| 819 <firstmatchmapper> | |
| 820 <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/> | |
| 821 <identitymapper/> | |
| 822 </firstmatchmapper> | |
| 823 </pathconvert> | |
| 824 | |
| 825 <!-- Build a path object with all the jar files that must be obf uscated. | |
| 826 This include the project compiled source code and any 3rd p arty jar | |
| 827 files. --> | |
| 828 <path id="project.all.classes.path"> | |
| 829 <pathelement location="${preobfuscate.jar.file}" /> | |
| 830 <path refid="project.all.jars.path" /> | |
| 831 </path> | |
| 832 <!-- Set the project jar files Path object into a single propert y. It'll be | |
| 833 all the jar files separated by a platform path-separator. | |
| 834 Each path must be quoted if it contains spaces. | |
| 835 --> | |
| 836 <pathconvert property="project.all.classes.value" refid="project .all.classes.path"> | |
| 837 <firstmatchmapper> | |
| 838 <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/> | |
| 839 <identitymapper/> | |
| 840 </firstmatchmapper> | |
| 841 </pathconvert> | |
| 842 | |
| 843 <!-- Turn the path property ${proguard.config} from an A:B:C pro perty | |
| 844 into a series of includes: -include A -include B -include C | |
| 845 suitable for processing by the ProGuard task. Note - this d oes | |
| 846 not include the leading '-include "' or the closing '"'; th ose | |
| 847 are added under the <proguard> call below. | |
| 848 --> | |
| 849 <path id="proguard.configpath"> | |
| 850 <pathelement path="${proguard.config}"/> | |
| 851 </path> | |
| 852 <pathconvert pathsep='" -include "' property="proguard.configcmd " refid="proguard.configpath"/> | |
| 853 | |
| 854 <mkdir dir="${obfuscate.absolute.dir}" /> | |
| 855 <delete file="${preobfuscate.jar.file}"/> | |
| 856 <delete file="${obfuscated.jar.file}"/> | |
| 857 <jar basedir="${out.classes.absolute.dir}" | |
| 858 destfile="${preobfuscate.jar.file}" /> | |
| 859 <proguard> | |
| 860 -include "${proguard.configcmd}" | |
| 861 -include "${out.absolute.dir}/proguard.txt" | |
| 862 -injars ${project.all.classes.value} | |
| 863 -outjars "${obfuscated.jar.file}" | |
| 864 -libraryjars ${project.target.classpath.value} | |
| 865 -dump "${obfuscate.absolute.dir}/dump.txt" | |
| 866 -printseeds "${obfuscate.absolute.dir}/seeds.txt" | |
| 867 -printusage "${obfuscate.absolute.dir}/usage.txt" | |
| 868 -printmapping "${obfuscate.absolute.dir}/mapping.txt" | |
| 869 </proguard> | |
| 870 </then> | |
| 871 </if> | |
| 872 </target> | |
| 873 | |
| 874 <!-- Converts this project's .class files into .dex files --> | |
| 875 <target name="-dex" depends="-compile, -post-compile, -obfuscate"> | |
| 876 <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping..."> | |
| 877 <!-- only convert to dalvik bytecode is *not* a library --> | |
| 878 <do-only-if-not-library elseText="Library project: do not convert by tecode..." > | |
| 879 <!-- special case for instrumented builds: need to use no-locals and need | |
| 880 to pass in the emma jar. --> | |
| 881 <if condition="${build.is.instrumented}"> | |
| 882 <then> | |
| 883 <dex-helper nolocals="true"> | |
| 884 <external-libs> | |
| 885 <fileset file="${emma.dir}/emma_device.jar" /> | |
| 886 </external-libs> | |
| 887 </dex-helper> | |
| 888 </then> | |
| 889 <else> | |
| 890 <dex-helper /> | |
| 891 </else> | |
| 892 </if> | |
| 893 </do-only-if-not-library> | |
| 894 </do-only-if-manifest-hasCode> | |
| 895 </target> | |
| 896 | |
| 897 <!-- Updates the pre-processed PNG cache --> | |
| 898 <target name="-crunch"> | |
| 899 <exec executable="${aapt}" taskName="crunch"> | |
| 900 <arg value="crunch" /> | |
| 901 <arg value="-v" /> | |
| 902 <arg value="-S" /> | |
| 903 <arg path="${resource.absolute.dir}" /> | |
| 904 <arg value="-C" /> | |
| 905 <arg path="${out.res.absolute.dir}" /> | |
| 906 </exec> | |
| 907 </target> | |
| 908 | |
| 909 <!-- Puts the project's resources into the output package file | |
| 910 This actually can create multiple resource package in case | |
| 911 Some custom apk with specific configuration have been | |
| 912 declared in default.properties. | |
| 913 --> | |
| 914 <target name="-package-resources" depends="-crunch"> | |
| 915 <!-- only package resources if *not* a library project --> | |
| 916 <do-only-if-not-library elseText="Library project: do not package resour ces..." > | |
| 917 <aapt executable="${aapt}" | |
| 918 command="package" | |
| 919 versioncode="${version.code}" | |
| 920 versionname="${version.name}" | |
| 921 debug="${build.is.packaging.debug}" | |
| 922 manifest="${out.manifest.abs.file}" | |
| 923 assets="${asset.absolute.dir}" | |
| 924 androidjar="${project.target.android.jar}" | |
| 925 apkfolder="${out.absolute.dir}" | |
| 926 nocrunch="${build.packaging.nocrunch}" | |
| 927 resourcefilename="${resource.package.file.name}" | |
| 928 resourcefilter="${aapt.resource.filter}" | |
| 929 libraryResFolderPathRefid="project.library.res.folder.path" | |
| 930 libraryPackagesRefid="project.library.packages" | |
| 931 libraryRFileRefid="project.library.bin.r.file.path" | |
| 932 previousBuildType="${build.last.target}" | |
| 933 buildType="${build.target}" | |
| 934 ignoreAssets="${aapt.ignore.assets}"> | |
| 935 <res path="${out.res.absolute.dir}" /> | |
| 936 <res path="${resource.absolute.dir}" /> | |
| 937 <!-- <nocompress /> forces no compression on any files in assets or res/raw --> | |
| 938 <!-- <nocompress extension="xml" /> forces no compression on spe cific file extensions in assets and res/raw --> | |
| 939 </aapt> | |
| 940 </do-only-if-not-library> | |
| 941 </target> | |
| 942 | |
| 943 <!-- Packages the application. --> | |
| 944 <target name="-package" depends="-dex, -package-resources"> | |
| 945 <!-- only package apk if *not* a library project --> | |
| 946 <do-only-if-not-library elseText="Library project: do not package apk... " > | |
| 947 <if condition="${build.is.instrumented}"> | |
| 948 <then> | |
| 949 <package-helper> | |
| 950 <extra-jars> | |
| 951 <!-- Injected from external file --> | |
| 952 <jarfile path="${emma.dir}/emma_device.jar" /> | |
| 953 </extra-jars> | |
| 954 </package-helper> | |
| 955 </then> | |
| 956 <else> | |
| 957 <package-helper /> | |
| 958 </else> | |
| 959 </if> | |
| 960 </do-only-if-not-library> | |
| 961 </target> | |
| 962 | |
| 963 <target name="-post-package" /> | |
| 964 <target name="-post-build" /> | |
| 965 | |
| 966 <target name="-set-mode-check"> | |
| 967 <fail if="build.is.mode.set" | |
| 968 message="Cannot run two different modes at the same time. If you are running more than one debug/release/instrument type targets, call them from different Ant calls." /> | |
| 969 </target> | |
| 970 | |
| 971 <!-- ******************************************************* --> | |
| 972 <!-- **************** Debug specific targets *************** --> | |
| 973 <!-- ******************************************************* --> | |
| 974 | |
| 975 <target name="-set-debug-files" depends="-set-mode-check"> | |
| 976 | |
| 977 <property name="out.packaged.file" location="${out.absolute.dir}/${ant.p roject.name}-debug-unaligned.apk" /> | |
| 978 <property name="out.final.file" location="${out.absolute.dir}/${ant.proj ect.name}-debug.apk" /> | |
| 979 <property name="build.is.mode.set" value="true" /> | |
| 980 </target> | |
| 981 | |
| 982 | |
| 983 <target name="-set-debug-mode" depends="-setup"> | |
| 984 <!-- record the current build target --> | |
| 985 <property name="build.target" value="debug" /> | |
| 986 | |
| 987 <if> | |
| 988 <condition> | |
| 989 <and> | |
| 990 <istrue value="${project.is.testapp}" /> | |
| 991 <istrue value="${emma.enabled}" /> | |
| 992 </and> | |
| 993 </condition> | |
| 994 <then> | |
| 995 <property name="build.is.instrumented" value="true" /> | |
| 996 </then> | |
| 997 <else> | |
| 998 <property name="build.is.instrumented" value="false" /> | |
| 999 </else> | |
| 1000 </if> | |
| 1001 | |
| 1002 <!-- whether the build is a debug build. always set. --> | |
| 1003 <property name="build.is.packaging.debug" value="true" /> | |
| 1004 | |
| 1005 <!-- signing mode: debug --> | |
| 1006 <property name="build.is.signing.debug" value="true" /> | |
| 1007 | |
| 1008 <!-- Renderscript optimization level: none --> | |
| 1009 <property name="renderscript.opt.level" value="${renderscript.debug.opt. level}" /> | |
| 1010 | |
| 1011 </target> | |
| 1012 | |
| 1013 <target name="-debug-obfuscation-check"> | |
| 1014 <!-- proguard is never enabled in debug mode --> | |
| 1015 <property name="proguard.enabled" value="false"/> | |
| 1016 </target> | |
| 1017 | |
| 1018 <!-- Builds debug output package --> | |
| 1019 <target name="-do-debug" depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package"> | |
| 1020 <!-- only create apk if *not* a library project --> | |
| 1021 <do-only-if-not-library elseText="Library project: do not create apk..." > | |
| 1022 <sequential> | |
| 1023 <zipalign-helper in.package="${out.packaged.file}" out.package=" ${out.final.file}" /> | |
| 1024 <echo level="info">Debug Package: ${out.final.file}</echo> | |
| 1025 </sequential> | |
| 1026 </do-only-if-not-library> | |
| 1027 <record-build-info /> | |
| 1028 </target> | |
| 1029 | |
| 1030 <!-- Builds debug output package --> | |
| 1031 <target name="debug" depends="-set-debug-files, -do-debug, -post-build" | |
| 1032 description="Builds the application and signs it with a debug ke y."> | |
| 1033 </target> | |
| 1034 | |
| 1035 | |
| 1036 <!-- ******************************************************* --> | |
| 1037 <!-- *************** Release specific targets ************** --> | |
| 1038 <!-- ******************************************************* --> | |
| 1039 | |
| 1040 <!-- called through target 'release'. Only executed if the keystore and | |
| 1041 key alias are known but not their password. --> | |
| 1042 <target name="-release-prompt-for-password" if="has.keystore" unless="has.pa ssword"> | |
| 1043 <!-- Gets passwords --> | |
| 1044 <input | |
| 1045 message="Please enter keystore password (store:${key.store}):" | |
| 1046 addproperty="key.store.password" /> | |
| 1047 <input | |
| 1048 message="Please enter password for alias '${key.alias}':" | |
| 1049 addproperty="key.alias.password" /> | |
| 1050 </target> | |
| 1051 | |
| 1052 <!-- called through target 'release'. Only executed if there's no | |
| 1053 keystore/key alias set --> | |
| 1054 <target name="-release-nosign" unless="has.keystore"> | |
| 1055 <!-- no release builds for library project --> | |
| 1056 <do-only-if-not-library elseText="" > | |
| 1057 <sequential> | |
| 1058 <echo level="info">No key.store and key.alias properties found i n build.properties.</echo> | |
| 1059 <echo level="info">Please sign ${out.packaged.file} manually</ec ho> | |
| 1060 <echo level="info">and run zipalign from the Android SDK tools.< /echo> | |
| 1061 </sequential> | |
| 1062 </do-only-if-not-library> | |
| 1063 <record-build-info /> | |
| 1064 </target> | |
| 1065 | |
| 1066 <target name="-release-obfuscation-check"> | |
| 1067 <echo level="info">proguard.config is ${proguard.config}</echo> | |
| 1068 <condition property="proguard.enabled" value="true" else="false"> | |
| 1069 <and> | |
| 1070 <isset property="build.is.mode.release" /> | |
| 1071 <isset property="proguard.config" /> | |
| 1072 </and> | |
| 1073 </condition> | |
| 1074 <if condition="${proguard.enabled}"> | |
| 1075 <then> | |
| 1076 <echo level="info">Proguard.config is enabled</echo> | |
| 1077 <!-- Secondary dx input (jar files) is empty since all the | |
| 1078 jar files will be in the obfuscated jar --> | |
| 1079 <path id="out.dex.jar.input.ref" /> | |
| 1080 </then> | |
| 1081 </if> | |
| 1082 </target> | |
| 1083 | |
| 1084 <target name="-set-release-mode" depends="-set-mode-check"> | |
| 1085 <property name="out.packaged.file" location="${out.absolute.dir}/${ant.p roject.name}-release-unsigned.apk" /> | |
| 1086 <property name="out.final.file" location="${out.absolute.dir}/${ant.proj ect.name}-release.apk" /> | |
| 1087 <property name="build.is.mode.set" value="true" /> | |
| 1088 | |
| 1089 <!-- record the current build target --> | |
| 1090 <property name="build.target" value="release" /> | |
| 1091 | |
| 1092 <property name="build.is.instrumented" value="false" /> | |
| 1093 | |
| 1094 <!-- release mode is only valid if the manifest does not explicitly | |
| 1095 set debuggable to true. default is false. --> | |
| 1096 <xpath input="${manifest.abs.file}" expression="/manifest/application/@a ndroid:debuggable" | |
| 1097 output="build.is.packaging.debug" default="false"/> | |
| 1098 | |
| 1099 <!-- signing mode: release --> | |
| 1100 <property name="build.is.signing.debug" value="false" /> | |
| 1101 | |
| 1102 <!-- Renderscript optimization level: aggressive --> | |
| 1103 <property name="renderscript.opt.level" value="${renderscript.release.op t.level}" /> | |
| 1104 | |
| 1105 <if condition="${build.is.packaging.debug}"> | |
| 1106 <then> | |
| 1107 <echo>*************************************************</echo> | |
| 1108 <echo>**** Android Manifest has debuggable=true ****</echo> | |
| 1109 <echo>**** Doing DEBUG packaging with RELEASE keys ****</echo> | |
| 1110 <echo>*************************************************</echo> | |
| 1111 </then> | |
| 1112 <else> | |
| 1113 <!-- property only set in release mode. | |
| 1114 Useful for if/unless attributes in target node | |
| 1115 when using Ant before 1.8 --> | |
| 1116 <property name="build.is.mode.release" value="true"/> | |
| 1117 </else> | |
| 1118 </if> | |
| 1119 </target> | |
| 1120 | |
| 1121 <target name="-release-sign" if="has.keystore" > | |
| 1122 <!-- only create apk if *not* a library project --> | |
| 1123 <do-only-if-not-library elseText="Library project: do not create apk..." > | |
| 1124 <sequential> | |
| 1125 <property name="out.unaligned.file" location="${out.absolute.dir }/${ant.project.name}-release-unaligned.apk" /> | |
| 1126 | |
| 1127 <!-- Signs the APK --> | |
| 1128 <echo level="info">Signing final apk...</echo> | |
| 1129 <signapk | |
| 1130 input="${out.packaged.file}" | |
| 1131 output="${out.unaligned.file}" | |
| 1132 keystore="${key.store}" | |
| 1133 storepass="${key.store.password}" | |
| 1134 alias="${key.alias}" | |
| 1135 keypass="${key.alias.password}"/> | |
| 1136 | |
| 1137 <!-- Zip aligns the APK --> | |
| 1138 <zipalign-helper | |
| 1139 in.package="${out.unaligned.file}" | |
| 1140 out.package="${out.final.file}" /> | |
| 1141 <echo level="info">Release Package: ${out.final.file}</echo> | |
| 1142 </sequential> | |
| 1143 </do-only-if-not-library> | |
| 1144 <record-build-info /> | |
| 1145 </target> | |
| 1146 | |
| 1147 <!-- This runs -package-release and -release-nosign first and then runs | |
| 1148 only if release-sign is true (set in -release-check, | |
| 1149 called by -release-no-sign)--> | |
| 1150 <target name="release" | |
| 1151 depends="-set-release-mode, -release-obfuscation-check, -package , -post-package, -release-prompt-for-password, -release-nosign, -release-sign, - post-build" | |
| 1152 description="Builds the application in release mode."> | |
| 1153 </target> | |
| 1154 | |
| 1155 <!-- ******************************************************* --> | |
| 1156 <!-- ************ Instrumented specific targets ************ --> | |
| 1157 <!-- ******************************************************* --> | |
| 1158 | |
| 1159 <!-- These targets are specific for the project under test when it | |
| 1160 gets compiled by the test projects in a way that will make it | |
| 1161 support emma code coverage --> | |
| 1162 | |
| 1163 <target name="-set-instrumented-mode" depends="-set-mode-check"> | |
| 1164 <property name="out.packaged.file" location="${out.absolute.dir}/${ant.p roject.name}-instrumented-unaligned.apk" /> | |
| 1165 <property name="out.final.file" location="${out.absolute.dir}/${ant.proj ect.name}-instrumented.apk" /> | |
| 1166 <property name="build.is.mode.set" value="true" /> | |
| 1167 | |
| 1168 <!-- whether the build is an instrumented build. --> | |
| 1169 <property name="build.is.instrumented" value="true" /> | |
| 1170 </target> | |
| 1171 | |
| 1172 <!-- Builds instrumented output package --> | |
| 1173 <target name="instrument" depends="-set-instrumented-mode, -do-debug" | |
| 1174 description="Builds an instrumented packaged."> | |
| 1175 <!-- only create apk if *not* a library project --> | |
| 1176 <do-only-if-not-library elseText="Library project: do not create apk..." > | |
| 1177 <sequential> | |
| 1178 <zipalign-helper in.package="${out.packaged.file}" out.package=" ${out.final.file}" /> | |
| 1179 <echo level="info">Instrumented Package: ${out.final.file}</echo > | |
| 1180 </sequential> | |
| 1181 </do-only-if-not-library> | |
| 1182 <record-build-info /> | |
| 1183 </target> | |
| 1184 | |
| 1185 <!-- ******************************************************* --> | |
| 1186 <!-- ************ Test project specific targets ************ --> | |
| 1187 <!-- ******************************************************* --> | |
| 1188 | |
| 1189 <!-- enable code coverage --> | |
| 1190 <target name="emma"> | |
| 1191 <property name="emma.enabled" value="true" /> | |
| 1192 </target> | |
| 1193 | |
| 1194 <!-- fails if the project is not a test project --> | |
| 1195 <target name="-test-project-check" depends="-setup"> | |
| 1196 <if> | |
| 1197 <condition> | |
| 1198 <and> | |
| 1199 <isfalse value="${project.is.test}" /> | |
| 1200 <isfalse value="${project.is.testapp}" /> | |
| 1201 </and> | |
| 1202 </condition> | |
| 1203 <then> | |
| 1204 <fail message="Project is not a test project." /> | |
| 1205 </then> | |
| 1206 </if> | |
| 1207 </target> | |
| 1208 | |
| 1209 <target name="test" depends="-test-project-check" | |
| 1210 description="Runs tests from the package defined in test.package property"> | |
| 1211 <property name="test.runner" value="android.test.InstrumentationTestRunn er" /> | |
| 1212 | |
| 1213 <if condition="${project.is.test}"> | |
| 1214 <then> | |
| 1215 <property name="tested.project.absolute.dir" location="${tested.proj ect.dir}" /> | |
| 1216 | |
| 1217 <!-- Application package of the tested project extracted from its ma nifest file --> | |
| 1218 <xpath input="${tested.project.absolute.dir}/AndroidManifest.xml" | |
| 1219 expression="/manifest/@package" output="tested.project.app.p ackage" /> | |
| 1220 | |
| 1221 <if condition="${emma.enabled}"> | |
| 1222 <then> | |
| 1223 <getprojectpaths projectPath="${tested.project.absolute.dir} " | |
| 1224 binOut="tested.project.out.absolute.dir" | |
| 1225 srcOut="tested.project.source.absolute.dir" /> | |
| 1226 | |
| 1227 <getlibpath projectPath="${tested.project.absolute.dir}" | |
| 1228 libraryFolderPathOut="tested.project.lib.source.path " | |
| 1229 leaf="@{source.dir}" /> | |
| 1230 | |
| 1231 </then> | |
| 1232 </if> | |
| 1233 | |
| 1234 </then> | |
| 1235 <else> | |
| 1236 <!-- this is a test app, the tested package is the app's own package --> | |
| 1237 <property name="tested.project.app.package" value="${project.app.pac kage}" /> | |
| 1238 | |
| 1239 <if condition="${emma.enabled}"> | |
| 1240 <then> | |
| 1241 <property name="tested.project.out.absolute.dir" value="${ou t.absolute.dir}" /> | |
| 1242 <property name="tested.project.source.absolute.dir" value="$ {source.absolute.dir}" /> | |
| 1243 | |
| 1244 <getlibpath | |
| 1245 libraryFolderPathOut="tested.project.lib.source.path " | |
| 1246 leaf="@{source.dir}" /> | |
| 1247 | |
| 1248 </then> | |
| 1249 </if> | |
| 1250 | |
| 1251 </else> | |
| 1252 </if> | |
| 1253 | |
| 1254 <property name="emma.dump.file" | |
| 1255 value="/data/data/${tested.project.app.package}/coverage.ec" /> | |
| 1256 | |
| 1257 <if condition="${emma.enabled}"> | |
| 1258 <then> | |
| 1259 <echo>Running tests...</echo> | |
| 1260 <run-tests-helper emma.enabled="true"> | |
| 1261 <extra-instrument-args> | |
| 1262 <arg value="-e" /> | |
| 1263 <arg value="coverageFile" /> | |
| 1264 <arg value="${emma.dump.file}" /> | |
| 1265 </extra-instrument-args> | |
| 1266 </run-tests-helper> | |
| 1267 | |
| 1268 <echo level="info">Settting permission to download the coverage file...</echo> | |
| 1269 <exec executable="${adb}" failonerror="true"> | |
| 1270 <arg line="${adb.device.arg}" /> | |
| 1271 <arg value="shell" /> | |
| 1272 <arg value="run-as" /> | |
| 1273 <arg value="${tested.project.app.package}" /> | |
| 1274 <arg value="chmod" /> | |
| 1275 <arg value="644" /> | |
| 1276 <arg value="${emma.dump.file}" /> | |
| 1277 </exec> | |
| 1278 <echo level="info">Downloading coverage file into project direct ory...</echo> | |
| 1279 <exec executable="${adb}" failonerror="true"> | |
| 1280 <arg line="${adb.device.arg}" /> | |
| 1281 <arg value="pull" /> | |
| 1282 <arg value="${emma.dump.file}" /> | |
| 1283 <arg path="${out.absolute.dir}/coverage.ec" /> | |
| 1284 </exec> | |
| 1285 | |
| 1286 <pathconvert property="tested.project.lib.source.path.value" ref id="tested.project.lib.source.path"> | |
| 1287 <firstmatchmapper> | |
| 1288 <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/> | |
| 1289 <identitymapper/> | |
| 1290 </firstmatchmapper> | |
| 1291 </pathconvert> | |
| 1292 | |
| 1293 <echo level="info">Extracting coverage report...</echo> | |
| 1294 <emma> | |
| 1295 <property name="report.html.out.encoding" value="UTF-8" /> | |
| 1296 <report sourcepath="${tested.project.source.absolute.dir}:${ tested.project.lib.source.path.value}" | |
| 1297 verbosity="${verbosity}"> | |
| 1298 <!-- TODO: report.dir or something like should be introd uced if necessary --> | |
| 1299 <infileset file="${out.absolute.dir}/coverage.ec" /> | |
| 1300 <infileset file="${tested.project.out.absolute.dir}/cove rage.em" /> | |
| 1301 <!-- TODO: reports in other, indicated by user formats - -> | |
| 1302 <html outfile="${out.absolute.dir}/coverage.html" /> | |
| 1303 <txt outfile="${out.absolute.dir}/coverage.txt" /> | |
| 1304 <xml outfile="${out.absolute.dir}/coverage.xml" /> | |
| 1305 </report> | |
| 1306 </emma> | |
| 1307 <echo level="info">Cleaning up temporary files...</echo> | |
| 1308 <delete file="${out.absolute.dir}/coverage.ec" /> | |
| 1309 <delete file="${tested.project.out.absolute.dir}/coverage.em" /> | |
| 1310 <exec executable="${adb}" failonerror="true"> | |
| 1311 <arg line="${adb.device.arg}" /> | |
| 1312 <arg value="shell" /> | |
| 1313 <arg value="run-as" /> | |
| 1314 <arg value="${tested.project.app.package}" /> | |
| 1315 <arg value="rm" /> | |
| 1316 <arg value="${emma.dump.file}" /> | |
| 1317 </exec> | |
| 1318 <echo level="info">Saving the coverage reports in ${out.absolute .dir}</echo> | |
| 1319 </then> | |
| 1320 <else> | |
| 1321 <run-tests-helper /> | |
| 1322 </else> | |
| 1323 </if> | |
| 1324 </target> | |
| 1325 | |
| 1326 <!-- ******************************************************* --> | |
| 1327 <!-- ********** Run Lint on the project ********* --> | |
| 1328 <!-- ******************************************************* --> | |
| 1329 | |
| 1330 <target name="lint" | |
| 1331 description="Runs lint on the project to look for potential bugs" > | |
| 1332 <lint executable="${lint}" | |
| 1333 html="${lint.out.html}" | |
| 1334 xml="${lint.out.xml}" | |
| 1335 src="${source.absolute.dir}:${gen.absolute.dir}" | |
| 1336 classpath="${out.classes.absolute.dir}" /> | |
| 1337 </target> | |
| 1338 | |
| 1339 <!-- ******************************************************* --> | |
| 1340 <!-- ********** Install/uninstall specific targets ********* --> | |
| 1341 <!-- ******************************************************* --> | |
| 1342 | |
| 1343 <target name="install" | |
| 1344 description="Installs the newly build package. Must be used in c onjunction with a build target | |
| 1345 (debug/release/instrument). If the application was p reviously installed, the application | |
| 1346 is reinstalled if the signature matches." > | |
| 1347 <!-- only do install if *not* a library project --> | |
| 1348 <do-only-if-not-library elseText="Library project: nothing to install!" > | |
| 1349 <if> | |
| 1350 <condition> | |
| 1351 <isset property="out.final.file" /> | |
| 1352 </condition> | |
| 1353 <then> | |
| 1354 <if> | |
| 1355 <condition> | |
| 1356 <resourceexists> | |
| 1357 <file file="${out.final.file}"/> | |
| 1358 </resourceexists> | |
| 1359 </condition> | |
| 1360 <then> | |
| 1361 <echo level="info">Installing ${out.final.file} onto default emulator or device...</echo> | |
| 1362 <exec executable="${adb}" failonerror="true"> | |
| 1363 <arg line="${adb.device.arg}" /> | |
| 1364 <arg value="install" /> | |
| 1365 <arg value="-r" /> | |
| 1366 <arg path="${out.final.file}" /> | |
| 1367 </exec> | |
| 1368 | |
| 1369 <!-- now install the tested project if applicable -- > | |
| 1370 <!-- can't use project.is.test since the setup targe t might not have run --> | |
| 1371 <if> | |
| 1372 <condition> | |
| 1373 <and> | |
| 1374 <isset property="tested.project.dir" /> | |
| 1375 <not> | |
| 1376 <isset property="dont.do.deps" /> | |
| 1377 </not> | |
| 1378 </and> | |
| 1379 </condition> | |
| 1380 <then> | |
| 1381 <property name="tested.project.absolute.dir" location="${tested.project.dir}" /> | |
| 1382 | |
| 1383 <!-- figure out which tested package to inst all based on emma.enabled --> | |
| 1384 <condition property="tested.project.install. target" value="installi" else="installd"> | |
| 1385 <isset property="emma.enabled" /> | |
| 1386 </condition> | |
| 1387 <subant target="${tested.project.install.tar get}" failonerror="true"> | |
| 1388 <fileset dir="${tested.project.absolute. dir}" includes="build.xml" /> | |
| 1389 </subant> | |
| 1390 </then> | |
| 1391 </if> | |
| 1392 </then> | |
| 1393 <else> | |
| 1394 <fail message="File ${out.final.file} does not exist ." /> | |
| 1395 </else> | |
| 1396 </if> | |
| 1397 </then> | |
| 1398 <else> | |
| 1399 <echo>Install file not specified.</echo> | |
| 1400 <echo></echo> | |
| 1401 <echo>'ant install' now requires the build target to be spec ified as well.</echo> | |
| 1402 <echo></echo> | |
| 1403 <echo></echo> | |
| 1404 <echo> ant debug install</echo> | |
| 1405 <echo> ant release install</echo> | |
| 1406 <echo> ant instrument install</echo> | |
| 1407 <echo>This will build the given package and install it.</ech o> | |
| 1408 <echo></echo> | |
| 1409 <echo>Alternatively, you can use</echo> | |
| 1410 <echo> ant installd</echo> | |
| 1411 <echo> ant installr</echo> | |
| 1412 <echo> ant installi</echo> | |
| 1413 <echo> ant installt</echo> | |
| 1414 <echo>to only install an existing package (this will not reb uild the package.)</echo> | |
| 1415 <fail /> | |
| 1416 </else> | |
| 1417 </if> | |
| 1418 </do-only-if-not-library> | |
| 1419 </target> | |
| 1420 | |
| 1421 <target name="installd" depends="-set-debug-files, install" | |
| 1422 description="Installs (only) the debug package." /> | |
| 1423 <target name="installr" depends="-set-release-mode, install" | |
| 1424 description="Installs (only) the release package." /> | |
| 1425 <target name="installi" depends="-set-instrumented-mode, install" | |
| 1426 description="Installs (only) the instrumented package." /> | |
| 1427 <target name="installt" depends="-test-project-check, installd" | |
| 1428 description="Installs (only) the test and tested packages." /> | |
| 1429 | |
| 1430 | |
| 1431 <!-- Uninstalls the package from the default emulator/device --> | |
| 1432 <target name="uninstall" depends="-setup" | |
| 1433 description="Uninstalls the application from a running emulator or device."> | |
| 1434 <if> | |
| 1435 <condition> | |
| 1436 <isset property="project.app.package" /> | |
| 1437 </condition> | |
| 1438 <then> | |
| 1439 <uninstall-helper app.package="${project.app.package}" /> | |
| 1440 </then> | |
| 1441 <else> | |
| 1442 <fail message="Could not find application package in manifest. C annot run 'adb uninstall'." /> | |
| 1443 </else> | |
| 1444 </if> | |
| 1445 | |
| 1446 <!-- Now uninstall the tested project, if applicable --> | |
| 1447 <if> | |
| 1448 <condition> | |
| 1449 <and> | |
| 1450 <istrue value="${project.is.test}" /> | |
| 1451 <not> | |
| 1452 <isset property="dont.do.deps" /> | |
| 1453 </not> | |
| 1454 </and> | |
| 1455 </condition> | |
| 1456 <then> | |
| 1457 <property name="tested.project.absolute.dir" location="${tested. project.dir}" /> | |
| 1458 | |
| 1459 <!-- Application package of the tested project extracted from it s manifest file --> | |
| 1460 <xpath input="${tested.project.absolute.dir}/AndroidManifest.xml " | |
| 1461 expression="/manifest/@package" output="tested.project.app.p ackage" /> | |
| 1462 <if> | |
| 1463 <condition> | |
| 1464 <isset property="tested.project.app.package" /> | |
| 1465 </condition> | |
| 1466 <then> | |
| 1467 <uninstall-helper app.package="${tested.project.app.pack age}" /> | |
| 1468 </then> | |
| 1469 <else> | |
| 1470 <fail message="Could not find tested application package in manifest. Cannot run 'adb uninstall'." /> | |
| 1471 </else> | |
| 1472 </if> | |
| 1473 </then> | |
| 1474 </if> | |
| 1475 | |
| 1476 </target> | |
| 1477 | |
| 1478 | |
| 1479 <!-- ******************************************************* --> | |
| 1480 <!-- ************************* Help ************************ --> | |
| 1481 <!-- ******************************************************* --> | |
| 1482 | |
| 1483 <target name="help"> | |
| 1484 <!-- displays starts at col 13 | |
| 1485 |13 8 0| --> | |
| 1486 <echo>Android Ant Build. Available targets:</echo> | |
| 1487 <echo> help: Displays this help.</echo> | |
| 1488 <echo> clean: Removes output files created by other targets.</echo > | |
| 1489 <echo> The 'all' target can be used to clean dependencies</ echo> | |
| 1490 <echo> (tested projects and libraries)at the same time</ech o> | |
| 1491 <echo> using: 'ant all clean'</echo> | |
| 1492 <echo> debug: Builds the application and signs it with a debug key .</echo> | |
| 1493 <echo> The 'nodeps' target can be used to only build the</e cho> | |
| 1494 <echo> current project and ignore the libraries using:</ech o> | |
| 1495 <echo> 'ant nodeps debug'</echo> | |
| 1496 <echo> release: Builds the application. The generated apk file must be</echo> | |
| 1497 <echo> signed before it is published.</echo> | |
| 1498 <echo> The 'nodeps' target can be used to only build the</e cho> | |
| 1499 <echo> current project and ignore the libraries using:</ech o> | |
| 1500 <echo> 'ant nodeps release'</echo> | |
| 1501 <echo> instrument:Builds an instrumented package and signs it with a</ echo> | |
| 1502 <echo> debug key.</echo> | |
| 1503 <echo> test: Runs the tests. Project must be a test project and</ echo> | |
| 1504 <echo> must have been built. Typical usage would be:</echo> | |
| 1505 <echo> ant [emma] debug install test</echo> | |
| 1506 <echo> emma: Transiently enables code coverage for subsequent</ec ho> | |
| 1507 <echo> targets.</echo> | |
| 1508 <echo> install: Installs the newly build package. Must either be use d</echo> | |
| 1509 <echo> in conjunction with a build target (debug/release/</ echo> | |
| 1510 <echo> instrument) or with the proper suffix indicating</ec ho> | |
| 1511 <echo> which package to install (see below).</echo> | |
| 1512 <echo> If the application was previously installed, the</ec ho> | |
| 1513 <echo> application is reinstalled if the signature matches. </echo> | |
| 1514 <echo> installd: Installs (only) the debug package.</echo> | |
| 1515 <echo> installr: Installs (only) the release package.</echo> | |
| 1516 <echo> installi: Installs (only) the instrumented package.</echo> | |
| 1517 <echo> installt: Installs (only) the test and tested packages (unless </echo> | |
| 1518 <echo> nodeps is used as well.</echo> | |
| 1519 <echo> uninstall: Uninstalls the application from a running emulator o r</echo> | |
| 1520 <echo> device. Also uninstall tested package if applicable< /echo> | |
| 1521 <echo> unless 'nodeps' is used as well.</echo> | |
| 1522 </target> | |
| 1523 </project> | |
| OLD | NEW |