我正在使用Ant编译Android APK。 APK将安装在具有jar文件的环境中(称为foo.jar)。因此APK在编译期间需要了解foo.jar,但我不希望它包含在classes.dex中(因为它已经可用)。
请注意,这不仅仅是将jar放在'libs'目录中。虽然这解决了问题的“编译”部分,但它没有解决将jar保留在classes.dex之外的问题。
提前感谢您的帮助。
答案 0 :(得分: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文件中。
答案 1 :(得分:1)
如何将jar放在其他目录(例如foo/
)并将其添加到编译类路径中?这样,JAR不会被“导出”,因此dex工具不会对其进行操作。
答案 2 :(得分:1)
对我来说有用的是在编译之前将排除jar复制到我的“libs”目录,在目标“-pre-compile”中,然后在编译之后从“libs”再次删除这些文件,在taget“-post-编译”。
注意:
在我的粘贴代码示例中,我需要属性“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>