0

我的 Android 项目的 build.xml 文件遇到了这个问题。

我基本上已经将 android SDKs build.xml 文件中的“-compile”目标复制到了我自己的 build.xml 文件中。但是,在运行 ant 时,它一直使用 Android SDKs build.xml 文件中的“-compile”目标,而不是我的。我读到的所有地方,包括我的 build.xml 文件的注释,都指出这是目标覆盖的工作方式,但由于某种原因,我的覆盖目标没有运行。

还有什么我需要做的吗?

感谢帮助!

更新

我这样做是为了注释掉目标中的<fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />-compile

正如您在下面看到的,有两种不同的 echo 语句。我一直看到正在打印 sdk/tools/build.xml 中的那个。另一个明确的迹象是构建失败,因为它没有使用我的目标。

这是我的 custom_rules.xml 文件中的目标

<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>

这是 sdk/tools/build.xml 文件中的相同目标:

<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>
4

1 回答 1

0

要覆盖默认的构建目标build.xml,您应该将自定义目标放在一个名为custom_rules.xml.

于 2014-05-12T23:33:56.030 回答