6

Ant を使用して Android APK をコンパイルしています。APK は、jar ファイル (foo.jar と呼びます) がある環境にインストールされます。したがって、APK はコンパイル中に foo.jar について知る必要がありますが、classes.dex に含めたくありません (既に利用可能であるため)。

これは単に jar を「libs」ディレクトリに置くだけの問題ではないことに注意してください。これで問題の「コンパイル」部分は修正されますが、jar を classes.dex から除外するという問題は解決しません。

よろしくお願いします。

4

3 に答える 3

6

-compile でコンパイル用の classpathref として使用されるパスは 2 つありますが、そのうちの 1 つは 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」に追加します。ant.properties ファイルに「exported.jars.dir」を入れることができます。

于 2014-05-17T15:09:26.900 に答える
1

私にとってうまくいくのは、コンパイル前にターゲット「-pre-compile」で除外jarを「libs」ディレクトリにコピーし、コンパイル後にターゲット「-post-compile」でこれらのファイルを「libs」から再度削除することです。

ノート:

  • ターゲット「-pre-build」にファイルをコピーしても機能しませんでした。ターゲット「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>
于 2013-11-17T07:39:25.167 に答える
1

jar を他のディレクトリ (たとえばfoo/) に置き、それをコンパイル クラスパスに追加するのはどうですか? そうすれば、JAR は「エクスポート」されないため、dex ツールによって処理されません。

于 2012-05-31T09:03:47.337 に答える