-<?xml version="1.0" ?>
-
+<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2008 Google Inc.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
+Copyright (C) 2008 ZXing authors
- http://www.apache.org/licenses/LICENSE-2.0
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
+ http://www.apache.org/licenses/LICENSE-2.0
-<!-- This is a mildly hacked version of the auto-generated project
- build.xml file. -->
-<project name="BarcodeReader" default="package">
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<project name="BarcodeScanner" default="debug-optimized">
+ <!-- SDK Locations -->
<property file="../build.properties"/>
<property name="sdk-folder" value="${android-home}"/>
<property name="android-tools" value="${sdk-folder}/tools"/>
+ <!-- Application Package Name -->
+ <property name="application-package" value="com.google.zxing.client.android" />
+
<!-- The intermediates directory -->
<!-- Eclipse uses "bin" for its own output, so we do the same. -->
- <property name="outdir" value="bin"/>
+ <property name="outdir" value="bin" />
+ <!-- ************************************************************************************* -->
<!-- No user servicable parts below. -->
+ <property name="android-framework" value="${android-tools}/lib/framework.aidl" />
+
<!-- Input directories -->
- <property name="resource-dir" value="res"/>
- <property name="asset-dir" value="assets"/>
- <property name="srcdir" value="src"/>
+ <property name="resource-dir" value="res" />
+ <property name="asset-dir" value="assets" />
+ <property name="srcdir" value="src" />
+ <condition property="srcdir-ospath"
+ value="${basedir}\${srcdir}"
+ else="${basedir}/${srcdir}" >
+ <os family="windows"/>
+ </condition>
+
+ <property name="external-libs" value="../core" />
+ <condition property="external-libs-ospath"
+ value="${basedir}\${external-libs}"
+ else="${basedir}/${external-libs}" >
+ <os family="windows"/>
+ </condition>
<!-- Output directories -->
- <property name="outdir-classes" value="${outdir}/classes"/>
+ <property name="outdir-classes" value="${outdir}/classes" />
+ <condition property="outdir-classes-ospath"
+ value="${basedir}\${outdir-classes}"
+ else="${basedir}/${outdir-classes}" >
+ <os family="windows"/>
+ </condition>
<!-- Create R.java in the source directory -->
- <property name="outdir-r" value="src"/>
+ <property name="outdir-r" value="src" />
<!-- Intermediate files -->
- <property name="dex-file" value="classes.dex"/>
- <property name="intermediate-dex" value="${outdir}/${dex-file}"/>
+ <property name="dex-file" value="classes.dex" />
+ <property name="intermediate-dex" value="${outdir}/${dex-file}" />
+ <condition property="intermediate-dex-ospath"
+ value="${basedir}\${intermediate-dex}"
+ else="${basedir}/${intermediate-dex}" >
+ <os family="windows"/>
+ </condition>
<!-- The final package file to generate -->
- <property name="out-package" value="${outdir}/${ant.project.name}.apk"/>
+ <property name="resources-package" value="${outdir}/${ant.project.name}.ap_" />
+ <condition property="resources-package-ospath"
+ value="${basedir}\${resources-package}"
+ else="${basedir}/${resources-package}" >
+ <os family="windows"/>
+ </condition>
+
+ <property name="out-debug-package" value="${outdir}/${ant.project.name}-debug.apk" />
+ <condition property="out-debug-package-ospath"
+ value="${basedir}\${out-debug-package}"
+ else="${basedir}/${out-debug-package}" >
+ <os family="windows"/>
+ </condition>
+
+ <property name="out-unsigned-package" value="${outdir}/${ant.project.name}-unsigned.apk" />
+ <condition property="out-unsigned-package-ospath"
+ value="${basedir}\${out-unsigned-package}"
+ else="${basedir}/${out-unsigned-package}" >
+ <os family="windows"/>
+ </condition>
<!-- Tools -->
- <property name="aapt" value="${android-tools}/aapt"/>
- <property name="aidl" value="${android-tools}/aidl"/>
- <property name="dx" value="${android-tools}/dx"/>
- <property name="zip" value="zip"/>
- <property name="android-jar" value="${sdk-folder}/android.jar"/>
+ <condition property="aapt" value="${android-tools}/aapt.exe" else="${android-tools}/aapt" >
+ <os family="windows"/>
+ </condition>
+ <condition property="aidl" value="${android-tools}/aidl.exe" else="${android-tools}/aidl" >
+ <os family="windows"/>
+ </condition>
+ <condition property="adb" value="${android-tools}/adb.exe" else="${android-tools}/adb" >
+ <os family="windows"/>
+ </condition>
+ <condition property="dx" value="${android-tools}/dx.bat" else="${android-tools}/dx" >
+ <os family="windows"/>
+ </condition>
+ <condition property="apk-builder" value="${android-tools}/apkbuilder.bat" else="${android-tools}/apkbuilder" >
+ <os family="windows"/>
+ </condition>
- <!-- Rules -->
+ <property name="android-jar" value="${sdk-folder}/android.jar" />
- <target name="init">
- <tstamp/>
- <fail message="Please set 'android-home' in build.properties">
- <condition>
- <not>
- <available file="${android-home}" type="dir"/>
- </not>
- </condition>
- </fail>
- <fail message="Please build 'core' first">
- <condition>
- <not>
- <available file="../core/core.jar" type="file"/>
- </not>
- </condition>
- </fail>
- </target>
+ <!-- Rules -->
<!-- Create the output directories if they don't exist yet. -->
<target name="dirs">
- <mkdir dir="${outdir}"/>
- <mkdir dir="${outdir-classes}"/>
+ <echo>Creating output directories if needed...</echo>
+ <mkdir dir="${outdir}" />
+ <mkdir dir="${outdir-classes}" />
</target>
<!-- Generate the R.java file for this project's resources. -->
<target name="resource-src" depends="dirs">
- <echo>Generating R.java...</echo>
+ <echo>Generating R.java / Manifest.java from the resources...</echo>
<exec executable="${aapt}" failonerror="true">
- <arg value="compile"/>
- <arg value="-m"/>
- <arg value="-J"/>
- <arg value="${outdir-r}"/>
- <arg value="-M"/>
- <arg value="AndroidManifest.xml"/>
- <arg value="-S"/>
- <arg value="${resource-dir}"/>
- <arg value="-I"/>
- <arg value="${android-jar}"/>
+ <arg value="package" />
+ <arg value="-m" />
+ <arg value="-J" />
+ <arg value="${outdir-r}" />
+ <arg value="-M" />
+ <arg value="AndroidManifest.xml" />
+ <arg value="-S" />
+ <arg value="${resource-dir}" />
+ <arg value="-I" />
+ <arg value="${android-jar}" />
</exec>
</target>
<!-- Generate java classes from .aidl files. -->
<target name="aidl" depends="dirs">
+ <echo>Compiling aidl files into Java classes...</echo>
<apply executable="${aidl}" failonerror="true">
+ <arg value="-p${android-framework}" />
+ <arg value="-I${srcdir}" />
<fileset dir="${srcdir}">
<include name="**/*.aidl"/>
</fileset>
</target>
<!-- Compile this project's .java files into .class files. -->
- <target name="compile" depends="init, dirs, resource-src, aidl">
+ <target name="compile" depends="clean, dirs, resource-src, aidl">
<javac encoding="ascii" target="1.5" debug="true" extdirs=""
srcdir="."
destdir="${outdir-classes}"
bootclasspath="${android-jar}">
<classpath>
- <pathelement location="../core/core.jar"/>
+ <fileset dir="${external-libs}" includes="*.jar"/>
+ </classpath>
+ </javac>
+ </target>
+
+ <target name="compile-release" depends="clean, dirs, resource-src, aidl">
+ <javac encoding="ascii" target="1.5" debug="off" extdirs=""
+ srcdir="."
+ destdir="${outdir-classes}"
+ bootclasspath="${android-jar}">
+ <classpath>
+ <fileset dir="${external-libs}" includes="*.jar"/>
</classpath>
</javac>
- <unzip src="../core/core.jar" dest="${outdir-classes}"/>
+ </target>
+
+ <!--
+ Getting an error like this?
+
+ [apply] UNEXPECTED TOP-LEVEL EXCEPTION:
+ [apply] com.android.dx.cf.code.SimException: local variable type
+ mismatch: attempt to set or access a value of type int using a local
+ variable of type com.google.zxing.qrcode.decoder.Version. This is
+ symptomatic of .class transformation tools that ignore local variable
+ information.
+
+ Build core/ with the 'build-no-debug' target. It's a long story.
+ -->
+
+ <target name="optimize" depends="compile-release">
+ <fail message="Please put proguard.jar in 'bin' under the WTK install directory">
+ <condition>
+ <not>
+ <available file="${WTK-home}/bin/proguard.jar" type="file"/>
+ </not>
+ </condition>
+ </fail>
+ <unzip src="../core/core.jar" dest="${outdir-classes}" overwrite="true"/>
+ <jar jarfile="temp.jar" basedir="${outdir-classes}"/>
+ <delete dir="${outdir-classes}"/>
+ <mkdir dir="${outdir-classes}"/>
+ <java jar="${WTK-home}/bin/proguard.jar" fork="true" failonerror="true">
+ <jvmarg value="-Dmaximum.inlined.code.length=32"/>
+ <arg value="-injars temp.jar"/>
+ <arg value="-outjars temp-optimized.jar"/>
+ <arg value="-libraryjars ${android-jar}"/>
+ <arg value="-keep class com.google.zxing.client.android.*Activity"/>
+ <arg value="-keep class com.google.zxing.client.android.ViewfinderView { public * ; }"/>
+ <arg value="-keep class com.google.zxing.client.android.SearchBookContents* { public * ; }"/>
+ <arg value="-target 5"/>
+ <arg value="-optimizationpasses 7"/>
+ <arg value="-dontshrink"/>
+ <arg value="-dontobfuscate"/>
+ <arg value="-dontskipnonpubliclibraryclasses"/>
+ <arg value="-verbose"/>
+ <arg value="-dump proguard-dump.txt"/>
+ </java>
+ <delete file="temp.jar"/>
+ <unzip src="temp-optimized.jar" dest="${outdir-classes}" overwrite="true"/>
+ <delete file="temp-optimized.jar"/>
</target>
<!-- Convert this project's .class files into .dex files. -->
<target name="dex" depends="compile">
- <exec executable="${dx}" failonerror="true">
- <arg value="-JXmx384M"/>
- <arg value="--dex"/>
- <arg value="--output=${intermediate-dex}"/>
- <arg value="--locals=full"/>
- <arg value="--positions=lines"/>
- <arg path="${outdir-classes}"/>
- </exec>
+ <echo>Converting compiled files and external libraries into ${outdir}/${dex-file}...</echo>
+ <echo>NOTE: This will fail unless you built core with build-no-debug.</echo>
+ <apply executable="${dx}" failonerror="true" parallel="true">
+ <arg value="--dex" />
+ <arg value="--output=${intermediate-dex-ospath}" />
+ <arg path="${outdir-classes-ospath}" />
+ <fileset dir="${external-libs}" includes="*.jar"/>
+ </apply>
+ </target>
+
+ <target name="dex-optimized" depends="compile-release,optimize">
+ <echo>Converting compiled files and external libraries into ${outdir}/${dex-file}...</echo>
+ <echo>NOTE: This will fail unless you built core with build-no-debug.</echo>
+ <apply executable="${dx}" failonerror="true" parallel="true">
+ <arg value="--dex" />
+ <arg value="--output=${intermediate-dex-ospath}" />
+ <arg path="${outdir-classes-ospath}" />
+ <!-- workaround to appease 'apply'. Not really the right Ant task to use here. -->
+ <fileset dir="." includes="nosuchfile.jar"/>
+ </apply>
</target>
<!-- Put the project's resources into the output package file. -->
<target name="package-res-and-assets">
<echo>Packaging resources and assets...</echo>
<exec executable="${aapt}" failonerror="true">
- <arg value="package"/>
- <arg value="-f"/>
- <arg value="-c"/>
- <arg value="-M"/>
- <arg value="AndroidManifest.xml"/>
- <arg value="-S"/>
- <arg value="${resource-dir}"/>
- <arg value="-A"/>
- <arg value="${asset-dir}"/>
- <arg value="-I"/>
- <arg value="${android-jar}"/>
- <arg value="${out-package}"/>
+ <arg value="package" />
+ <arg value="-f" />
+ <arg value="-M" />
+ <arg value="AndroidManifest.xml" />
+ <arg value="-S" />
+ <arg value="${resource-dir}" />
+ <arg value="-A" />
+ <arg value="${asset-dir}" />
+ <arg value="-I" />
+ <arg value="${android-jar}" />
+ <arg value="-F" />
+ <arg value="${resources-package}" />
</exec>
</target>
<target name="package-res-no-assets">
<echo>Packaging resources...</echo>
<exec executable="${aapt}" failonerror="true">
- <arg value="package"/>
- <arg value="-f"/>
- <arg value="-c"/>
- <arg value="-M"/>
- <arg value="AndroidManifest.xml"/>
- <arg value="-S"/>
- <arg value="${resource-dir}"/>
+ <arg value="package" />
+ <arg value="-f" />
+ <arg value="-M" />
+ <arg value="AndroidManifest.xml" />
+ <arg value="-S" />
+ <arg value="${resource-dir}" />
<!-- No assets directory -->
- <arg value="-I"/>
- <arg value="${android-jar}"/>
- <arg value="${out-package}"/>
+ <arg value="-I" />
+ <arg value="${android-jar}" />
+ <arg value="-F" />
+ <arg value="${resources-package}" />
</exec>
</target>
- <!-- Invoke the proper target depending on whether or not
-an assets directory is present. -->
- <!-- TODO: find a nicer way to include the "-A ${asset-dir}" argument
-only when the assets dir exists. -->
+ <!-- Invoke the proper target depending on whether or not an assets directory is present. -->
<target name="package-res">
<available file="${asset-dir}" type="dir"
- property="res-target" value="and-assets"/>
- <property name="res-target" value="no-assets"/>
- <antcall target="package-res-${res-target}"/>
- </target>
-
- <!-- Put the project's .class files into the output package file. -->
- <target name="package-java" depends="compile, package-res">
- <echo>Packaging java...</echo>
- <jar destfile="${out-package}"
- basedir="${outdir-classes}"
- update="true"/>
- </target>
-
- <!-- Put the project's .dex files into the output package file. -->
- <target name="package-dex" depends="dex, package-res">
- <echo>Packaging dex...</echo>
- <exec executable="${zip}" failonerror="true">
- <arg value="-qj"/>
- <arg value="${out-package}"/>
- <arg value="${intermediate-dex}"/>
+ property="res-target" value="and-assets" />
+ <property name="res-target" value="no-assets" />
+ <antcall target="package-res-${res-target}" />
+ </target>
+
+ <!-- Package the application and sign it with a debug key.
+ This is the default target when building. It is used for debug. -->
+ <target name="debug" depends="dex, package-res">
+ <echo>Packaging ${out-debug-package}, and signing it with a debug key...</echo>
+ <exec executable="${apk-builder}" failonerror="true">
+ <arg value="${out-debug-package-ospath}" />
+ <arg value="-z" />
+ <arg value="${resources-package-ospath}" />
+ <arg value="-f" />
+ <arg value="${intermediate-dex-ospath}" />
+ <arg value="-rf" />
+ <arg value="${srcdir-ospath}" />
+ <arg value="-rj" />
+ <arg value="${external-libs-ospath}" />
+ </exec>
+ </target>
+
+ <!-- Package the optimized application and sign it with a debug key. -->
+ <target name="debug-optimized" depends="dex-optimized, package-res">
+ <echo>Packaging ${out-debug-package}, and signing it with a debug key...</echo>
+ <exec executable="${apk-builder}" failonerror="true">
+ <arg value="${out-debug-package-ospath}" />
+ <arg value="-z" />
+ <arg value="${resources-package-ospath}" />
+ <arg value="-f" />
+ <arg value="${intermediate-dex-ospath}" />
+ <arg value="-rf" />
+ <arg value="${srcdir-ospath}" />
+ <arg value="-rj" />
+ <arg value="${external-libs-ospath}" />
+ </exec>
+ </target>
+
+ <!-- Package the application without signing it.
+ This allows for the application to be signed later with an official publishing key. -->
+ <target name="release" depends="dex-optimized, package-res">
+ <echo>Packaging ${out-unsigned-package} for release...</echo>
+ <exec executable="${apk-builder}" failonerror="true">
+ <arg value="${out-unsigned-package-ospath}" />
+ <arg value="-u" />
+ <arg value="-z" />
+ <arg value="${resources-package-ospath}" />
+ <arg value="-f" />
+ <arg value="${intermediate-dex-ospath}" />
+ <arg value="-rf" />
+ <arg value="${srcdir-ospath}" />
+ </exec>
+ <echo>It will need to be signed with jarsigner before being published.</echo>
+ </target>
+
+ <!-- Install the package on the default emulator -->
+ <target name="install">
+ <echo>Installing ${out-debug-package} onto default emulator...</echo>
+ <exec executable="${adb}" failonerror="true">
+ <arg value="install" />
+ <arg value="${out-debug-package}" />
</exec>
</target>
- <!-- Create the package file for this project from the sources. -->
- <target name="package" depends="package-dex"/>
+ <target name="reinstall">
+ <echo>Installing ${out-debug-package} onto default emulator...</echo>
+ <exec executable="${adb}" failonerror="true">
+ <arg value="install" />
+ <arg value="-r" />
+ <arg value="${out-debug-package}" />
+ </exec>
+ </target>
+
+ <!-- Uinstall the package from the default emulator -->
+ <target name="uninstall">
+ <echo>Uninstalling ${application-package} from the default emulator...</echo>
+ <exec executable="${adb}" failonerror="true">
+ <arg value="uninstall" />
+ <arg value="${application-package}" />
+ </exec>
+ </target>
+
+ <target name="clean">
+ <delete dir="${outdir}"/>
+ <delete file="proguard-dump.txt"/>
+ </target>
+
</project>