2011-12-22 4 views
5

Я хотел бы создать две версии моего приложения Android, используя файл Apache ant. Проблема в том, что обе версии идентичны, кроме рекламы в облегченной версии. Я прочитал об использовании Configurations с ant до build отладочных версий.Android 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 = @[email protected]; 
} 

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


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

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

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

И наконец ... Это все, что мне нужно сделать, чтобы построить запущенные * .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> 
+0

Вы нашли решение? Я застрял в одной и той же проблеме. Не могли бы вы поделиться, если вы это исправите? – Mac

+0

Не совсем. Я развернул программу без легкой версии. Но я был бы рад найти рабочее решение. – Phidelux

ответ

3

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

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

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.