20 Stimmen

Pflege sowohl der kostenlosen als auch der Profi-Version einer Anwendung

Ich möchte eine PRO-Version meiner Anwendung für Android erstellen und habe mich gefragt, wie ich mein Repository strukturieren soll.

Denn ich habe einen Stamm und Funktionszweige. Ich würde gerne eine Pro-Version in einen anderen Zweig einfügen, aber vielleicht gibt es einen besseren Weg? Vielleicht sollte ich zum Beispiel zwei Zweige erstellen - einen für die kostenlose Version, den anderen für die Pro-Version?

Die Pro-Version wird zusätzliche Funktionen haben und werbefrei sein, so dass ich z.B. die AdMob-Bibliotheken nicht in die Pro-Version aufnehmen möchte.

Haben Sie Erfahrungen oder Vorschläge, wie das Repository in diesem Fall am besten zu strukturieren ist?

EDIT: Ich glaube, ich habe die beste Lösung (für meine Anwendung) in diesem Thread gefunden: http://groups.google.com/group/Android-developers/browse_thread/thread/4ad3d67f735f16d7/948b4f9eee2490a3

Der dort besprochene Trick besteht darin, eine weitere Anwendung zu haben, die nur dazu dient, die PRO-Funktionalität in der eigentlichen Anwendung freizuschalten. Die Freischalt-App ist auf dem Markt kostenpflichtig und die eigentliche App prüft lediglich, ob sie auf dem Gerät vorhanden ist.

15voto

BenTobin Punkte 1201

Ich weiß, dass Sie Ihre Entscheidung bereits getroffen haben, aber ich habe einen weiteren Vorschlag, der anderen helfen könnte.

Ich verwende Git für mein Repository. Das Erstellen und Verwalten von Zweigen ist sehr einfach. Ich habe mein Master-Repository "pro" und einen "freien" Zweig. Ich nehme alle Codeänderungen am Master-Repository vor. Mein "freier" Zweig unterscheidet sich nur durch die Änderungen, die das "freie" Verhalten auslösen. Wenn ich mit den Änderungen am Code fertig bin, übertrage ich ihn in den Master-Zweig, wechsle dann in den freien Zweig und verwende den Befehl "rebase", um ihn mit dem Master-Zweig abzugleichen.

Es macht die Änderung rückgängig, durch die es sich wie die "kostenlose" Version verhält, wendet die von mir vorgenommenen Änderungen auf die Master-Version an und wendet dann die "kostenlosen" Änderungen erneut an.

Ich muss nicht zwei Versionen pflegen. Ich muss nicht daran denken, irgendeinen Schalter umzulegen oder immer wieder die gleichen Änderungen vorzunehmen. Das ist ziemlich raffiniert und gefällt mir besser als eine zweite App, die das Pro-Verhalten auslöst, weil ich Bibliotheken entfernen kann, die für die betreffende Version nicht benötigt werden.

11voto

Paddy Punkte 32391

Ich würde vorschlagen, nicht zwei Verzweigungen beizubehalten, sondern entweder Laufzeit- oder Kompilierzeitschalter zu haben, um die PRO-Funktionalität für die kostenlose Version zu deaktivieren. Sie könnten sogar nicht benötigte DLLs beim Aufbau entfernen.

Die Beibehaltung von zwei Zweigen bedeutet, dass Probleme an zwei Stellen behoben werden müssen, was mit dem Auseinanderdriften der Zweige unweigerlich zu einem größeren Problem wird.

7voto

ProgMasta Punkte 141

Ich habe eine einfache Möglichkeit gefunden, dies in Eclipse zu tun. Ich war ziemlich überrascht, wie einfach es war, nachdem ich es entdeckt hatte.

  1. Prüfen Sie in den Projekteigenschaften für com.app.free die Option "Is Library" auf true (Sie müssen das Projekt mindestens einmal kompiliert haben, bevor Sie dies ändern, sonst erhalten Sie eine Fehlermeldung, dass Bibliotheksprojekte nicht kompiliert werden können; wenn Sie diese Fehlermeldung erhalten, deaktivieren Sie einfach die Option, kompilieren Sie und prüfen Sie sie erneut.
  2. neues Projekt com.app.pro erstellen
  3. Fügen Sie das Projekt com.app.free als Bibliothek in den Projekteinstellungen im Android-Abschnitt des Pro-Projekts hinzu.
  4. eine neue Klasse MyApplication in com.app.pro erstellen und Application erweitern
  5. override onCreate() HINWEIS: Für die Kollegen, die kopieren und einfügen, ist dies NICHT dasselbe wie das onCreate(Bundle savedInstanceState) Bundle einer Aktivität. Sie müssen das Argument Bundle entfernen, da es sich um eine Anwendung und nicht um eine Aktivität handelt.
  6. Fügen Sie dann die statische Variable hinzu oder setzen Sie sie, die in der Validierungsmethode gelesen wird, um die Lizenz zu validieren. EX: IS_PRO = true; dann liest die Validierungsmethode die Variable und gibt true zurück, wenn IS_PRO true ist.
  7. Kopieren Sie den Inhalt des Manifests von com.app.free nach com.app.pro
  8. Hinzufügen von Android:name="MyApplication " zum Anwendungs-Tag im com.app.pro-Manifest
  9. com.app.free vor dem Attribut name für alle Aktivitäten anhängen. (dadurch weiß die Anwendung, dass Ihre Aktivitäten im Bibliothekspaket zu finden sind, das die kostenlose Version ist) EX: Android:name=".MainActivity" => Android:name="com.app.free.MainActivity"
  10. Jetzt kompilieren und Sie haben eine Pro-Version

Diese Methode setzt voraus, dass Sie eine globale Validierungsmethode verwenden. Ich habe zum Beispiel eine Klasse erstellt, die Benutzer mit einer DB verbindet, die auf meiner Domäne gehostet wird und feststellt, wann der Benutzer die App zum ersten Mal installiert hat. Für alle Pro-Only-Aktivitäten prüfe ich LicenseClass.isValidLicense(), die Daten vergleicht und true zurückgibt, wenn es weniger als die gewünschte Anzahl von Tagen ist. In der Funktion isValidLicense() prüfe ich, ob Application.IS_PRO auf true gesetzt ist und gebe true zurück, wenn dies der Fall ist.

Sie können also so viele Änderungen vornehmen, wie Sie wollen, und müssen nur beide neu kompilieren. Das Einzige, was Sie beachten müssen, ist, dass alle Änderungen, die Sie im Manifest com.app.free vornehmen, auch in der Pro-Version übernommen werden müssen. Aber das ist bei jeder Anwendung der Fall, denn bei Android-Apps müssen Sie angeben, welche Aktivitäten Sie auf jeden Fall verwenden werden.

HINWEIS: Sie können alle Assets und Ressourcen löschen (nicht jedoch den Ordner res selbst), die bei der Projekterstellung automatisch generiert werden, da sie nicht verwendet werden. Außerdem ist die einzige benötigte Klassendatei die MyApplication-Datei aus Schritt 3. Das bedeutet, dass Sie auch die MainActivity.class löschen können, die ebenfalls automatisch generiert wird, da sie ebenfalls nie verwendet wird. Sie können auch alle Tags entfernen, die in der Pro-Version nicht verwendet werden. EX: Ich habe eine BuyPro-Aktivität, die sich öffnet, wenn die Validierung fehlschlägt. Da die Validierung in der Pro-Version nie fehlschlägt, ist sie nicht erforderlich. Natürlich sind all diese Löschungen optional, ich wollte Sie nur wissen lassen, was ich gelernt habe.

CONS: Der einzige Nachteil, den ich bisher gefunden habe, ist, dass Sie keine Switch-Anweisungen mit Ihren Ressourcenvariablen verwenden können, da sie keine Konstanten mehr sind. Wenn Sie also ein Projekt als Bibliothek verwenden, wird jede Variable, die Sie z. B. in der Datei strings.xml erstellen, automatisch überschrieben, wenn Sie in der Pro-Version eine Variable mit demselben Namen deklarieren. Für mich ist das kein Nachteil, denn ich mag die Verwendung von Schalterzuständen in Java nicht, weil sie nur den Wechsel auf den Typ int zulassen und konstante Werte erfordern. Das bedeutet, dass ich in Java normalerweise sowieso if ... else-Statements verwenden muss. Außerdem hilft Eclipse bei der Konvertierung von switch-Anweisungen, wenn man den Cursor auf das switch-Schlüsselwort setzt, Strg+1 drückt und dann auf convert to if else klickt. Außerdem finde ich es ziemlich nützlich, dass die Ressourcen überschrieben werden, weil man Dinge tun kann, wie app_name von "app free" zu "app pro" zu ändern oder ein neues Drawable für z.B. das App-Icon hochzuladen, indem man einfach die neue Version an der Stelle erstellt, an der sie in der freien App existiert. EX: Wenn die res/values/string.xml z.B. 100 String-Variablen enthält, Sie aber in der Pro-Version nur den app_name ändern wollen oder müssen, erstellen Sie einfach die res/values/string.xml neu (NICHT kopieren) und fügen Sie die Variable app_name hinzu. Jetzt wird die app_name-Variable in der kostenlosen Version überschrieben, was bedeutet, dass die Datei string.xml in der Pro-Version nur noch 1 Variable statt 100 enthalten muss, da dies die einzige Variable ist, die sich geändert hat. Easy Peasy :-)

EDIT: Ich habe herausgefunden, dass Eclipse nicht zulässt, dass man .apk's für Bibliotheken exportiert, also muss man die Option "Is Library" in der kostenlosen Version deaktivieren, nachdem man sie als Bibliothek in der Pro-Version hinzugefügt hat. Soweit ich das beurteilen kann, ist das Einzige, was dies bewirkt, dass Eclipse Sie nicht vor dem Problem der Switch-Anweisung warnt. Ansonsten scheint es gut zu funktionieren.

1voto

yanchenko Punkte 55207

Haben Sie eine einzige Version mit public static final boolean IS_PRO die das Free/Pro-Verhalten bestimmen würden.

EDITAR:
Die Sache mit dem Paket. Sagen wir, alle Ihre Klassen befinden sich unter com.myapp.android.free .
Dann deklarieren Sie in AndroidManifest.xml package= "com.myapp.android" für die kostenpflichtige Version und package="com.myapp.android.free" für die kostenlose Version.
Wenn Sie vollständige Namen für Aktivitäten, Dienste usw. verwenden, müssen Sie nichts weiter ändern.

Ich würde mir nicht die Mühe machen, ungenutzte Bibliotheken aus der kostenpflichtigen Version zu entfernen. Wenn Sie das tun, müssen Sie dies manuell tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X