3

一連の Android プロジェクトをビルドするために使用するマスター ビルド ファイルがあります。これらの Android プロジェクトはそれぞれ、同じ Android ライブラリ プロジェクトを参照します (これをCoreLibraryと呼びます)。以下は私の副業です。

 <target name="build" description="Builds (only) all applications">
    <subant>
        <target name="debug" />
        <fileset refid="all-applications" />
    </subant>
</target>

質問: subant タスクのすべてのアプリケーションのファイルセットで、Android プロジェクトごとにCoreLibraryが再構築されないようにするためにできることはありますか? これにより、ビルド時間が大幅に短縮されるため、何かできることを期待しています。

4

3 に答える 3

6

実際、私は最近、この問題を解決する方法を考え出しました。基本的な考え方は、私のANTファイルがすべてのライブラリプロジェクトを検索し、それらを最初にビルドしてから、残りのプロジェクトをnodepsターゲットでビルドするというものです。これにより、CoreLibraryが絶えず再コンパイルされる状況を効果的に防ぐことができます。

<?xml version="1.0" encoding="UTF-8"?>
<project name="MasterBuild">

 <!-- A property for the name of the file that contains 'android.library=true' (which is how we find library projects) -->
<property name="library.setting.file.name" value="project.properties" />

<filelist id="normal-projects" dir=".">
    <!-- You want to add your own projects here -->
    <file name="./MyProject/build.xml" />
    <file name="./MyProject2/build.xml" />
    <file name="./MyProject3/build.xml" />
</filelist>

<fileset id="all-libraries-properties" dir=".">
    <include name="*/${library.setting.file.name}" />
    <contains casesensitive="true" text="android.library=true" />
</fileset>

<pathconvert property="all-libraries" refid="all-libraries-properties">
    <globmapper from="*${library.setting.file.name}" to="*build.xml" />
</pathconvert>    

<target name="-set-debug-mode">
    <property name="build.target" value="debug" />
    <property name="install.target" value="installd" />
</target>

<target name="-set-release-mode">
    <property name="build.target" value="release" />
    <property name="install.target" value="installr" />
</target>

<target name="-build-dependencies" unless="built.dependencies">
    <property name="built.dependencies" value="true" />
    <subant buildpath="${all-libraries}" target="${build.target}" inheritall="false" />
</target>

<target name="-build-normal-projects" depends="-build-dependencies">
    <subant inheritall="false">
        <target name="nodeps" />
        <target name="${build.target}" />
        <resources refid="normal-projects" />
    </subant>
</target>

<target name="-install-normal-projects">
    <subant inheritall="false">
        <target name="${install.target}" />
        <resources refid="normal-projects" />
    </subant>
</target>

<target name="debug" depends="-set-debug-mode, -build-normal-projects" description="Builds (only) a debug-key signed application" />
<target name="release" depends="-set-release-mode, -build-normal-projects" description="Builds (only) a release-key signed application" />

<target name="installd" depends="-set-debug-mode, -install-normal-projects" description="Installs (only) a debug-key signed application" />
<target name="installr" depends="-set-release-mode, -install-normal-projects" description="Installs (only) a release-key signed application" />

</project>

このソリューションは、ライブラリの依存関係の順序を実際に検出するタスクを作成して、nodepsターゲットを使用してライブラリを構築できるようにすると改善される可能性があります。さらに、おそらく「通常のプロジェクト」を自動的に検出する方法がありますが、私はまだそれを必要としませんでした。最後に、通常のANTファイルからかなりの数のファイルを展開して、これをここに持ってきたので、何も見逃さなかったと思います。ただし、この概念は存在します。

于 2012-04-18T19:52:13.933 に答える
1

Android Maven プラグインを使用すると、それぞれのパーツをすべて個別に、またはモジュールとしてまとめてビルドでき、コア ライブラリを jar または apklib (リソースなどがある場合) として再利用できます。Maven の組み込みの依存関係メカニズムは、さまざまなライブラリの統合を処理します。

たとえば、RoboGuice や ActionBarSherlock とそのサンプル アプリを見て、それがどのように機能するかを確認してください。

また、リポジトリ マネージャーを使用してそこにライブラリを展開すると、すべてのチーム メンバーがそこからライブラリを取得でき、たとえば CI サーバーによってビルドされる可能性があります。

于 2012-04-24T21:23:07.273 に答える
0

ライブラリ プロジェクトが Java のみ (リソースなし) の場合は、既に jar として配布できます。ビルド ファイルの依存関係を解決するために、ivy + ivy ant タスクで依存関係を管理します。ただし、それらはクラスから dex ファイルにビルドされます。

于 2012-04-05T15:52:13.700 に答える