Я хочу настроить процесс сборки, продолжая использовать плагин Android Eclipse ADT - PullRequest
7 голосов
/ 28 февраля 2011

При установленном плагине ADT для проекта Android активны следующие сборщики:

  • Диспетчер ресурсов Android
  • Прекомпилятор Android
  • Java Builder
  • Android Package Builder

При просмотре выходного каталога создаются следующие артефакты:

  • resources.ap_ (просто APK / ZIP с ресурсамии без кода)
  • gen / R.java (автоматически сгенерированный список ресурсов)
  • .class файлы с байт-кодом java
  • classes.dex
  • $ {имя-проекта} .apk

Для моего проекта я автоматически генерирую несколько артефактов кода и, как правило, нуждаюсь в более строгом контроле процесса сборки.Сначала я решил, что Resource Manager отвечает за создание resources.ap_, прекомпилятор создал R.java, java builder сделал очевидное, а затем Android Package Builder создал classes.dex, затем объединил classes.dex и resources.ap_чтобы создать файл APK.

Я отключил первые два шага и создал пользовательский предварительный компоновщик, который установил копию resources.ap_, полагая, что это будет эквивалентно.Не повезло.

К сожалению, финальный Android Package Builder, похоже, отбирает ресурсы непосредственно из res / и игнорирует мои resources.ap_.Фактически, первые два шага сборки, похоже, не делают ничего, кроме генерации 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).

У кого-нибудь есть лучшие идеи / опыт в этом пространстве?

Ответы [ 2 ]

12 голосов
/ 03 марта 2011

Что касается сценариев Ant, ниже приведен мой универсальный шаблон шагов Ant для создания приложения Android (это может быть полезно для других, пытающихся перевести сборку 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 для запуска и отладки приложения.

2 голосов
/ 28 февраля 2011

Мы использовали Ant-скрипты, чтобы сделать процесс сборки для проектов Android, другие также использовали Maven.Это помогает, так как вы можете написать их для запуска каждый день как часть ночных сборок, как часть вашей системы сборки CI.На продвинутом уровне вы можете написать скрипт для сборки релизов с тегами релизов, модификациями и подписью AndroidManifest.xml до и после компиляции.

...