2010-07-29 17 views
9

Chcę zbudować jedną aplikację w wersji 2, jedną płatną, jedną za darmo, i wiem, że mam opcję "--rename-manifest-package", ale mogę pomóc 't know Jak używać go w pliku build.xml. znajdę 2 miejsce może zmodyfikować:Niestandardowy plik build.xml dla Androida do zmiany nazwy pakietu manifestów

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



<!-- sencod --> 
<target name="-package-resources"> 
    <echo>Packaging resources</echo> 
    <aaptexec executable="${aapt}" 
      command="package" 
      manifest="AndroidManifest.xml" 
      resources="${resource.absolute.dir}" 
      assets="${asset.absolute.dir}" 
      androidjar="${android.jar}" 
      outfolder="${out.absolute.dir}" 
    basename="${ant.project.name}" > 
</aaptexec> 
</target> 

ten artykuł (http://blog.uncommons.org/2010/07/19/building-two-versions-of-the-same-android-app/) powiedział, powinienem dodać „--rename-oczywistego-package” na drugim miejscu, ale jak?

+1

Możesz rozważyć użycie projektu biblioteki Androida zamiast: http://developer.android.com/guide/developing/eclipse-adt.html#libraryProject – CommonsWare

+0

Znalazłem rozwiązanie tutaj: http://stackoverflow.com/ pytania/17287018/zmieniając nazwę-pakietu-pakietu-in-custom-ant-build-step –

Odpowiedz

8

Opcji --rename-manifest-package nie można używać z zadaniem anta aaptexec. Jest to opcja, która musi iść prosto do pliku wykonywalnego programu, jak to;

<exec executable="${aapt}" failonerror="true"> 
    <arg value="package" /> 
    <arg value="-f" /> 
    <arg value="-v" /> 
    <arg value="--version-code" /> 
    <arg value="${version.code}" /> 
    <arg value="--debug-mode" /> 
    <arg value="-M" /> 
    <arg path="AndroidManifest.xml" /> 
    <arg value="-A" /> 
    <arg path="${asset.absolute.dir}" /> 
    <arg value="-I" /> 
    <arg path="${android.jar}" /> 
    <arg value="-F" /> 
    <arg path="${out.absolute.dir}/${resource.package.file.name}" /> 
    <arg value="-S" /> 
    <arg path="${resource.absolute.dir}" /> 
    <arg value="--rename-manifest-package" /> 
    <arg value="com.example.pro" /> 
</exec> 

Nie znalazłem możliwości edycji pliku, który faktycznie zmienia sposób budowania Eclipse. Dlatego wstawiam ten fragment kodu do pliku build.xml, umieszczam go w katalogu głównym projektu i buduję z konsoli, pisząc;

ant debug 

A jeśli jesteś zależny od bibliotek, musisz je również umieścić w opakowaniu. Sprawdź w pliku default.properties, a zobaczysz odwołanie do biblioteki. Następnie dodaj to do powyższej reguły, tak jak to;

<arg value="-S" /> 
<arg path="${android.library.reference.1}/res" /> 

Zaczyna czuć się coraz bardziej jak hack, który może zepsuć się z każdą aktualizacją SDK platformy.

+0

aktualizowanie do wersji 2.3 sdk wydaje się zabijać całość ... tak smutno ... ale wciąż dziękuję za odpowiedź –

+0

Jestem działa 2.3 i działa. –

+0

Potwierdzam, że działa z aktualną (r12) wersją sdk, używając prostego przykładu. Należy zauważyć, że celem, który musi zostać nadpisany, jest "-package-resources". To znaczy: ' Zasoby do pakowania BoD

2

manifestpackage jest wartością arg dla option "--rename-manifest-package" dla mrówek zadania. Użyj tego, aby utworzyć różne pakiety dla swojej aplikacji. przesłonić

target name="-package-resources" 

z ant skrypt

+0

Trochę się spieszę i nie patrzę na zrób to całkiem jeszcze ... był po prostu ciekawy. Czy ktoś może potwierdzić, że ta metoda działa? –

+0

Tak, atrybut manifestPack został wprowadzony w r17 - zobacz [link] (https://android-review.googlesource.com/#/c/32670/) –

2

Niedawno potrzebne, aby móc zmienić nazwę pakietu aplikacji w czasie kompilacji. Jest to powszechna potrzeba, gdy masz płatną i bezpłatną wersję aplikacji. Jest to również przydatne, jeśli chcesz zainstalować wiele wersji aplikacji na telefonie, takich jak "deweloper" i "stabilna" wersja.

Jednym ze sposobów jest przekształcenie całego projektu jako projektu bibliotecznego, a następnie utworzenie jednego końcowego projektu dla każdej wersji, która zależy od projektu biblioteki.

aapt magia

Jest też inny sposób: AAPT ma parametr --rename-manifest-pakietu, który przepisuje nazwę pakietu binarnego pliku AndroidManifest.xml w końcowym APK.

Oto co mówi AAPT help:

--rename-manifest-package 
     Rewrite the manifest so that its package name is the package name 
     given here. Relative class names (for example .Foo) will be 
     changed to absolute names with the old package so that the code 
     does not need to change. 

Wielką zaletą jest to, że kod nie zmieni, klasa R pozostaje identyczne.

Ant

Ponieważ R17, opcja ta jest dostępna w aapt Ant zadania, za pomocą atrybutu manifestpackage.Musisz przesłonić cel -package-zasoby, skopiowany z build.xml SDK:

<target name="-package-resources" depends="-crunch"> 
    <do-only-if-not-library elseText="Library project: do not package resources..." > 
    <aapt executable="${aapt}" 
    manifestpackage="com.my.package" 
    > 
... 
    </aapt> 
    </do-only-if-not-library> 
</target> 

Maven

Android: apk celem android-maven-plugin ma renameManifestPackage parametr.

Ostatnią rzeczą

Jeśli załadować jakieś identyfikatory zasobów w czasie wykonywania, być może trzeba zaktualizować swój kod.

Kiedyś to zrobić:

String packageName = context.getPackageName(); 
Resources res = context.getResources(); 
int id = res.getIdentifier("my_drawable", "drawable", packageName); 

To zazwyczaj działa świetnie, zwłaszcza w projektach bibliotecznych, w których nie znasz nazwy pakietu.

Jednak problem polega na tym, że zasoby zostały przetworzone przed ostateczną aktualizacją nazwy pakietu. Tak więc nazwaPakietu jest błędna.

Można je jednak łatwo naprawić, pobierając nazwę pakietu innego zasobu za pomocą Resources.getResourcePackageName().

Stwórzmy identyfikator zasobów przeznaczonych do tego celu, na przykład w RES/wartości/ids.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item name="used_for_package_name_retrieval" type="id"/> 
</resources> 

A teraz mamy odpowiedni pakiet:

Resources res = context.getResources(); 
String packageName = res.getResourcePackageName(R.id.used_for_package_name_retrieval); 
int id = res.getIdentifier("some_drawable", "drawable", packageName); 

Zawarcie

Ta wskazówka pomaga w tworzeniu różnych wersji tej samej aplikacji.

+0

Lepiej podać podsumowanie z linku dla dokładności. – VahidNaderi

+1

Wymieniony tutaj artykuł jest przydatny z uwagi na to, że nazwa pakietu nie została zmieniona podczas kompilacji, a metoda Resources.getIdentifier() nie działa zgodnie z oczekiwaniami. To uderzy cię, jeśli chcesz zmienić nazwę pakietu z ant na projekt Phonegap (corvova). –

+0

Jedyną rzeczą, którą chciałbym dodać jest to, że można dodać dostosowanie w custom_rules.xml, które androids importuje. – tik27

Powiązane problemy