47 Stimmen

Android - mehrere benutzerdefinierte Versionen der gleichen Anwendung

Wie kann ich am besten mehrere angepasste Versionen einer Android-Anwendung bereitstellen?

Derzeit habe ich ein Skript zum Austausch des Ressourcenordners, um eine angepasste Version meiner Anwendung zu erhalten. Es funktioniert gut, aber alle benutzerdefinierten Versionen haben immer noch den gleichen Paketnamen in der AndroidManifest.xml. Daher ist es nicht möglich, zwei angepasste Versionen der App gleichzeitig zu installieren.

Dies ist eine Lösung für dieses Problem, die jedoch von Hand durchgeführt werden muss

Fällt Ihnen eine einfachere Lösung ein, oder wie könnte dies in ein Skript eingebaut werden?

(btw: es handelt sich nicht um eine Porno-/Spam-/Was-auch-immer-App, nicht einmal um eine kostenpflichtige)

0 Stimmen

Ich habe eine ähnliche Frage hier beantwortet, vielleicht kann sie auch Ihnen helfen: stackoverflow.com/questions/16840127/

2 Stimmen

Die akzeptierte Antwort ist ein wenig veraltet. Es gibt eine, die von craned gepostet wurde, die wahrscheinlich die jetzt korrekte Vorgehensweise ist.

0 Stimmen

Vous definitiv nutzen wollen Gradle Geschmäcker die von Haus aus in Android Studio enthalten ist, sogar gefördert.

1voto

Fredrik Jonson Punkte 11

Ich bin unter Verwendung des maven-Android-Plugins um dies zu erreichen. Geben Sie eine AndroidManifest.xml für das Ziel "Generierte Quellen" und eine andere AndroidManifest.xml für das Ziel "Endgültige Apk" an. Auf diese Weise behält das Quellcode-Projekt den tatsächlichen Quellcode-Paketnamen während der Generierung der R-Klasse und der Build-Phase bei, während der Name des marktangepassten Manifest-Pakets in der zweiten AndroidManifest.xml enthalten ist, die in die endgültige apk-Datei aufgenommen wird.

0voto

18446744073709551615 Punkte 15274

Ich habe ein Skript entwickelt, das die Quellen patcht; Parcheando der Quelle klingt riskant, aber in Anwesenheit der Versionskontrolle ist das Risiko akzeptabel.

Also erstellte ich eine Version, übertrug den Quellcode, erstellte die andere Version, übertrug den Quellcode und schrieb anhand der Diffs ein Parcheando-Skript in Python.

Ich bin mir nicht sicher, ob das die beste Lösung ist. (Und der Code vermisst einige os.path.joins)

Das Herzstück des Skripts ist die folgende Funktion:

# In the file 'fname',
# find the text matching "before oldtext after" (all occurrences) and
# replace 'oldtext' with 'newtext' (all occurrences).
# If 'mandatory' is true, raise an exception if no replacements were made.
def fileReplace(fname,before,newtext,after,mandatory=True):
    with open(fname, 'r+') as f:
    read_data = f.read()
    pattern = r"("+re.escape(before)+r")\w+("+re.escape(after)+r")"
    replacement = r"\1"+newtext+r"\2"
    new_data,replacements_made = re.subn(pattern,replacement,read_data,flags=re.MULTILINE)
    if replacements_made and really:
        f.seek(0)
        f.truncate()
        f.write(new_data)
        if verbose:
            print "patching ",fname," (",replacements_made," occurrence", "s" if 1!=replacements_made else "",")"
    elif replacements_made:
        print fname,":"
        print new_data
    elif mandatory:
        raise Exception("cannot patch the file: "+fname)

Und vielleicht finden Sie den folgenden Artikel nützlich:

# Change the application resource package name everywhere in the src/ tree.
# Yes, this changes the java files. We hope that if something goes wrong,
# the version control will save us.
def patchResourcePackageNameInSrc(pname):
    for root, dirs, files in os.walk('src'):
    if '.svn' in dirs:
        dirs.remove('.svn')
    for fname in files:
        fileReplace(os.path.join(root,fname),"import com.xyz.",pname,".R;",mandatory=False)

Es gibt auch eine Funktion, die Assets aus x-assets-cfgname a assets (Es hat sich herausgestellt, dass es für mich bequemer ist, ein Unterverzeichnis in assets ).

def copyAssets(vname,force=False):
    assets_source = "x-assets-"+vname+"/xxx"
    assets_target = "assets/xxx"
    if not os.path.exists(assets_source):
        raise Exception("Invalid variant name: "+vname+" (the assets directory "+assets_source+" does not exist)")
    if os.path.exists(assets_target+"/.svn"):
        raise Exception("The assets directory must not be under version control! "+assets_target+"/.svn exists!")
    if os.path.exists(assets_target):
        shutil.rmtree(assets_target)
    shutil.copytree(assets_source, assets_target, ignore=shutil.ignore_patterns('.svn'))

Nun, Sie verstehen schon. Jetzt können Sie Ihr eigenes Drehbuch schreiben.

0voto

M. Usman Khan Punkte 4242

Ich denke, der beste Weg ist, ein neues Projekt zu erstellen und kopieren Sie das Zeug. Schritte, - neues Android-Projekt ohne Klasse erstellen - Paket erstellen (Paketname sollte mit dem in der Manifestdatei übereinstimmen), oder einfach den Paketnamen in den 'gen' Ordner kopieren - Kopieren Sie die Java-Dateien - kopiere die Drawable-Ordner - Kopieren Sie die Layoutdateien - Kopiere alle anderen Dateien, die in deinem Projekt verwendet werden - Kopiere die Daten der Manifestdatei

das war für mich einfacher für die Aufgabe

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