2010-07-29 12 views
9

Ich möchte eine App in 2 Version erstellen, eine bezahlt, eine frei, und ich kenne aapt haben eine Option "--reename-manifest-Paket" sollte helfen, aber ich don weiß nicht, wie man es in build.xml verwendet. Ich finde 2 place ich ändern kann:Benutzerdefiniertes Android build.xml zum Umbenennen Manifest Paket

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

dieser Artikel (http://blog.uncommons.org/2010/07/19/building-two-versions-of-the-same-android-app/) sagte, ich sollte "--rename-Manifest-Paket" an der zweiten Stelle hinzufügen, aber wie?

+1

Vielleicht möchten Sie stattdessen ein Android-Bibliotheksprojekt in Betracht ziehen: http://developer.android.com/guide/developing/eclipse-adt.html#libraryProject – CommonsWare

+0

Ich fand die Lösung hier: http://StackOverflow.com/ fragen/17287018/changing-application-package-name-in-custom-ant-build-step –

Antwort

8

Die Option --rename-manifest-package kann nicht mit der aaptexec ant-Task verwendet werden. Es ist eine Option, die direkt in die ausführbare Datei von aapt gehen muss;

Ich habe keine Möglichkeit gefunden, eine Datei zu bearbeiten, die tatsächlich die Art ändert, wie Eclipse baut. Also habe ich diesen Code in die Datei build.xml geschrieben, in den Projektstamm eingefügt und von der Konsole aus durch Eingabe von;

ant debug 

Und wenn Sie auf Bibliotheken angewiesen sind, müssen sie auch in die Verpackung gehen. Schauen Sie in Ihre Datei default.properties und Sie sehen den Verweis auf die lib. Dann füge das der obigen Regel hinzu, so;

Es beginnt sich immer mehr wie ein Hack zu fühlen, der mit jedem Plattform-SDK-Update brechen kann.

+0

Aktualisierung auf 2.3 sdk scheint das ganze Ding zu töten ... so traurig ... aber immer noch danke für Ihre Antwort –

+0

Ich bin läuft 2.3 und es funktioniert. –

+0

Ich bestätige, dass es mit der aktuellen (r12) Version des SDK funktioniert, an einem einfachen Beispiel. Beachten Sie, dass das Ziel, das überschrieben werden muss, "Paketressourcen" ist. Das heißt: ' Verpackungsressourcen BoD

2

manifestpackage ist der arg Wert für option "--rename-manifest-package" für Ant-Task. Verwenden Sie diese Option, um verschiedene Pakete für Ihre App zu erstellen.

target name="-package-resources" 

von Ant-Skript außer Kraft setzen

+0

Ich bin in einer Eile und schaue nicht hin mach das schon ganz ... war nur neugierig. Kann jemand bestätigen, dass diese Methode funktioniert? –

+0

Ja, das Attribut manifestpackage wurde in r17 eingeführt - siehe [link] (https://android-review.googlesource.com/#/c/32670/) –

2

ich vor kurzem den Paketnamen einer App bei der Erstellung der Lage sein, benötigt zu ändern. Dies ist eine häufige Notwendigkeit, wenn Sie eine kostenpflichtige und eine kostenlose Version einer App haben. Es ist auch nützlich, wenn Sie mehrere Versionen einer App auf Ihrem Telefon installieren möchten, z. B. ein "dev" und ein "stable" Build.

Eine Möglichkeit besteht darin, das gesamte Projekt als Bibliotheksprojekt zu transformieren und dann für jede Version ein endgültiges Projekt zu erstellen, das vom Bibliotheksprojekt abhängig ist.

Aapt Magie

Es gibt eine andere Art und Weise: aapt hat einen --rename-Manifest-Paket Parameter, der die Paketnamen der binären AndroidManifest.xml Datei in der letzten APK umschreibt.

Hier ist, was aapt Hilfe sagt:

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

Der große Vorteil ist, dass der Code nicht ändern wird, bleibt die R-Klasse identisch.

Ant

Seit r17, ist diese Option in der aapt Ant-Task, durch das manifestpackage Attribut zur Verfügung.Sie verlassen nun das -package-Ressourcen Ziel außer Kraft setzen müssen, aus dem SDK build.xml kopiert:

<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

Das Android: apk Ziel der android-Maven-Plugin hat einen renameManifestPackage Parameter.

Eine letzte Sache

Wenn Sie einige Ressourcen-IDs zur Laufzeit laden, können Sie Ihren Code zu aktualisieren.

habe ich dies zu tun:

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

Diese in der Regel große Werke, vor allem in der Bibliothek Projekte, bei denen Sie den Paketnamen nicht kennen.

Das Problem hier ist jedoch, dass die Ressourcen verarbeitet wurden, bevor der Paketname schließlich aktualisiert wurde. Paketname ist also falsch.

Es ist jedoch einfach zu beheben, indem Sie den Paketnamen einer anderen Ressource mit Resources.getResourcePackageName() abrufen.

Lassen Sie sich eine Ressource-ID zu diesem Zweck gewidmet schaffen, zum Beispiel in res/Werten/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> 

Und jetzt bekommen wir das richtige Paket:

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

Fazit

Dieser Tipp hilft beim Erstellen verschiedener Versionen der gleichen App.

+0

Sie sollten besser eine Zusammenfassung aus dem Link für die Gründlichkeit bereitstellen. – VahidNaderi

+1

Der hier erwähnte Artikel ist nützlich wegen der Bemerkung, dass der Paketname während des Builds nicht geändert wird und die Methode Resources.getIdentifier() nicht wie erwartet funktioniert. Dies trifft Sie, wenn Sie den Paketnamen von ant für ein Phonegap-Projekt (corvova) ändern möchten. –

+0

Einzige Sache, die ich hinzufügen würde, ist, dass Sie die Anpassung in custom_rules.xml, die androids build.xml importiert, hinzufügen können – tik27

Verwandte Themen