7

ADT プラグインをインストールすると、次のビルダーが Android プロジェクトに対してアクティブになります。

  • Android リソース マネージャー
  • Android プリコンパイラ
  • Java ビルダー
  • Android パッケージ ビルダー

出力ディレクトリを見ると、次の成果物が作成されます。

  • resources.ap_ (リソースとコードなしの APK/ZIP のみ)
  • gen/R.java (リソースの自動生成リスト)
  • Java バイトコードを含む .class ファイル
  • クラス.dex
  • ${プロジェクト名}.apk

私のプロジェクトでは、いくつかのコード アーティファクトを自動生成し、一般的にビルド プロセスをより厳密に制御する必要があります。最初は、Resource Manager が resources.ap_ の作成を担当し、プリコンパイラが R.java を作成し、Java ビルダーが当然のことを行い、次に Android Package Builder が classes.dex を作成し、classes.dex と resources.ap_ を結合したと考えました。 APKファイルを作成します。

最初の 2 つの手順を無効にし、resources.ap_ のコピーを配置するカスタムのプレビルダーを作成しました。これは同等であると考えました。そのような幸運はありません。

残念ながら、最終的な Android Package Builder は res/ からリソースを直接丸呑みするようで、resources.ap_ を無視します。実際、最初の 2 つのビルド手順は、R.java を生成する以外にはほとんど何もしていないようです。

これが本当に問題になるところです。最終ビルド ステップを無効にして独自の APK ファイル (まったく同じ名前) を配置すると、次のエラーが発生します。

[2011-02-27 20:25:28 - android-premium] ------------------------------
[2011-02-27 20:25:28 - android-premium] Android Launch!
[2011-02-27 20:25:28 - android-premium] adb is running normally.
[2011-02-27 20:25:28 - android-premium] Could not find android-premium.apk!

Android Package Builder (識別可能な構成がない) では、個々の ./res/ ファイルを提供する必要があります。これがないと、(Eclipse からではなく) デバイスでプロジェクトを起動できません。

この分野でより良いアイデア/経験を持っている人はいますか?

4

2 に答える 2

12

Ant スクリプトに関して、以下は Android アプリをビルドするための Ant 手順のオールインワン テンプレートです (これは、Eclipse ビルドを Ant に変換しようとしている他のユーザーにとって、不透明なバージョンよりもはるかに単純で透過的であるため、役立つかもしれません) Android ツールで自動生成されます):

<property name="workspace.dir" value="/workspace" />
<property name="project.dir" location="." />
<property name="android-platform.name" value="android-1.5" />


<!-- Framework Paths -->
<property name="android-sdk.dir" value="${workspace.dir}/EpicFramework/android-sdk"/>
<property name="android-tools.dir" value="${android-sdk.dir}/tools" />
<property name="android-platform.dir" value="${android-sdk.dir}/platforms/${android-platform.name}" />
<property name="android-platform-tools.dir" value="${android-platform.dir}/tools"/>
<property name="android-platform-jar" value="${android-platform.dir}/android.jar"/>
<property name="android-framework-src.dir" value="${workspace.dir}/EpicFramework/EpicAndroid"/>

<!-- Tool Binaries -->
<property name="adb" value="${android-tools.dir}/adb"/>
<property name="apkbuilder" value="${android-tools.dir}/apkbuilder"/>
<property name="aapt" value="${android-platform-tools.dir}/aapt"/>
<property name="dx" value="${android-platform-tools.dir}/dx"/>

<!-- Project Paths -->
<property name="src.dir"   value="${project.dir}/src" />
<property name="gen.dir"   value="${project.dir}/gen" />
<property name="res.dir"   value="${project.dir}/res" />
<property name="lib.dir"   value="${project.dir}/lib" />
<property name="build.dir" value="${project.dir}/bin" />
<property name="build.classes.dir" value="${build.dir}/classes" />

<property name="resources.file" value="${build.dir}/resources.ap_"/>
<property name="dex.file" value="${build.dir}/classes.dex" />
<property name="debug-apk.file" value="${build.dir}/${ant.project.name}-debug.apk"/>


<target name="dirs">
    <echo>Creating output directories if needed...</echo>
    <mkdir dir="${res.dir}" />
    <mkdir dir="${gen.dir}" />
    <mkdir dir="${lib.dir}" />
    <mkdir dir="${build.dir}" />
    <mkdir dir="${build.classes.dir}" />
</target>

<target name="android-resource-src" depends="dirs">
    <echo>Generating R.java from the resources...</echo>
    <exec executable="${aapt}" failonerror="true">
        <arg value="package" />
        <arg value="-M" />
        <arg path="AndroidManifest.xml" />
        <arg value="-S" />
        <arg path="${res.dir}" />
        <arg value="-I" />
        <arg path="${android-platform-jar}" />
        <arg value="-m" />
        <arg value="-J" />
        <arg path="${gen.dir}" />
    </exec>
</target>

<target name="android-compile" depends="android-resource-src">
   <echo>Compiling java files into class files...</echo>
    <javac 
      encoding="ascii"
      target="1.5"
      debug="true"
      extdirs=""
      destdir="${build.classes.dir}"
      includeAntRuntime="false"
      bootclasspath="${android-platform-jar}">
        <src path="${android-framework-src.dir}" />
        <src path="${src.dir}" />
        <src path="${gen.dir}" />
        <classpath>
            <fileset dir="${lib.dir}" includes="*.jar"/>
        </classpath>
     </javac>
</target>

<target name="android-dex" depends="android-compile">
    <echo>Converting compiled files and 3rd party libraries into ${dex.file} ...</echo>
    <apply executable="${dx}" failonerror="true" parallel="true">
        <arg value="--dex" />
        <arg value="--output=${dex.file}" />
        <arg path="${build.classes.dir}" />
        <fileset dir="${lib.dir}" includes="*.jar"/>
    </apply>
</target>

<target name="android-package-resources">
    <echo>Packaging Android resources into ${resources.file} ...</echo>
    <exec executable="${aapt}" failonerror="true">
        <arg value="package" />
        <arg value="-M" />
        <arg path="AndroidManifest.xml" />
        <arg value="-S" />
        <arg path="./res" />
        <arg value="-I" />
        <arg path="${android-platform-jar}" />
        <arg value="-f" />
        <arg value="-F" />
        <arg value="${resources.file}" />
    </exec>
</target>

<target name="android-debug" depends="android-dex, android-package-resources">
    <echo>Packaging app and signing it with the debug key</echo>
    <exec executable="${apkbuilder}" failonerror="true">
        <arg value="${debug-apk.file}" />
        <arg value="-d" />
        <arg value="-z" />
        <arg value="${resources.file}/" />
        <arg value="-f" />
        <arg value="${dex.file}" />
    </exec>
</target>

<target name="android-release" depends="android-dex, android-package-resources">
    <echo>Packaging App without signing, so that it can be signed with the official publishing key ...</echo>
    <exec executable="${apkbuilder}" failonerror="true">
        <arg value="${release-apk.file}" />
        <arg value="-u" />
        <arg value="-d" />
        <arg value="-z" />
        <arg value="${resources.file}/" />
        <arg value="-f" />
        <arg value="${dex.file}" />
    </exec>
    <echo>All generated packages need to be signed with jarsigner before they are published.</echo>
</target>

<target name="android-install" depends="android-debug">
    <echo>Removing all com.epicapplications APK files from default emulator ...</echo>
    <exec executable="${adb}" inputstring="echo hi; rm -f /data/app/com.epicapplications.*; exit;
    ">
        <arg value="shell"/>
    </exec>
    <echo>Installing ${debug-apk.file} onto default emulator...</echo>
    <exec executable="${adb}" failonerror="true">
        <arg value="install" />
        <arg value="-r" />
        <arg path="${debug-apk.file}" />
    </exec>
</target>

私が探しているのは、この Ant ビルド スクリプトのすべてまたは一部を使用できるようにすることですが、アプリを起動してデバッグするための Eclipse 統合を引き続き利用できるようにすることです。

于 2011-03-03T17:34:54.290 に答える
2

Ant スクリプトを使用して Android プロジェクトのビルド プロセスを実行しましたが、他のプロジェクトでは Maven も使用しました。これらは、CI ビルド システムの一部として、ナイトリー ビルドの一部として毎日実行するスクリプトを作成できるため、役立ちます。高度なレベルでは、これをスクリプト化して、リリース タグ、コンパイル前およびコンパイル後の AndroidManifest.xml の変更、および署名を備えたリリース ビルドを実行できます。

于 2011-02-28T05:28:15.267 に答える