Android Ant Build - PullRequest
       13

Android Ant Build

5 голосов
/ 22 декабря 2011

Я хотел бы построить две версии моего Android приложения, используя файл Apache ant. Проблема в том, что обе версии идентичны, за исключением рекламы в облегченной версии. Я читал об использовании Configurations с ant для build отладочной версии.

Следующий класс определяет некоторые константы, на которые можно ссылаться в приложении.

public class Config {
    // Whether or not to include logging in the app.
    public final static boolean LOGGING = true;
}

И вот пример того, как использовать эти константы, чтобы определить, включено ли ведение журнала.

if (Config.LOGGING) {
    Log.d(TAG, "[onCreate] Success");
}

Теперь я могу включить и отключить ведение журнала в моем файле свойств.

# Turn on or off logging.
config.logging=true

Это не работает, потому что перед использованием этой конфигурации мне нужно создать второй файл конфигурации, использовать filterset и скопировать.

public class Config {
    // Whether or not to include logging in the app.
    public final static boolean LOGGING = @CONFIG.LOGGING@;
}

Это довольно просто, но как я могу использовать это для создания двух версий моего приложения с рекламой и без рекламы. И как я могу изменить имена пакетов, используя ant, чтобы android market принимал оба пакета (Full и Lite).


Спасибо за ваши предложения, но у меня все еще есть некоторые проблемы.

Мне удалось написать некоторые базовые цели, которые очищают мои сборки и скопировать все файлы, необходимые для сборки приложения, в две папки / full и / lite. Итак, у меня есть две директории с одинаковым содержанием. Теперь я переименую все совпадения имени пакета приложения во всех файлах * .java и в файле AndroidManifest (цель подготовки).

Чтобы действительно построить две разные версии, мне нужно было бы включить код из моего первого поста. Но как мне это сделать и как я могу собрать обе версии в целевой версии и записать полученные * .apk файлы в директорию сборки?

Наконец-то ... Это все, что мне нужно сделать, чтобы создать запущенные * .apks, которые будут приняты на рынке Android?

<?xml version="1.0" encoding="UTF-8"?>
<project name="my.application" default="help" basedir=".">
    <!-- Load the custom property files -->
    <property file="build.properties" />
    <property file="passwords.properties" />

    <!-- Set global properties for this build -->
    <property name="my.application.pkg" value="my.application"/>
    <property name="my.application.pkg.full" value="my.application.full"/>
    <property name="my.application.pkg.lite" value="my.application.lite"/>

    <property name="my.application" location="."/>
    <property name="my.application.build" location="build"/>
    <property name="my.application.src" location="src"/>
    <property name="my.application.res" location="res"/>
    <property name="my.application.gen" location="gen"/>

    <property name="my.application.full" location="full"/>
    <property name="my.application.full.src" location="full/src"/>
    <property name="my.application.full.res" location="full/res"/>
    <property name="my.application.full.gen" location="full/gen"/>
    <property name="my.application.full.build" location="full/build"/>

    <property name="my.application.lite" location="lite"/>
    <property name="my.application.lite.build" location="lite/build"/>
    <property name="my.application.lite.src" location="lite/src"/>
    <property name="my.application.lite.res" location="lite/res"/>
    <property name="my.application.lite.gen" location="lite/gen"/>

    <!-- Create and update the local.properties file -->
    <loadproperties srcFile="local.properties" />

    <!-- Load the ant.properties file -->
    <property file="ant.properties" />

    <!-- Load the project.properties file -->
    <loadproperties srcFile="project.properties" />

    <!-- Quick check on sdk.dir. -->
    <fail
        message="sdk.dir is missing."
        unless="sdk.dir" />

    <!-- Version-tag: 1 -->
    <import file="${sdk.dir}/tools/ant/build.xml" />

    <target name="release" depends="report, prepare">
        <echo>Building the target!</echo>
    </target>

    <target name="prepare" depends="cleanup" >
        <!-- Copy the Manifest.xml to the full copy -->
        <copyfile src="${my.application}/AndroidManifest.xml" 
            dest="${my.application.full}/AndroidManifest.xml" />

        <!-- Copy the source files to the full copy -->
        <copy todir="${my.application.full.src}" overwrite="true">
            <fileset dir="${my.application.src}" /> 
        </copy>

        <!-- Copy the resources to the full copy -->
        <copy todir="${my.application.full.res}" overwrite="true">
            <fileset dir="${my.application.res}" /> 
        </copy>

        <!-- Copy the generated to the full copy -->
        <copy todir="${my.application.full.gen}" overwrite="true">
            <fileset dir="${my.application.gen}" /> 
        </copy>

        <!-- Replace the package name in the full manifest file -->
        <replaceregexp file="${my.application.full}/AndroidManifest.xml"
            match='package="(.*)"'
            replace='package="${my.application.pkg.full}"'
            byline="false" />

        <!-- Change the package name in all Java files -->
        <replaceregexp flags="g" byline="false">
            <regexp pattern="${my.application.pkg}" /> 
            <substitution expression="${my.application.pkg.full}" />
            <fileset dir="${my.application.full.src}" includes="**/*.java" /> 
        </replaceregexp>

        <!-- Copy the Manifest.xml to the lite copy -->
        <copyfile src="${my.application}/AndroidManifest.xml" 
            dest="${my.application.lite}/AndroidManifest.xml" />

        <!-- Copy the source files to the lite copy -->
        <copy todir="${my.application.lite.src}" overwrite="true">
            <fileset dir="${my.application.src}" /> 
        </copy>

        <!-- Copy the resources to the lite copy -->
        <copy todir="${my.application.lite.res}" overwrite="true">
            <fileset dir="${my.application.res}" /> 
        </copy>

        <!-- Copy the generated to the lite copy -->
        <copy todir="${my.application.lite.gen}" overwrite="true">
            <fileset dir="${my.application.gen}" /> 
        </copy>

        <!-- Replace the package name in the lite manifest file -->
        <replaceregexp file="${my.application.lite}/AndroidManifest.xml"
            match='package="(.*)"'
            replace='package="${my.application.pkg.lite}"'
            byline="false" />

        <!-- Change the package name in all Java files -->
        <replaceregexp flags="g" byline="false">
            <regexp pattern="${my.application.pkg}" /> 
            <substitution expression="${my.application.pkg.lite}" />
            <fileset dir="${my.application.lite.src}" includes="**/*.java" /> 
        </replaceregexp>
    </target>

    <!-- Deletes all directories, not needed anymore after compiling the source files -->
    <target name="cleanup">
        <!-- Delete the full version build dir -->
        <delete dir="${my.application.full}"/>
        <!-- Delete the lite version build dir -->
        <delete dir="${my.application.lite}"/>
        <!-- Delete the *.apk file -->
        <delete file="my.application.full.apk"/>
        <!-- Delete the *.apk file -->
        <delete file="my.application.lite.apk"/>
    </target>
</project>

1 Ответ

3 голосов
/ 22 декабря 2011

Есть несколько способов достичь желаемого.

Вот несколько идей, которые я использовал в прошлом,

1) Имейте две "головы" приложения, которые тянут в общую библиотеку Android. Каждая голова инициализирует статические данные, которые настраивают библиотеку для работы в качестве облегченной или полной версии вашего приложения. Преимущество в том, что вы можете выполнять сборку из проектов Eclipse, а также с помощью Ant.

2) Имеют две отдельные цели сборки, которые имеют общие цели сборки, для создания двух отдельных файлов apk. В скрипте сборки Ant сделайте две версии APK. Один, который является полной версией, а затем другой, который создает облегченную версию. Разница между этими двумя целями заключается в том, что они создаются с использованием немного разных файлов (либо путем копирования, перенаправления в разные каталоги или изменения с помощью скриптов).

Все это можно сделать в Ant, используя цели и свойства.

Если на верхнем уровне вашей сборки у вас есть цель выпуска в зависимости от двух других целей.

, например

<target name="release"
  depends="release-Full, release-Lite">
</target>

<target name="release-Full">
  <ant antfile="thisbuild.xml" inheritAll="true" target="full">
    <property name="MyCustomProperty" value="Full" />
  </ant>
</target>



<target name="release-Lite">
  <ant antfile="thisbuild.xml" inheritAll="true" target="lite">
    <property name="MyCustomProperty" value="Lite" />
   </ant>
 </target>

Затем вы можете использовать эти цели и свойства, чтобы изменить свою сборку, чтобы сделать все, что вам нужно для сборки каждого из файлов APK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...