2011-12-22 6 views
5

Chciałbym zbudować dwie wersje mojej aplikacji Android przy użyciu pliku Apache ant. Problem polega na tym, że obie wersje są identyczne, z wyjątkiem reklamy w wersji Lite. Przeczytałem o używaniu Configurations z wersjami do debugowania build.Android Ant Build

Poniższa klasa definiuje niektóre stałe, do których można się odwoływać w aplikacji.

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

Oto przykład użycia tych stałych do określenia, czy rejestracja jest włączona, czy nie.

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

Teraz mogę włączyć i wyłączyć rejestrowanie w moim pliku właściwości.

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

To nie działa, ponieważ przed użyciem tego config trzeba utworzyć drugi plik konfiguracyjny i użyj filterset i kopię.

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

To dość proste, ale jak mogę to wykorzystać, aby zbudować dwie wersje mojego wniosku i bez reklamy. I w jaki sposób mogę zmienić nazwy pakietów za pomocą mrówki, aby android market zaakceptował oba pakiety (pełny i lekki).


Dziękuję za sugestie, ale nadal mam pewne problemy.

Udało mi się napisać kilka podstawowych celów, które oczyszczają moje kompilacje i kopiują wszystkie pliki potrzebne do zbudowania aplikacji w dwóch folderach/full i/lite. Mam więc dwa katalogi z taką samą zawartością. Teraz zmieniam nazwę wszystkich dopasowań nazwy pakietu aplikacji we wszystkich plikach * .java i pliku AndroidManifest (docelowy plan).

Aby naprawdę zbudować dwie różne wersje, musiałbym teraz dołączyć kod z mojego pierwszego postu. Ale w jaki sposób muszę to zrobić i jak mogę zbudować obie wersje w celu wydania i napisać wynikowe pliki * .apk do bezpośredniego kompilacji?

Wreszcie ... Czy to wszystko, co muszę zrobić, aby zbudować działające * .apks, które zostaną zaakceptowane przez rynek 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

Czy znalazłeś jakieś rozwiązanie? Utknąłem w tej samej sprawie. Czy mógłbyś podzielić się, jeśli to naprawiłeś? – Mac

+0

Niezupełnie. Rozmieściłem program bez lekkiej wersji. Ale byłbym szczęśliwy, gdyby znalazłem działające rozwiązanie. – Phidelux

Odpowiedz

3

Istnieje wiele sposobów na osiągnięcie tego, czego potrzebujesz.

Oto kilka pomysłów, które użyłem w przeszłości,

1) Posiada dwie „głowy” wniosek, że ciągnąć w wspólnej biblioteki Android. Każda głowica inicjuje dane statyczne, które konfigurują bibliotekę tak, aby zachowywała się jak lita lub pełna wersja aplikacji. Ma to tę zaletę, że można wykonać kompilację z projektów Eclipse, a także z Ant.

2) Mieć dwa oddzielne cele budowania, które mają wspólne cele kompilacji, aby utworzyć dwa oddzielne pliki APK. W skrypcie budującym Ant zbuduj dwie wersje pakietu APK. Jedna jest pełną wersją, a druga wersją, która tworzy wersję Lite. Różnica między tymi dwoma celami polega na tym, że kompilują się przy użyciu nieco innych plików (przez kopiowanie, kierowanie do różnych katalogów lub modyfikowanie za pomocą skryptów).

Wszystko to można zrobić w Ant używając celów i właściwości.

Jeśli na najwyższym poziomie twojej kompilacji masz cel wydania, w zależności od dwóch innych celów.

np.

<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> 

Następnie można użyć tych celów i właściwości zmodyfikować swój build zrobić cokolwiek można wymagać, aby zbudować każdy z plików APK.