6

我正在使用 Ant 编译一个 Android APK。APK 将安装在具有 jar 文件(称为 foo.jar)的环境中。因此,APK 在编译期间需要了解 foo.jar,但我不希望它包含在 classes.dex 中(因为它已经可用)。

请注意,这不仅仅是将 jar 放在“libs”目录中的问题。虽然这解决了问题的“编译”部分,但它并没有解决将 jar 排除在 classes.dex 之外的问题。

在此先感谢您的帮助。

4

3 回答 3

6

-compile 使用了两个路径作为编译的 classpathref,但其中一个不用于 dexing。

<target name="-compile" depends="-build-setup, -pre-build, -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>
        <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>
        …
</target>

这些路径是“project.all.jars.path”和“tested.project.classpath”,但路径“tested.project.classpath”在dexing中不使用,所以你可以在预编译目标中修改它,如下所示:

<target name="-pre-compile" >
    <path id="tmp">
        <pathelement path="${toString:tested.project.classpath}"/>
        <fileset dir=“${exported.jars.dir}” >
            <include name="*.jar" />
        </fileset>
    </path>
    <path id="tested.project.classpath"><pathelement path="${toString:tmp}"/></path>
    <path id="tmp"/>        
</target>

在这里,您在编译开始之前将导出的 jar 的路径附加到“tested.project.classpath”。您可以将“exported.jars.dir”放入您的 ant.properties 文件中。

于 2014-05-17T15:09:26.900 回答
1

将 jar 放在其他目录(例如,foo/)并将其添加到编译类路径中怎么样?这样 JAR 就不会“导出”,因此 dex 工具不会对其进行操作。

于 2012-05-31T09:03:47.337 回答
1

对我有用的是在编译之前将排除 jar 复制到我的“libs”目录中,在目标“-pre-compile”中,然后在编译后再次从“libs”中删除这些文件,在 taget“-post-compile”中。

笔记:

  • 如果我将文件复制到目标“-pre-build”中,它不起作用,它必须是目标“预编译”
  • 复制后我必须设置路径“project.all.jars.path”以避免错误

在我粘贴的代码示例中,我需要属性“libs.ads.dir”引用的目录中的 jar 进行编译,但不希望它们包含在我的 jar 中:

<target name="-pre-compile">
    <copy todir="${jar.libs.dir}">
        <fileset dir="${libs.ads.dir}"/>
    </copy>

    <path id="project.all.jars.path">
        <fileset dir="${jar.libs.dir}">
            <include name="**/*.jar"/>
        </fileset>
    </path>
</target>

<target name="-post-compile" > 
    <delete>
        <fileset dir="${jar.libs.dir}" casesensitive="yes">
            <present present="both" targetdir="${libs.ads.dir}"/>
        </fileset>
    </delete>  
</target>
于 2013-11-17T07:39:25.167 回答