0

I'm having this issue with my build.xml file for an Android project.

I've basically copied over the "-compile" target from the android SDKs build.xml file into my own build.xml file. However, when running ant, it keeps using the "-compile" target in the Android SDKs build.xml file instead of mine. Everywhere I read, including the comments for my build.xml file, states that this is how target overriding works, but for some reason my overridden target is not running.

Is there something else I need to do?

Appreciate the help!

UPDATE:

I'm doing this specifically to comment out the <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" /> line in -compile target.

As you can see below, there are two different echo statements. I keep seeing the one in the sdk/tools/build.xml being printed. The other clear indication is that the build is failing because it's not using my target.

Here is the target in my custom_rules.xml file

<target name="-compile" depends="-pre-build, -build-setup, -code-gen, -pre-compile">
    <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping...">
        <!-- merge the project's own classpath and the tested project's classpath -->
        <path id="project.javac.classpath">
            <path refid="project.all.jars.path" />
            <path refid="tested.project.classpath" />
            <path path="${java.compiler.classpath}" />
        </path>
        <javac encoding="${java.encoding}"
                source="${java.source}" target="${java.target}"
                debug="true" extdirs="" includeantruntime="false"
                destdir="${out.classes.absolute.dir}"
                bootclasspathref="project.target.class.path"
                verbose="${verbose}"
                classpathref="project.javac.classpath"
                fork="${need.javac.fork}">
            <src path="${source.absolute.dir}" />
            <src path="${gen.absolute.dir}" />
            <compilerarg line="${java.compilerargs}" />
             <classpath>
                 <fileset dir="." includes="libs_ext/*.jar"/>
            </classpath>
        </javac>

        <!-- if the project is instrumented, intrument the classes -->
        <if condition="${build.is.instrumented}">
            <then>
                <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo>

                <!-- build the filter to remove R, Manifest, BuildConfig -->
                <getemmafilter
                        appPackage="${project.app.package}"
                        libraryPackagesRefId="project.library.packages"
                        filterOut="emma.default.filter"/>

                <!-- define where the .em file is going. This may have been
                     setup already if this is a library -->
                <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" />

                <!-- It only instruments class files, not any external libs -->
                <emma enabled="true">
                    <instr verbosity="${verbosity}"
                           mode="overwrite"
                           instrpath="${out.absolute.dir}/classes"
                           outdir="${out.absolute.dir}/classes"
                           metadatafile="${emma.coverage.absolute.file}">
                        <filter excludes="${emma.default.filter}" />
                        <filter value="${emma.filter}" />
                    </instr>
                </emma>
            </then>
        </if>

        <!-- if the project is a library then we generate a jar file -->
        <if condition="${project.is.library}">
            <then>
                <echo level="info">Creating library output jar file... CUSTOM_RULESXML</echo>
                <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" />
                <if>
                    <condition>
                        <length string="${android.package.excludes}" trim="true" when="greater" length="0" />
                    </condition>
                    <then>
                        <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo>
                    </then>
                </if>

                <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" />

                <jar destfile="${out.library.jar.file}">
                    <fileset dir="${out.classes.absolute.dir}"
                            includes="**/*.class"
                            excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/>
                    <!--<fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />-->
                </jar>
            </then>
        </if>

    </do-only-if-manifest-hasCode>
</target>

Here is the same target in sdk/tools/build.xml file:

<target name="-compile" depends="-pre-build, -build-setup, -code-gen, -pre-compile">
    <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping...">
        <!-- merge the project's own classpath and the tested project's classpath -->
        <path id="project.javac.classpath">
            <path refid="project.all.jars.path" />
            <path refid="tested.project.classpath" />
            <path path="${java.compiler.classpath}" />
        </path>
        <javac encoding="${java.encoding}"
                source="${java.source}" target="${java.target}"
                debug="true" extdirs="" includeantruntime="false"
                destdir="${out.classes.absolute.dir}"
                bootclasspathref="project.target.class.path"
                verbose="${verbose}"
                classpathref="project.javac.classpath"
                fork="${need.javac.fork}">
            <src path="${source.absolute.dir}" />
            <src path="${gen.absolute.dir}" />
            <compilerarg line="${java.compilerargs}" />
        </javac>

        <!-- if the project is instrumented, intrument the classes -->
        <if condition="${build.is.instrumented}">
            <then>
                <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo>

                <!-- build the filter to remove R, Manifest, BuildConfig -->
                <getemmafilter
                        appPackage="${project.app.package}"
                        libraryPackagesRefId="project.library.packages"
                        filterOut="emma.default.filter"/>

                <!-- define where the .em file is going. This may have been
                     setup already if this is a library -->
                <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" />

                <!-- It only instruments class files, not any external libs -->
                <emma enabled="true">
                    <instr verbosity="${verbosity}"
                           mode="overwrite"
                           instrpath="${out.absolute.dir}/classes"
                           outdir="${out.absolute.dir}/classes"
                           metadatafile="${emma.coverage.absolute.file}">
                        <filter excludes="${emma.default.filter}" />
                        <filter value="${emma.filter}" />
                    </instr>
                </emma>
            </then>
        </if>

        <!-- if the project is a library then we generate a jar file -->
        <if condition="${project.is.library}">
            <then>
                <echo level="info">Creating library output jar file... SDK TOOLS BUILDXML</echo>
                <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" />
                <if>
                    <condition>
                        <length string="${android.package.excludes}" trim="true" when="greater" length="0" />
                    </condition>
                    <then>
                        <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo>
                    </then>
                </if>

                <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" />

                <jar destfile="${out.library.jar.file}">
                    <fileset dir="${out.classes.absolute.dir}"
                            includes="**/*.class"
                            excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/>
                          <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />
                </jar>
            </then>
        </if>

    </do-only-if-manifest-hasCode>
</target>

1 Answers1

0

To override build targets from the default build.xml, you should put your custom targets in a file named custom_rules.xml.

Code-Apprentice
  • 81,660
  • 23
  • 145
  • 268
  • Thanks for the response. So within the build.xml file the comments state the following: – Ashok SoThree May 13 '14 at 00:30
  • Thanks for the response. So within the build.xml file the comments state the following. Why doesn't this work? ` – Ashok SoThree May 13 '14 at 00:35
  • Hi @Code-Guru, So Ive tried moving the target to custom_rules.xml and it's still not overriding the target. The target "-compile" is always being run from the sdk/tools/build.xml file instead of my custom_rules.xml file. I can see this clearly as I inserted an statement in the sdk/tools/build.xml file and it's being executed. – Ashok SoThree May 13 '14 at 19:01