Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Ant build——如何针对JAR进行编译,但将其从classes.dex中排除?_Android_Ant - Fatal编程技术网

Android Ant build——如何针对JAR进行编译,但将其从classes.dex中排除?

Android Ant build——如何针对JAR进行编译,但将其从classes.dex中排除?,android,ant,Android,Ant,我正在使用Ant编译一个Android APK。APK将安装在具有jar文件(称为foo.jar)的环境中。因此,APK在编译期间需要了解foo.jar,但我不希望它包含在classes.dex中(因为它已经可用) 请注意,这不仅仅是将jar放在'libs'目录中的问题。虽然这解决了问题的“编译”部分,但并不能解决将jar排除在classes.dex之外的问题 提前感谢您的帮助。将jar放在其他目录(比如,foo/)并将其添加到编译类路径中如何?这样JAR就不会被“导出”,因此不会被dex工具操

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

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


提前感谢您的帮助。

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

对我来说,有效的方法是在编译之前将排除JAR复制到我的“libs”目录中,在target“-pre-compile”中,然后在编译之后从“libs”中删除这些文件,在taget“-post-compile”中

注:

  • 如果我在target“-pre-build”中复制文件,它就不起作用了,它必须是target“pre-compile”
  • 复制之后,我必须设置路径“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>

有两个路径被-compile用作编译的classpathref,但其中一个未在索引中使用

<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”,因此您可以在预编译目标中修改它,如下所示:

<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文件中。

谢谢你的回答——我理解你的意思,如果有一个用于编译但没有被dex工具操作的类路径,它应该可以工作。每当我在编译类路径中得到jar时,它也会被dex操作。你知道一种分离它们的方法吗?通常,一个位于c中的文件夹OpLeCaspScript不添加到<代码>类。DEX < /代码>。您需要显式导出要编译成DX的JAR。但是,为了方便起见,SDK工具考虑<代码> LIBS/< /COD>文件夹作为特殊情况。该文件夹中的任何内容都自动添加到<代码>类中。DEX < /代码>。因此,尝试创建带有D的文件夹。不同的名称并将其添加到类路径。阅读了解更多详细信息。请注意,这些更改是在SDK工具r17中引入的。再次感谢您的帮助。我会投票支持您,但作为一名新手,我没有足够的声誉。我已以类似方式解决了此问题,但我在“将编译文件和外部文件转换为类。dex“步骤,如何防止dexing尝试将其拉入?如何使用gradle实现此目的?谢谢。