2013-03-19 6 views
9

Ich habe zwei Programme. Zuerst ist eine Desktop-App (C#) und die andere ist eine Android-App.So erstellen Sie mehrere App von einer einzelnen Android-App mit unterschiedlichen Inhalten

Die C# one erstellt einige Textdateien und legt sie in einige Android App-Ordner. So können wir mehrere Android-Apps mit unterschiedlichen Inhalten haben. Die Android App ist vorkompiliert. und die C# -App legt einfach die Testdateien (mit 7za) hinein und packt sie neu (mit zipalign).

Das Problem ist, Alle diese Apps haben eine einzige Quelle! bedeutet gleicher Paketname und gleicher App-Name!

Und wie Sie wissen, Android sieht gleiche Paketnamen als die gleichen Anwendungen! Wie kann ich dieses Problem lösen? und erstellen Sie separate Anwendungen von einem einzigen Android-App mit verschiedenen Textdateien (Inhalt)

Weitere Details: Ich habe einen einzigen android app (test.apk). Meine C# -App sollte diese Zip-Datei bearbeiten und neu packen. Das Einfügen von Textdateien in den Ordner "Assets" funktioniert gut. Aber mit dieser Methode sind die App-Ausgaben der C# -Apps alle gleich! Ich kann sie nicht separat auf Mobile installieren, weil Android OS sie gegenseitig ersetzt.

+0

versucht haben, zum Thema neuesten Google-Guide lesen? Irgendwann vielleicht (wenn möglich), die unseren Standpunkt ändern und einem Standardverhalten entsprechen, kann viel Code sparen. Das _key concept_ von Android OS ist, dass die Lebensdauer der Anwendung vom Betriebssystem gehandhabt wird. Ihre Frage scheint etwas zu berühren, das auf eine vordefinierte Weise ausgeführt werden sollte, bevor ich versuche, die _Google_-Richtlinien einzuhalten. Hier zur Benutzerreferenz http://developer.android.com/index.html. – jay

+0

Ich habe versucht, AndroidManifest.xml zu ersetzen. aber in einer apk-Datei ist die manifest.xml als binär codiert. Wie kann ich meine neue .xml-Datei in eine binär codierte Form wie die ursprüngliche konvertieren? – Mbt925

+0

Wenn Sie den Quellcode besitzen, ist es viel besser, zu tun, was Sie in der rohen Quelle anders als die vorkompilierte apk gefragt haben. Sie können Build-Tools (Ant, Maven und Gradle) verwenden, um den Build-Prozess zu standardisieren, zu vereinfachen und zu automatisieren. – yorkw

Antwort

8

Ich fand mich in einer ähnlichen Situation.

Ich hatte eine einzelne App, aber für verschiedene Kunden (mit spezifischen Anpassungen wie Ressourcen, Eigenschaften ...) gebaut. Ich entschied mich schließlich, die ganze Sache mit Maven zu verwalten.

Was ich getan habe, ist die Erstellung eines "Config" -Ordners in meiner Codebase und darin habe ich Pro-Kunde einen Ordner hinzugefügt, der die Eigenschaften, String, Bilder zu ihm enthält.

Meine Struktur ist so etwas wie dieses:

MyAppBase 
src/ 
build/ 
BaseAndroidManifest.xml 
... 
config/ 
    customerA/ 
     logo.png 
     customerA.xml 
     customerA.properties 
    customerB/ 
    customerC/ 
    ... 

Mit Maven Artefakte für das Kopieren, Verschieben, ersetze ich habe dann kundenspezifische apk in der folgenden Art und Weise bauen verwaltet:

1) Erstellen Sie ein temporäre kundenspezifische Quellordner, in dem alle Code

<copy todir="src_${customer}"> 
    <fileset dir="src"/> 
</copy> 

2) Umbenennen von Paketen und Importe kopiert

<!-- Rename main package --> 
<move file="src_${customer}/ch/wizche/myapp" tofile="src_${customer}/ch/wizche/${customer}"/> 
<!-- Replace package imports with the newly one --> 
<replace dir="src_${customer}/" value="ch.wizche.${customer}"> 
    <include name="**/*.java"/> 
    <replacetoken>ch.wizche.myapp</replacetoken> 
</replace> 

3) ersetzen spezifische Ressourcen basierend auf den Kunden

<!-- Copy images icon to the drawable folder --> 
<copy file="./configs/${customer}/ic_launcher_l.png" tofile="./res/drawable-ldpi/ic_launcher.png" overwrite="true" verbose="true"/> 
<copy file="./configs/${customer}/ic_launcher_m.png" tofile="./res/drawable-mdpi/ic_launcher.png" overwrite="true" verbose="true"/> 

4) Ersetzen Sie "Vorlage" AndroidManifest und Injizieren Kundenversionen, Namen, ...

<copy file="./BaseAndroidManifest.xml" tofile="./AndroidManifest.xml" overwrite="true" verbose="true"/> 
<replace file="./AndroidManifest.xml" value="ch.wizche.${customer}" token="ch.wizche.myapp"/> 
<replace file="./AndroidManifest.xml" value="android:versionCode="${versionCode}" token="android:versionCode="1"/> 

5) Unterschrift mit Kunden alias

6) Haus APK

7) Löschen von temporären Kundenordner

So, eine kundenspezifische Anwendung zu erstellen, muss ich nur:

mvn install -Dcustomer=customerA -P release 

Hoffe, dies kann Ihnen einige Eingaben geben.

+0

Vielen Dank für die Antwort. Meine App wird auf dem PC des Benutzers installiert. Was sollte ich mit Ihrem Ansatz auf dem System des Benutzers installieren, aber JDK? – Mbt925

+0

Einer der Unterschiede zwischen deinem und meinem Problem ist, dass du die benutzerspezifische Version auf deinem System erstellst, aber meine App möchte das auf dem System des Benutzers tun. – Mbt925

+0

Du brauchst auch das Android SDK. Außerdem benötigt der Benutzer den Quellcode der App. Warum nicht einen Build-Server verwenden? I.e.Der Benutzer konfiguriert seinen Parameter über die C# -Anwendung und dann, wenn es zum Build kommt, schiebt man die Benutzerkonfiguration auf einen Build-Server, erstellt den Build und lässt den Benutzer das APK von diesem herunterladen. – Wizche

3

Ich hatte ein ähnliches Problem, wo ich mehrere apks mit verschiedenen Auflösungen von Grafiken in jedem wollte (eine einzige apk mit allen Bildern für alle Display-Größen war zu groß).

ich einen benutzerdefinierten Build-Prozess endete schaffen, in dem ich einen ‚vorkompilierte‘ AntTask eingefügt, die im Wesentlichen über die richtigen Ressourcen für den Build kopiert und vorverarbeitet die Quelle, so dass das Paket für jeden apk .. aktualisiert wurde

kann Ich finde keine offiziellen Dokumente, aber das sollte ein guter Anfang sein. using-ant-to-automate-building-android

+0

Danke für die Antwort. Ich möchte nicht ant verwenden, weil ich es nicht auf dem PC des Benutzers installieren kann. – Mbt925

+0

Wie wäre es, ANT_HOME auf die gebündelte Eclipse-Version zu zeigen ... tatsächlich kann das Ganze noch von der Eclipse aus gestartet werden, wenn es richtig eingerichtet ist: – legspeleo

+0

Der Punkt ist, die Android App ist vorkompiliert. Also möchte ich diese Sachen durch Desktop-App (C#) tun. – Mbt925

2

Sie könnten versuchen, eine unsignierte .apk zu verteilen und sie dann mit verschiedenen Schlüsseln aus der C# -App zu signieren. Ich habe signapk.jar verwendet, um nicht signierte .apk's von der Befehlszeile aus zu signieren.

Das Risiko besteht darin, dass Sie private Schlüssel an Ihre Kunden verteilen. Wenn das kein Problem ist, da sie in gewisser Weise mit ihrem Tool eigene Apps erstellen, wäre es vielleicht einen Versuch wert.

Siehe die folgenden Zeilen für weitere Informationen:

How To Sign APK Zip Files

Android App Code Signing without Eclipse on Windows

+0

Ich habe zwei signierte Versionen der gleichen App getestet. aber nach der Installation der ersten, um die zweite zu installieren, sollte die erste zuerst deinstalliert werden! – Mbt925

+0

OK, nun, ich war mir nicht sicher, ob es funktionieren würde. Ich dachte, Android könnte zwei Apps mit demselben Namen erlauben, wenn sie unterschiedliche Schlüssel hätten. –

+0

danke trotzdem. Paketname ist die Kennung! – Mbt925

Verwandte Themen