2013-03-19 12 views
9

Ho due programmi. La prima è un'app desktop (C#) e l'altra è un'app Android.Come creare più app da una singola app Android con contenuti diversi

Il C# crea alcuni file di testo e li inserisce in alcune cartelle di app Android. Quindi possiamo avere più app Android con contenuti diversi. l'app per Android è precompilata. e l'app C# inserisce solo i file di test (con 7za) e la ricompone (con zipalign).

Il problema è che tutte queste app hanno un'unica fonte! indica lo stesso nome del pacchetto e lo stesso nome dell'app!

E come sapete, Android considera gli stessi nomi di pacchetti delle stesse app! Come posso risolvere questo problema? e creare applicazioni separate da una singola applicazione Android con diversi file di testo (contenuti)

Maggiori dettagli: ho una singola applicazione Android (test.apk). L'app My C# dovrebbe modificare questo file zip e riconfezionarlo. mettere i file di testo nella cartella delle risorse funziona correttamente. Ma con questo metodo, gli apk dell'output dell'app C# sono tutti uguali! non riesco a installarli sul cellulare separatamente, perché Android OS li sostituisce l'uno sull'altro.

+0

hanno cercato di leggere ultima guida google sul tema? A volte forse (se possibile) che cambia il nostro punto di vista e il rispetto di un comportamento standard può risparmiare un sacco di codice. Il concetto _key del sistema operativo Android è che la durata dell'applicazione è gestita dal sistema operativo. La tua domanda sembra toccare qualcosa che dovrebbe essere fatto in un modo predefinito, prima di tutto cercherò di rispettare le _Google_ guidelines. Qui per riferimento utente http://developer.android.com/index.html. – jay

+0

Ho provato a sostituire AndroidManifest.xml. ma in un file apk, manifest.xml è codificato come binario. come posso convertire il mio nuovo file .xml in un formato codificato binario come quello originale? – Mbt925

+0

Se possiedi il codice sorgente, è molto meglio fare ciò che hai chiesto nella sorgente raw oltre all'apk precompilato. È possibile utilizzare gli strumenti di compilazione (Ant, Maven e Gradle) per standardizzare, semplificare e automatizzare il processo di creazione. – yorkw

risposta

8

Mi sono trovato in una situazione simile.

Avevo una singola app ma creata per clienti diversi (con personalizzazione specifica come risorse, proprietà ...). Alla fine ho deciso di gestire il tutto usando Maven.

Quello che ho fatto è creare una cartella "config" nella mia base di codice e al suo interno ho aggiunto al cliente una cartella contenente le proprietà, la stringa, le immagini relative a lui.

La mia struttura è qualcosa di simile:

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

Utilizzando manufatti Maven per la copia, spostare, sostituire ho poi riuscito a costruire apk specifiche del cliente nel modo seguente:

1) Creazione di un cartella di origine specifica del cliente temporanea in cui tutto il codice viene copiato

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

2) Rinominare i pacchetti e le importazioni

<!-- 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) Sostituire risorse specifiche in base al cliente

<!-- 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) Sostituire i nomi di "template" AndroidManifest e versioni dei clienti per via parenterale,, ...

<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) Firma alias utilizzando cliente

6) Costruzione APK

7) Eliminazione cartella cliente temporanea

Quindi, per costruire una specifica applicazione del cliente, ho solo bisogno di:

mvn install -Dcustomer=customerA -P release 

Spero che questo possa darti alcuni input.

+0

Grazie per la risposta. la mia app verrà installata sul PC dell'utente. utilizzando il tuo approccio, cosa devo installare sul sistema dell'utente, ma JDK? – Mbt925

+0

Una delle differenze tra il tuo problema e il mio è che tu costruisci la versione specifica dell'utente sul tuo sistema, ma la mia app vuole farlo sul sistema dell'utente – Mbt925

+0

Anche l'SDK Android ti servirà. Inoltre l'utente ha bisogno del codice sorgente dell'app. Perché non usare un server di build? Cioèl'utente configura il suo parametro dall'app C# e quindi quando si costruisce si spinge la configurazione utente su un server di build, si crea la build e si lascia che l'utente scarichi l'APK da esso. – Wizche

3

Ho avuto un problema simile in cui volevo più apk con diverse risoluzioni di grafica in ciascuno (un singolo apk con tutte le immagini per tutte le dimensioni del display era troppo grande).

ho finito per creare un processo di generazione personalizzata in cui ho inserito un 'prebuild' AntTask che, in fondo copiato le risorse corrette per la costruzione e pre-elaborato la sorgente in modo che il pacchetto è stato aggiornato per ogni apk ..

può trovare documenti ufficiali ma questo dovrebbe essere un buon inizio .. using-ant-to-automate-building-android

+0

Grazie per la risposta. Non voglio usare ant, perché non posso installarlo sul PC degli utenti. – Mbt925

+0

che ne dici di puntare ANT_HOME alla versione di eclissi in bundle .. infatti l'intera cosa può ancora essere eseguita da Eclipse se impostata a destra – legspeleo

+0

il punto è, l'app per Android è precompilata. Quindi voglio fare queste cose dall'app desktop (C#). – Mbt925

2

Si potrebbe provare a distribuire un .apk senza firma, quindi firmarlo utilizzando chiavi diverse dall'app C#. Ho usato signapk.jar per firmare unsigned .apk's dalla riga di comando.

Il rischio è che stai distribuendo chiavi private ai tuoi clienti. Se questo non è un problema, dato che, in un certo senso, stanno costruendo le proprie app con il tuo strumento, allora potrebbe valere la pena provare.

Vedi le righe seguenti per ulteriori informazioni:

How To Sign APK Zip Files

Android App Code Signing without Eclipse on Windows

+0

Ho testato due versioni firmate della stessa app. ma dopo aver installato il primo, per installare il secondo, il primo dovrebbe essere disinstallato per primo! – Mbt925

+0

OK, beh, non ero sicuro che avrebbe funzionato. Pensavo che Android potesse consentire due app con lo stesso nome se avessero chiavi diverse. –

+0

grazie comunque. il nome del pacchetto è l'identificatore! – Mbt925

Problemi correlati