You need to download ant, proguard and configure them first.
Then you have to genarate a build.xml file use the following command:
$android update project --path
path is the full path of your android project, eg:~/code/workspace/ENotes
now you can see there's a build.xml file under ~/code/workspace/ENotes.
Then you have to configure your build.xml file. Including sign, optimize, align.
Here's my example build.xml file.
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <project name="ENotes" default="help"> 4 5 6 7 <!-- The local.properties file is created and updated by the 'android' tool. 8 9 It contains the path to the SDK. It should *NOT* be checked in in Version 10 11 Control Systems. --> 12 13 <property file="local.properties" /> 14 15 16 17 <!-- The build.properties file can be created by you and is never touched 18 19 by the 'android' tool. This is the place to change some of the default property values 20 21 used by the Ant rules. 22 23 Here are some properties you may want to change/update: 24 25 26 27 application.package 28 29 the name of your application package as defined in the manifest. Used by the 30 31 'uninstall' rule. 32 33 source.dir 34 35 the name of the source directory. Default is 'src'. 36 37 out.dir 38 39 the name of the output directory. Default is 'bin'. 40 41 42 43 Properties related to the SDK location or the project target should be updated 44 45 using the 'android' tool with the 'update' action. 46 47 48 49 This file is an integral part of the build system for your application and 50 51 should be checked in in Version Control Systems. 52 53 54 55 --> 56 57 <property file="build.properties" /> 58 59 60 61 <!-- The default.properties file is created and updated by the 'android' tool, as well 62 63 as ADT. 64 65 This file is an integral part of the build system for your application and 66 67 should be checked in in Version Control Systems. --> 68 69 <property file="default.properties" /> 70 71 72 73 <!-- Custom Android task to deal with the project target, and import the proper rules. 74 75 This requires ant 1.6.0 or above. --> 76 77 <path id="android.antlibs"> 78 79 <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" /> 80 81 <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" /> 82 83 <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" /> 84 85 <pathelement path="${sdk.dir}/tools/lib/apkbuilder.jar" /> 86 87 <pathelement path="${sdk.dir}/tools/lib/jarutils.jar" /> 88 89 </path> 90 91 92 93 <taskdef name="setup" 94 95 classname="com.android.ant.SetupTask" 96 97 classpathref="android.antlibs" /> 98 99 100 101 <!-- Execute the Android Setup task that will setup some properties specific to the target, 102 103 and import the build rules files. 104 105 106 107 The rules file is imported from 108 109 <SDK>/platforms/<target_platform>/templates/android_rules.xml 110 111 112 113 To customize some build steps for your project: 114 115 - copy the content of the main node <project> from android_rules.xml 116 117 - paste it in this build.xml below the <setup /> task. 118 119 - disable the import by changing the setup task below to <setup import="false" /> 120 121 122 123 This will ensure that the properties are setup correctly but that your customized 124 125 build steps are used. 126 127 --> 128 129 <setup import="false" /> 130 131 132 133 <!-- Custom tasks --> 134 135 <taskdef name="aaptexec" 136 137 classname="com.android.ant.AaptExecLoopTask" 138 139 classpathref="android.antlibs" /> 140 141 142 143 <taskdef name="apkbuilder" 144 145 classname="com.android.ant.ApkBuilderTask" 146 147 classpathref="android.antlibs" /> 148 149 150 151 <taskdef name="xpath" 152 153 classname="com.android.ant.XPathTask" 154 155 classpathref="android.antlibs" /> 156 157 158 159 <!-- Properties --> 160 161 162 163 <!-- Tells adb which device to target. You can change this from the command line 164 165 by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg=-e" for 166 167 the emulator. --> 168 169 <property name="adb.device.arg" value="" /> 170 171 172 173 <property name="android.tools.dir" location="${sdk.dir}/tools" /> 174 175 <!-- Name of the application package extracted from manifest file --> 176 177 <xpath input="AndroidManifest.xml" expression="/manifest/@package" 178 179 output="manifest.package" /> 180 181 182 183 <!-- Input directories --> 184 185 <property name="source.dir" value="src" /> 186 187 <property name="source.absolute.dir" location="${source.dir}" /> 188 189 <property name="gen.dir" value="gen" /> 190 191 <property name="gen.absolute.dir" location="${gen.dir}" /> 192 193 <property name="resource.dir" value="res" /> 194 195 <property name="resource.absolute.dir" location="${resource.dir}" /> 196 197 <property name="asset.dir" value="assets" /> 198 199 <property name="asset.absolute.dir" location="${asset.dir}" /> 200 201 202 203 <!-- Directory for the third party java libraries --> 204 205 <property name="external.libs.dir" value="libs" /> 206 207 <property name="external.libs.absolute.dir" location="${external.libs.dir}" /> 208 209 210 211 <!-- Directory for the native libraries --> 212 213 <property name="native.libs.dir" value="libs" /> 214 215 <property name="native.libs.absolute.dir" location="${native.libs.dir}" /> 216 217 218 219 <!-- Output directories --> 220 221 <property name="out.dir" value="bin" /> 222 223 <property name="out.absolute.dir" location="${out.dir}" /> 224 225 <property name="out.classes.dir" value="${out.absolute.dir}" /> 226 227 <property name="out.classes.absolute.dir" location="${out.classes.dir}" /> 228 229 230 231 <!-- Intermediate files --> 232 233 <property name="dex.file.name" value="classes.dex" /> 234 235 <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" /> 236 237 238 239 <!-- The final package file to generate --> 240 241 <property name="out.debug.unaligned.package" 242 243 location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" /> 244 245 <property name="out.debug.package" 246 247 location="${out.absolute.dir}/${ant.project.name}-debug.apk" /> 248 249 <property name="out.unsigned.package" 250 251 location="${out.absolute.dir}/${ant.project.name}-unsigned.apk" /> 252 253 <property name="out.unaligned.package" 254 255 location="${out.absolute.dir}/${ant.project.name}-unaligned.apk" /> 256 257 <property name="out.release.package" 258 259 location="${out.absolute.dir}/${ant.project.name}-release.apk" /> 260 261 262 263 <!-- Verbosity --> 264 265 <property name="verbose" value="false" /> 266 267 <!-- This is needed by emma as it uses multilevel verbosity instead of simple 'true' or 'false' 268 269 The property 'verbosity' is not user configurable and depends exclusively on 'verbose' 270 271 value.--> 272 273 <condition property="verbosity" value="verbose" else="quiet"> 274 275 <istrue value="${verbose}" /> 276 277 </condition> 278 279 <!-- This is needed to switch verbosity of zipalign and aapt. Depends exclusively on 'verbose' 280 281 --> 282 283 <condition property="v.option" value="-v" else=""> 284 285 <istrue value="${verbose}" /> 286 287 </condition> 288 289 <!-- This is needed to switch verbosity of dx. Depends exclusively on 'verbose' --> 290 291 <condition property="verbose.option" value="--verbose" else=""> 292 293 <istrue value="${verbose}" /> 294 295 </condition> 296 297 298 299 <!-- Tools --> 300 301 <condition property="exe" value=".exe" else=""><os family="windows" /></condition> 302 303 <property name="adb" location="${android.tools.dir}/adb${exe}" /> 304 305 <property name="zipalign" location="${android.tools.dir}/zipalign${exe}" /> 306 307 308 309 <!-- Emma configuration --> 310 311 <property name="emma.dir" value="${sdk.dir}/tools/lib" /> 312 313 <path id="emma.lib"> 314 315 <pathelement location="${emma.dir}/emma.jar" /> 316 317 <pathelement location="${emma.dir}/emma_ant.jar" /> 318 319 </path> 320 321 <taskdef resource="emma_ant.properties" classpathref="emma.lib" /> 322 323 <!-- End of emma configuration --> 324 325 326 327 <!-- Macros --> 328 329 330 331 <!-- Configurable macro, which allows to pass as parameters output directory, 332 333 output dex filename and external libraries to dex (optional) --> 334 335 <macrodef name="dex-helper"> 336 337 <element name="external-libs" optional="yes" /> 338 339 <element name="extra-parameters" optional="yes" /> 340 341 <sequential> 342 343 <echo>Converting compiled files and external libraries into ${intermediate.dex.file}... 344 345 </echo> 346 347 <apply executable="${dx}" failonerror="true" parallel="true"> 348 349 <arg value="--dex" /> 350 351 <arg value="--output=${intermediate.dex.file}" /> 352 353 <extra-parameters /> 354 355 <arg line="${verbose.option}" /> 356 357 <arg path="${out.classes.absolute.dir}" /> 358 359 <fileset dir="${external.libs.absolute.dir}" includes="*.jar" /> 360 361 <external-libs /> 362 363 </apply> 364 365 </sequential> 366 367 </macrodef> 368 369 370 371 <!-- This is macro that enable passing variable list of external jar files to ApkBuilder 372 373 Example of use: 374 375 <package-helper> 376 377 <extra-jars> 378 379 <jarfolder path="my_jars" /> 380 381 <jarfile path="foo/bar.jar" /> 382 383 <jarfolder path="your_jars" /> 384 385 </extra-jars> 386 387 </package-helper> --> 388 389 <macrodef name="package-helper"> 390 391 <attribute name="sign.package" /> 392 393 <element name="extra-jars" optional="yes" /> 394 395 <sequential> 396 397 <apkbuilder 398 399 outfolder="${out.absolute.dir}" 400 401 basename="${ant.project.name}" 402 403 signed="@{sign.package}" 404 405 verbose="${verbose}"> 406 407 <file path="${intermediate.dex.file}" /> 408 409 <sourcefolder path="${source.absolute.dir}" /> 410 411 <nativefolder path="${native.libs.absolute.dir}" /> 412 413 <jarfolder path="${external.libs.absolute.dir}" /> 414 415 <extra-jars/> 416 417 </apkbuilder> 418 419 </sequential> 420 421 </macrodef> 422 423 424 425 <!-- This is macro which zipaligns in.package and outputs it to out.package. Used by targets 426 427 debug, -debug-with-emma and release.--> 428 429 <macrodef name="zipalign-helper"> 430 431 <attribute name="in.package" /> 432 433 <attribute name="out.package" /> 434 435 <sequential> 436 437 <echo>Running zip align on final apk...</echo> 438 439 <exec executable="${zipalign}" failonerror="true"> 440 441 <arg line="${v.option}" /> 442 443 <arg value="-f" /> 444 445 <arg value="4" /> 446 447 <arg path="@{in.package}" /> 448 449 <arg path="@{out.package}" /> 450 451 </exec> 452 453 </sequential> 454 455 </macrodef> 456 457 458 459 <!-- This is macro used only for sharing code among two targets, -install and 460 461 -install-with-emma which do exactly the same but differ in dependencies --> 462 463 <macrodef name="install-helper"> 464 465 <sequential> 466 467 <echo>Installing ${out.debug.package} onto default emulator or device...</echo> 468 469 <exec executable="${adb}" failonerror="true"> 470 471 <arg line="${adb.device.arg}" /> 472 473 <arg value="install" /> 474 475 <arg value="-r" /> 476 477 <arg path="${out.debug.package}" /> 478 479 </exec> 480 481 </sequential> 482 483 </macrodef> 484 485 486 487 <!-- Rules --> 488 489 490 491 <!-- Creates the output directories if they don't exist yet. --> 492 493 <target name="-dirs"> 494 495 <echo>Creating output directories if needed...</echo> 496 497 <mkdir dir="${resource.absolute.dir}" /> 498 499 <mkdir dir="${external.libs.absolute.dir}" /> 500 501 <mkdir dir="${gen.absolute.dir}" /> 502 503 <mkdir dir="${out.absolute.dir}" /> 504 505 <mkdir dir="${out.classes.absolute.dir}" /> 506 507 </target> 508 509 510 511 <property name="proguard-home" value="D:/proguard4.6/lib"/> 512 513 514 515 <target name="optimize" depends="compile"> 516 517 <echo>optimize files...</echo> 518 519 520 521 <jar basedir="${out.classes.absolute.dir}" destfile="temp.jar"/> 522 523 <java jar="${proguard-home}/proguard.jar" fork="true" failonerror="true"> 524 525 <jvmarg value="-Dmaximum.inlined.code.length=32"/> 526 527 <arg value="-injars temp.jar"/> 528 529 <arg value="-libraryjars ${android-jar}"/> 530 531 <arg value="-outjars optimized.jar"/> 532 533 534 535 <!-- <arg value="-libraryjars ${library-jar}/some_lib_used.jar"/> --> 536 537 <arg value="-dontpreverify"/> 538 539 <arg value="-dontoptimize"/> 540 541 542 543 <arg value="-dontusemixedcaseclassnames"/> 544 545 <arg value="-repackageclasses ''"/> 546 547 <arg value="-allowaccessmodification"/> 548 549 550 551 552 553 <arg value="-keep public class * extends android.app.Activity"/> 554 555 <arg value="-keep public class * extends android.app.Application"/> 556 557 <arg value="-keep public class * extends android.app.Service"/> 558 559 <arg value="-keep public class * extends android.content.BroadcastReceiver"/> 560 561 <arg value="-keep public class * extends android.content.ContentProvider"/> 562 563 <arg value="-keep public class * extends android.app.backup.BackupAgentHelper"/> 564 565 <arg value="-keep public class * extends android.preference.Preference"/> 566 567 <arg value="-keep public class com.android.vending.licensing.ILicensingService"/> 568 569 570 571 572 573 574 575 <!-- <arg value="-keep public class com.just2me.obfapp.receiver.*"/> --> 576 577 <arg value="-optimizationpasses 5"/> 578 579 <arg value="-verbose"/> 580 581 <arg value="-dontskipnonpubliclibraryclasses"/> 582 583 <arg value="-dontskipnonpubliclibraryclassmembers"/> 584 585 </java> 586 587 <delete file="temp.jar"/> 588 589 <delete dir="${out.classes.absolute.dir}"/> 590 591 <mkdir dir="${out.classes.absolute.dir}"/> 592 593 <unzip src="optimized.jar" dest="${out.classes.absolute.dir}"/> 594 595 <delete file="optimized.jar"/> 596 597 </target> 598 599 600 601 <!-- Generate the version number to strings.xml --> 602 603 <target name="gen-ver-num" depends="-dirs"> 604 605 <echo>Generating SVN version number to resource string...</echo> 606 607 <!--<exec executable="./genVersionNum.sh" failonerror="true"></exec> --> 608 609 <exec executable="bash"> <arg value="genVersionNum.sh"/></exec> 610 611 </target> 612 613 614 615 <!-- Generates the R.java file for this project's resources. --> 616 617 <target name="-resource-src" depends="-dirs"> 618 619 <echo>Generating R.java / Manifest.java from the resources...</echo> 620 621 <exec executable="${aapt}" failonerror="true"> 622 623 <arg value="package" /> 624 625 <arg line="${v.option}" /> 626 627 <arg value="-m" /> 628 629 <arg value="-J" /> 630 631 <arg path="${gen.absolute.dir}" /> 632 633 <arg value="-M" /> 634 635 <arg path="AndroidManifest.xml" /> 636 637 <arg value="-S" /> 638 639 <arg path="${resource.absolute.dir}" /> 640 641 <arg value="-I" /> 642 643 <arg path="${android.jar}" /> 644 645 </exec> 646 647 </target> 648 649 650 651 <!-- Generates java classes from .aidl files. --> 652 653 <target name="-aidl" depends="-dirs"> 654 655 <echo>Compiling aidl files into Java classes...</echo> 656 657 <apply executable="${aidl}" failonerror="true"> 658 659 <arg value="-p${android.aidl}" /> 660 661 <arg value="-I${source.absolute.dir}" /> 662 663 <arg value="-o${gen.absolute.dir}" /> 664 665 <fileset dir="${source.absolute.dir}"> 666 667 <include name="**/*.aidl" /> 668 669 </fileset> 670 671 </apply> 672 673 </target> 674 675 676 677 <path id="classpathref"> 678 679 <fileset dir="./lib/"> 680 681 <include name="*.jar" /> 682 683 </fileset> 684 685 </path> 686 687 688 689 <!-- Compiles this project's .java files into .class files. --> 690 691 <target name="compile" depends="-resource-src, -aidl" 692 693 description="Compiles project's .java files into .class files"> 694 695 <!-- If android rules are used for a test project, its classpath should include 696 697 tested project's location --> 698 699 <condition property="extensible.classpath" 700 701 value="${tested.project.absolute.dir}/bin" else="."> 702 703 <isset property="tested.project.absolute.dir" /> 704 705 </condition> 706 707 <javac encoding="ascii" target="1.5" debug="true" extdirs="" 708 709 710 711 destdir="${out.classes.absolute.dir}" 712 713 bootclasspathref="android.target.classpath" 714 715 716 717 > 718 719 <src path="${source.absolute.dir}" /> 720 721 <src path="${gen.absolute.dir}" /> 722 723 <classpath> 724 725 <fileset dir="${external.libs.absolute.dir}" includes="*.jar" /> 726 727 </classpath> 728 729 </javac> 730 731 </target> 732 733 734 735 <!-- Converts this project's .class files into .dex files --> 736 737 <target name="-dex" depends="compile,optimize"> 738 739 <dex-helper /> 740 741 </target> 742 743 744 745 <!-- Puts the project's resources into the output package file 746 747 This actually can create multiple resource package in case 748 749 Some custom apk with specific configuration have been 750 751 declared in default.properties. 752 753 --> 754 755 <target name="-package-resources"> 756 757 <echo>Packaging resources</echo> 758 759 <aaptexec executable="${aapt}" 760 761 command="package" 762 763 manifest="AndroidManifest.xml" 764 765 resources="${resource.absolute.dir}" 766 767 assets="${asset.absolute.dir}" 768 769 androidjar="${android.jar}" 770 771 outfolder="${out.absolute.dir}" 772 773 basename="${ant.project.name}" /> 774 775 </target> 776 777 778 779 <!-- Packages the application and sign it with a debug key. --> 780 781 <target name="-package-debug-sign" depends="-dex, -package-resources"> 782 783 <package-helper sign.package="true" /> 784 785 </target> 786 787 788 789 <!-- Packages the application without signing it. --> 790 791 <target name="-package-no-sign" depends="-dex, -package-resources"> 792 793 <package-helper sign.package="false" /> 794 795 </target> 796 797 798 799 <target name="-compile-tested-if-test" if="tested.project.dir" unless="do.not.compile.again"> 800 801 <subant target="compile"> 802 803 <fileset dir="${tested.project.absolute.dir}" includes="build.xml" /> 804 805 </subant> 806 807 </target> 808 809 810 811 <!-- Builds debug output package, provided all the necessary files are already dexed --> 812 813 <target name="debug" depends="-compile-tested-if-test, -package-debug-sign" 814 815 description="Builds the application and signs it with a debug key."> 816 817 <zipalign-helper in.package="${out.debug.unaligned.package}" 818 819 out.package="${out.debug.package}" /> 820 821 <echo>Debug Package: ${out.debug.package}</echo> 822 823 </target> 824 825 826 827 <target name="-release-check"> 828 829 <condition property="release.sign"> 830 831 <and> 832 833 <isset property="key.store" /> 834 835 <isset property="key.alias" /> 836 837 </and> 838 839 </condition> 840 841 </target> 842 843 844 845 <target name="-release-nosign" depends="-release-check" unless="release.sign"> 846 847 <echo>No key.store and key.alias properties found in build.properties.</echo> 848 849 <echo>Please sign ${out.unsigned.package} manually</echo> 850 851 <echo>and run zipalign from the Android SDK tools.</echo> 852 853 </target> 854 855 856 857 <target name="signapk"> 858 859 <echo>Signing apk...</echo> 860 861 <signjar 862 863 jar="${out.unsigned.package}" 864 865 signedjar="${out.unaligned.package}" 866 867 keystore="${key.store}" 868 869 storepass="${key.store.password}" 870 871 alias="${key.alias}" 872 873 keypass="${key.alias.password}" 874 875 verbose="${verbose}" /> 876 877 878 879 <!-- Zip aligns the APK --> 880 881 <echo>Zipalign apk...</echo> 882 883 <zipalign-helper in.package="${out.unaligned.package}" out.package="${out.release.package}" /> 884 885 <echo>Release Package: ${out.release.package}</echo> 886 887 888 889 <delete file="${out.unsigned.package}"/> 890 891 <delete file="${out.unaligned.package}"/> 892 893 </target> 894 895 896 897 <target name="release" depends="-package-no-sign, -release-nosign" if="release.sign" 898 899 description="Builds the application. The generated apk file must be signed before 900 901 it is published."> 902 903 <!-- Gets passwords --> 904 905 <input 906 907 message="Please enter keystore password (store:${key.store}):" 908 909 addproperty="key.store.password" /> 910 911 <input 912 913 message="Please enter password for alias '${key.alias}':" 914 915 addproperty="key.alias.password" /> 916 917 918 919 <!-- Signs the APK --> 920 921 <echo>Signing final apk...</echo> 922 923 <signjar 924 925 jar="${out.unsigned.package}" 926 927 signedjar="${out.unaligned.package}" 928 929 keystore="${key.store}" 930 931 storepass="${key.store.password}" 932 933 alias="${key.alias}" 934 935 keypass="${key.alias.password}" 936 937 verbose="${verbose}" /> 938 939 940 941 <!-- Zip aligns the APK --> 942 943 <zipalign-helper in.package="${out.unaligned.package}" 944 945 out.package="${out.release.package}" /> 946 947 <echo>Release Package: ${out.release.package}</echo> 948 949 </target> 950 951 952 953 <target name="install" depends="debug" 954 955 description="Installs/reinstalls the debug package onto a running 956 957 emulator or device. If the application was previously installed, 958 959 the signatures must match." > 960 961 <install-helper /> 962 963 </target> 964 965 966 967 <target name="-uninstall-check"> 968 969 <condition property="uninstall.run"> 970 971 <isset property="manifest.package" /> 972 973 </condition> 974 975 </target> 976 977 978 979 <target name="-uninstall-error" depends="-uninstall-check" unless="uninstall.run"> 980 981 <echo>Unable to run 'ant uninstall', manifest.package property is not defined. 982 983 </echo> 984 985 </target> 986 987 988 989 <!-- Uninstalls the package from the default emulator/device --> 990 991 <target name="uninstall" depends="-uninstall-error" if="uninstall.run" 992 993 description="Uninstalls the application from a running emulator or device."> 994 995 <echo>Uninstalling ${manifest.package} from the default emulator or device...</echo> 996 997 <exec executable="${adb}" failonerror="true"> 998 999 <arg line="${adb.device.arg}" /> 1000 1001 <arg value="uninstall" /> 1002 1003 <arg value="${manifest.package}" /> 1004 1005 </exec> 1006 1007 </target> 1008 1009 1010 1011 <target name="clean" description="Removes output files created by other targets."> 1012 1013 <delete dir="${out.absolute.dir}" verbose="${verbose}" /> 1014 1015 <delete dir="${gen.absolute.dir}" verbose="${verbose}" /> 1016 1017 </target> 1018 1019 1020 1021 <!-- Targets for code-coverage measurement purposes, invoked from external file --> 1022 1023 1024 1025 <!-- Emma-instruments tested project classes (compiles the tested project if necessary) 1026 1027 and writes instrumented classes to ${instrumentation.absolute.dir}/classes --> 1028 1029 <target name="-emma-instrument" depends="compile"> 1030 1031 <echo>Instrumenting classes from ${out.absolute.dir}/classes...</echo> 1032 1033 <!-- It only instruments class files, not any external libs --> 1034 1035 <emma enabled="true"> 1036 1037 <instr verbosity="${verbosity}" 1038 1039 mode="overwrite" 1040 1041 instrpath="${out.absolute.dir}/classes" 1042 1043 outdir="${out.absolute.dir}/classes"> 1044 1045 </instr> 1046 1047 <!-- TODO: exclusion filters on R*.class and allowing custom exclusion from 1048 1049 user defined file --> 1050 1051 </emma> 1052 1053 </target> 1054 1055 1056 1057 <target name="-dex-instrumented" depends="-emma-instrument"> 1058 1059 <dex-helper> 1060 1061 <extra-parameters> 1062 1063 <arg value="--no-locals" /> 1064 1065 </extra-parameters> 1066 1067 <external-libs> 1068 1069 <fileset file="${emma.dir}/emma_device.jar" /> 1070 1071 </external-libs> 1072 1073 </dex-helper> 1074 1075 </target> 1076 1077 1078 1079 <!-- Invoked from external files for code coverage purposes --> 1080 1081 <target name="-package-with-emma" depends="-dex-instrumented, -package-resources"> 1082 1083 <package-helper sign.package="true"> 1084 1085 <extra-jars> 1086 1087 <!-- Injected from external file --> 1088 1089 <jarfile path="${emma.dir}/emma_device.jar" /> 1090 1091 </extra-jars> 1092 1093 </package-helper> 1094 1095 </target> 1096 1097 1098 1099 <target name="-debug-with-emma" depends="-package-with-emma"> 1100 1101 <zipalign-helper in.package="${out.debug.unaligned.package}" 1102 1103 out.package="${out.debug.package}" /> 1104 1105 </target> 1106 1107 1108 1109 <target name="-install-with-emma" depends="-debug-with-emma"> 1110 1111 <install-helper /> 1112 1113 </target> 1114 1115 1116 1117 <!-- End of targets for code-coverage measurement purposes --> 1118 1119 1120 1121 <target name="help"> 1122 1123 <!-- displays starts at col 13 1124 1125 |13 80| --> 1126 1127 <echo>Android Ant Build. Available targets:</echo> 1128 1129 <echo> help: Displays this help.</echo> 1130 1131 <echo> clean: Removes output files created by other targets.</echo> 1132 1133 <echo> compile: Compiles project's .java files into .class files.</echo> 1134 1135 <echo> debug: Builds the application and signs it with a debug key.</echo> 1136 1137 <echo> release: Builds the application. The generated apk file must be</echo> 1138 1139 <echo> signed before it is published.</echo> 1140 1141 <echo> install: Installs/reinstalls the debug package onto a running</echo> 1142 1143 <echo> emulator or device.</echo> 1144 1145 <echo> If the application was previously installed, the</echo> 1146 1147 <echo> signatures must match.</echo> 1148 1149 <echo> uninstall: Uninstalls the application from a running emulator or</echo> 1150 1151 <echo> device.</echo> 1152 1153 </target> 1154 1155 </project>
Then you can enter the project's directory and use command:
$ant release
to genarate a release version of result.
Some time there are mistakes like
[javac]****警告:编码 ascii 的不可映射字符********
出现“警告:编码 ascii 的不可映射字符”错误
To solve this kind of mistake, find the javac part in build.xml file, change the encoding 'ascii' to an appropriate one.
such as 'gbk' or 'utf-8'