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.

24voto

larham1 Punkte 11069

Vielleicht war das eingebaute Android-"Bibliotheks"-Konzept zum Zeitpunkt des ursprünglichen Beitrags noch nicht ganz ausgereift, aber es könnte die bevorzugte Methode im Jahr 2011 sein. Befolgen Sie diese Schritte für ein Ameisen-Build:

Ausgehend von einer funktionierenden Anwendung (nennen wir sie Verzeichnis "myOrigApp", Paket com.foo.myapp), fügen Sie einfach diese Zeile zu "default.properties" hinzu, um sie zu einer Bibliothek zu machen:

android.library=true

Erstellen Sie nun eine neue Anwendung in einem Geschwisterverzeichnis, wie Sie es wünschen (nennen wir es Verzeichnis "sibling", Paket com.foo.myVariant). Erstellen Sie z. B. mit Intellij Idea ein Projekt "von Grund auf" mit dem Verzeichnis "sibling" und es werden alle Dateien/Verzeichnisse erstellt, die Sie normalerweise benötigen würden.

Bearbeiten Sie in diesem neuen, untergeordneten Verzeichnis die Datei "default.properties", um die Abhängigkeit hinzuzufügen:

android.library.reference.1=../myOrigApp

Kopieren Sie das Manifest aus dem Originalverzeichnis:

cd sibling
cp ../myOrigApp/AndroidManifest.xml  ../myOrigApp/local.properties ../myOrigApp/build.properties  .

Bearbeiten Sie die kopierte Manifestdatei, um den Paketnamen in Ihre neue Variante "com.foo.myVarient" zu ändern; das ist die einzige Änderung.

Wenn Sie nur die Ant-Build-Skripte ausführen, sind Sie vielleicht schon fertig. (Ich musste nur Signierschlüssel einrichten.)

Wenn Sie eine IDE wie Idea so einrichten möchten, dass das Bibliotheksprojekt vom Variantenprojekt abhängt, führen Sie die folgenden Schritte aus, um ein Bibliotheksprojekt zum Variantenprojekt hinzuzufügen (vorausgesetzt, Sie haben bereits ein Projekt für beide Projekte eingerichtet):

  • Öffnen Sie das ursprüngliche Projekt, rufen Sie die Projekteinstellungen auf, wählen Sie Ihre Facette aus, markieren Sie "Ist Bibliotheksprojekt" und speichern Sie.
  • Öffnen Sie das Variantenprojekt, rufen Sie die Projekteinstellungen auf und wählen Sie Module
  • Ein Modul hinzufügen
  • Wählen Sie "Vorhandenes Modul importieren".
  • Navigieren Sie zum Originalverzeichnis (myOrigApp) und wählen Sie die .iml-Datei (IntelliJ-Projektquelldatei) aus.
  • Klicken Sie auf "Fertig stellen". (Das Bibliotheksprojekt wird als Modul innerhalb des Variantenprojekts hinzugefügt).
  • Klicken Sie in der Modulliste auf das Projekt Variant, um es auszuwählen.
  • Wählen Sie auf der rechten Seite die Registerkarte "Abhängigkeiten".
  • Klicken Sie auf "Hinzufügen ".
  • Wählen Sie "Modulabhängigkeit " (Es sollte eine Liste erscheinen, die den Namen des Moduls/der Bibliothek enthält, das/die Sie zuvor dem Projekt hinzugefügt haben - möglicherweise der einzige Eintrag in der Liste).
  • Wählen Sie das hinzugefügte Bibliotheksprojekt aus und drücken Sie OK (es wird der Liste der Abhängigkeiten Ihres Projekts hinzugefügt).
  • Drücken Sie OK, um die Konfiguration des Projekts abzuschließen. (Es sollten 2 Module angezeigt werden, in denen die Ressourcen und Klassen der Bibliothek verfügbar sind und im Variant-Projekt erkannt werden).

0 Stimmen

Kredit an soledadpenades.com/2011/06/17/ für die Idea-Schritte

0 Stimmen

Ich glaube, diese Lösung gab es damals noch nicht, aber sie ist auf jeden Fall besser als das Durchgehen von Quelldateien mit regulären Ausdrücken. Ich habe die Lösung von Prashast schon früher verwendet und sie hat gut funktioniert. Aber für neue Projekte bevorzuge ich das Bibliotheksprojekt.

0 Stimmen

Diese Lösung gefällt mir viel besser, als Dutzende von Quelldateien zu ändern (ein Albtraum für die Versionsverwaltung!).

6voto

Prashast Punkte 5615

Für etwas Ähnliches habe ich einfach eine Antlib-Aufgabe verwendet und bin dann alle Java- und Xml-Dateien durchgegangen, um meine alte Paketzeichenfolge durch die neue Paketzeichenfolge zu ersetzen. Dabei spielte es keine Rolle, ob die Dateien nicht in den korrekten src-Pfaden gemäß dem Paket lagen. Eine Regex-Ersetzung für alle Dateien reichte mir aus, um dies zu bewerkstelligen...

Zum Beispiel, um es in allen Ihren Java-Dateien im src-Verzeichnis zu ersetzen:

 <replaceregexp flags="g" byline="false">
    <regexp pattern="old.package.string" /> 
    <substitution expression="new.package.string" />
    <fileset dir="src" includes="**/*.java" /> 
 </replaceregexp>

1 Stimmen

Damit ist mein Problem gelöst, vielen Dank. Ich verwende jetzt zwei replaceregexp. Eine ist genau wie Ihre und eine andere für das Ersetzen des Paketnamens in der AndroidManifest.xml.

0 Stimmen

Bei mir funktioniert das nicht, weil sich alle Quelldateien noch in einer Verzeichnisstruktur befinden, die dem alten Paketnamen entspricht. Wie haben Sie das Problem gelöst?

0 Stimmen

Für mich spielte der Speicherort der Quelldatei keine Rolle. Solange sie die richtigen Paketinformationen haben. Das Öffnen in Eclipse funktioniert aber möglicherweise nicht. Ich hatte dies nur mit der Ant-Build und die Verwendung der generierten apk-Datei verwendet.

6voto

craned Punkte 2923

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

Es scheint alle Grundlagen sehr gut zu erklären. Ich habe gerade die Konvertierung zu Gradle und es funktioniert hervorragend. Benutzerdefinierte App-Symbole, Namen und Zeichenfolgen usw.

Wie auf der Website erklärt wird, bestand ein Teil des Zwecks hinter diesem Design darin, es dynamischer zu gestalten und es einfacher zu machen, mehrere APKs mit im Wesentlichen demselben Code zu erstellen, was sich ähnlich anhört wie das, was Sie tun.

Ich habe es wahrscheinlich nicht optimal erklärt, aber diese Website leistet gute Arbeit.

0 Stimmen

Das ist jetzt der richtige Weg. +1

4voto

CommonsWare Punkte 950864

Die verknüpfte Lösung muss nicht von Hand gemacht werden. Beachten Sie, dass die package Attribut in der Datei <manifest> Element muss nicht der Ort sein, an dem sich der Code befindet, solange Sie die vollqualifizierten Klassen an anderer Stelle im Manifest angeben (z. B., activity android:name="com.commonsware.android.MyActivity" よりも activity android:name=".MyActivity" ). Skripten Sie Ihre Manifeständerung und verwenden Sie Ant, um eine neue APK zu erstellen. AFAIK, das sollte funktionieren.

7 Stimmen

Dadurch wird die automatisch erzeugte R-Datei zerstört. Sie müssen also mehr oder weniger alle Ihre Quelldateien durchgehen und den Import der R-Datei ändern (Punkt 8).

0 Stimmen

Wir haben das R-Problem gelöst. import old.package.string.*; import new.package.string.*; Dies importiert einfach R für beide Builds.

2voto

figofuture Punkte 251

Mehrere Partner unterstützen config.xml vorbereiten

Projekt für verschiedene Partner erstellen

<!--partner.dir, pkg.name, ver.code, ver.name are input from command line when execute 'ant' -->

<!-- set global properties for this build -->
<property name="build.bin" location="bin"/>
<property name="build.gen" location="gen"/>
<property name="src" location="src"/>
<property name="res" location="res"/>

<target name="preparefiles" description="Prepare files for different partner" >
    <delete dir="${build.bin}" />
    <delete dir="${build.gen}" />

    <copy todir="${res}" overwrite="true" />
        <fileset dir="${partner.dir}/res" /> 
    </copy>

    <!-- change the import in all Java source files -->
    <replaceregexp file="AndroidManifest.xml"
        match='android.versionCode="(.*)"'
        replace='android.versionCode="${ver.code}"'
        byline="false">

    <replaceregexp file="AndroidManifest.xml"
        match='android.versionName="(.*)"'
        replace='android.versionName="${ver.name}"'
        byline="false">

    <replaceregexp file="AndroidManifest.xml"
        match='package="(.*)"'
        replace='package="${pkg.name}"'
        byline="false">

    <!-- change the package name in AndroidManifest -->
    <replaceregexp flags="g" byline="false">
        <regexp pattern="import(.*)com.myproject.com.R;" /> 
        <substitution expression="import com.${pkg.name}.R;" />
        <fileset dir="${src}" includes="**/*.java" /> 
    </replaceregexp>

    <replaceregexp flags="g" byline="false">
        <regexp pattern="(package com.myproject.com;)" /> 
        <substitution expression="\1&#10;import com.${pkg.name}.R;" />
        <fileset dir="${src}" includes="**/*.java" /> 
    </replaceregexp>
</target>

Dateien vorbereiten $ ant -f config.xml -Dpartner.dir="xxx" -Dpkg.name="xxx" -Dver.code="xxx" -Dver.name="xxx" preparefiles

build.xml erstellen Erstellen Sie $ ant debug oder $ ant release

0 Stimmen

Dies ist gut, wenn Sie nur mit Ant arbeiten. Wenn Sie in Eclipse arbeiten, können Sie nach dem Ausführen der Regexp arbeiten, aber wenn Sie eine Ressource ändern, werden Sie wieder stecken.

0 Stimmen

Die Datei hatte einige kleinere Probleme, aber alles in allem eine gute Idee! Ich habe sie kopiert und für die Verwendung in einem Kundenprojekt etwas abgeändert. Danke!

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