2011-01-25 6 views
8

Aggiornamento: questo è un vecchio post e i riferimenti riportati di seguito nelle versioni aapt non funzionanti saranno aggiornati.Ripeti il ​​file APK per contenere risorse personalizzate: quale strumento di compilazione utilizzare?


Sulla base del feedback precedente, sto memorizzazione di campi di testo personalizzati nella directory beni di mia app.

Scriverò l'app, utilizzando i dettagli utente predefiniti in un file di asset, e il client vorrebbe ricostruire l'app per ciascun utente, inclusi i dettagli dell'utente nel file di asset.

(sono consapevole questo è il metodo ha alcune gravi lacune, ma il client è ancora pronto a farlo in questo modo - vedi Embed login details in APK file, different for each user (or other options?))

Questa domanda si riferisce a problemi che sto avendo con la ricostruzione del file APK, una volta che l'ho decompresso e aggiornato il file degli asset personalizzati. Sono abbastanza convinto che mi manca qualcosa di piccolo, tuttavia, la documentazione e i post che ho trovato su questi metodi non sono abbastanza utili per un nuovo arrivato.

  1. aapt - strumento di Android SDK: Purtroppo la documentazione Android su "Uso aapt" sui documenti android [link] 2 qui sotto sono molto limitate. Il comando della console -help mostra un po 'più di informazioni. Quando provate ad usarlo per aggiungere un file a test.apk, finisce per cancellare l'originale e creare un nuovo file test.apk.zip contenente solo il file che ho provato ad aggiungere. Non sono stato in grado di trovare la combinazione della riga di comando corretta per prendere un apk non compresso e riconfezionarlo - questo sarebbe il mio primo premio.

  2. apkbuilder - Strumento sdk per Android: in primo luogo questo strumento è deprecato, che è un punto negativo per questo. Anche io non riesco a farlo funzionare con quello che ho in quella cartella decompressa. Penso che mi manca un passo pre-apkbuilder perché apkbuilder richiede un archivio zip delle risorse, e ho una cartella delle risorse.

  3. ant - strumento di creazione: altri post simili suggeriscono di creare con ant, anziché utilizzare gli strumenti di Android. Sto avendo problemi a far funzionare la formica. Un link particolare a come ottenere Ant per funzionare con Android [link 3 sotto] sembra promettente, ma sembra che sia per un altro SDK Android (il mio build.xml generato da Android ha un aspetto diverso dal suo). Sfortunatamente conosco poco le formiche e sto avendo problemi a diventare esperto abbastanza per risolvere il mio problema attuale.
    seguito alla soluzione di nickt qui sotto - l'esecuzione dello script ant mi dà l'errore
    classe taskdef com.android.ant.SetupTask non può essere trovato utilizzando il programma di caricamento classe AntClassLoader [].
    Ho trovato alcuni riferimenti online a questo errore, ho confermato che local.properties ha un'impostazione sdk.dir che punta alla cartella di installazione sdk di android (sdk.dir =/Applications/android-sdk-mac_86).

  4. ?????: Potrebbe esserci qualche altra opzione che non ho elencato/scoperto, che sarei interessato a conoscere.

Mi rendo conto che scavare negli ingranaggi che sono normalmente coperti dal mio ide può portare a difficoltà. Ma so che molti utenti SO possono fare molte di queste cose e spero di ottenere l'interesse di alcune di esse. Grazie per qualsiasi aiuto.

(Eclipse 3.6 su Mac Snow Leopard 10.6 a 64 bit)

PS, io non sono in grado di pubblicare più di 1 collegamento ipertestuale ancora, quindi ho incluso questi indirizzi di mostrare più informazioni alla mia domanda.

(1): stackoverflow.com/questions/4783160/embed-login-details-in-apk-file-different-for-each-user-or-other-options~~V~~3rd

(2): gli sviluppatori .android.com/guide/sviluppo/strumenti/aapt.html

(3): www.disgruntledrats.com/?p=27

+0

** Vedi questo: ** http: // stackoverflow.com/questions/4191762/how-to-view-androidmanifest-xml-from-apk-file/4191807#4191807 –

risposta

9

Per rispondere alla mia domanda con il metodo abbiamo finalmente scelto, e "per la cronaca":

non sono riuscito a ottenere Ant funzionare correttamente per me (la mia mancanza di comprensione).

Ho finito per usare lo strumento aapt. Funziona come per la documentazione di SDK di Android ed è davvero molto semplice da utilizzare:.

aapt add -v Test.apk "assets/readme.txt" 

Questo aggiungerà un file readme.txt (eravamo riporlo in una sottocartella della cartella corrente in esecuzione, chiamati asset Se si desidera memorizzare il nuovo file da qualche altra parte, aapt fa offrire una riga di comando per specificare che)

Tuttavia, ci sono alcuni avvertimenti:

  1. non riuscivo a farlo funzionare su APK firmato File.
  2. alcune versioni di aapt non funzionano correttamente! Non riconoscono la sottocartella ...

Per risolvere 1:

  1. Esportare l'APK da Eclipse come un APK firmato.
  2. utilizzare il comando keytool per generare una chiave (vedi Documentazione dev Android).
  3. Usa aapt.
  4. Firma l'APK utilizzando jarsigner.

Per risolvere 2:

Non posso davvero aiutare con questo. Ogni versione dell'SDK (su Mac) che ho provato a scaricare includeva uno strumento aapt che non riconosceva le sottocartelle. Un collega ha scaricato una versione che funzionava, ma non riuscivamo ancora a capire quale versione fosse stata scaricata, quindi abbiamo mantenuto questa copia "magica" e l'abbiamo rinominata e la useremo fino a quando non troviamo una nuova versione che funziona.

+0

Puoi spiegare gli stadi 2 e 4 nella prima soluzione? – Guy

+0

Grazie mille per questa risposta. Proprio quello che stavo cercando. Nessun problema con 1 o 2 ancora visto che non sto ancora firmando i miei apk ma ho voluto modificare dinamicamente i dati e questo lo fa perfettamente. – darrenp

+0

Grazie per il tuo post. Mi ha mentito per la mia soluzione. Per l'automazione vedere [il mio post] (http://stackoverflow.com/questions/16898409/persist-meta-inf-services-files-in-apk/17066147#17066147) – AlexS

3

la soluzione più semplice sarebbe quella di dare la fonte modello di applicazione per il tuo cliente con uno script che ricostruisce l'app da zero.

In questo modo il cliente deve semplicemente cambiare i beni nella cartella, fare doppio clic su un file batch e di ottenere l'apk in un minuto o giù di lì.

Non devi sapere nulla di ANT per compilare e pacchetto senza l'IDE, basta seguire le istruzioni qui:

http://developer.android.com/guide/developing/other-ide.html

Lo script ANT è generato dal Android "Android creare"" aggiornare "comandi. Quindi devi solo eseguire "ant antival" e via.

+0

Grazie, Yahel, sfortunatamente, avevo già letto quel link e la formica non è ancora stata creata. Ulteriori dettagli di seguito con la soluzione di Nick T. –

1

Per espandere sulla risposta di Yahel, sì, penso Ant è la strada da percorrere. Può essere un po 'intimidatorio, ma è urprising come funziona 'out of the box' senza troppo scompiglio. Personalizzarlo richiede un po 'di lettura ma l'ho gestito, quindi ti darò il beneficio della mia esperienza.

creare In primo luogo un'applicazione di esempio come suggerito. Supponiamo che si desidera che venga creato in c: \ junk. Poi dal prompt dei comandi in Android SDK \ tipo directory strumenti:

android create project -t 5 -n AndSampleApp -p c:\junk\AndSampleApp -a AndSampleApp -k com.yourpackage.andsample. 

(-t 5 ti dà livello di API 7, tipo le altre opzioni 'della lista target Android' per vedere)

Supponiamo hai costruito i tuoi progetti in uno spazio di lavoro Eclipse (è/dev/projects/EclipseHelios/AndroidWorkspace sulla mia macchina). Copiare build.xml e build.properties dell'app di esempio per la cartella del progetto in Eclipse

e modificare il build.xml appena creato e rimuovere la riga

<project name="AndSampleApp" default="help"> 

e sostituirlo con un semplice:

<project> 

Ora modificare le i build.properties di nuova creazione che sarà vuoto, fatta eccezione per i commenti e aggiungere (customisng ove necessario):

# The password will be asked during the build when you use the 'release' target. 
# OH NO IT WON'T! IF YOU PUT THE KEYS & PWDS IN AS BELOW - It'S AUTOMATIC 

# Customised (hard coded) section --------------------- 

projectname=YourActualProjectName 

# Line below is the parent folder of where the sources are 
workspace.dir=/dev/projects/EclipseHelios/AndroidWorkspace 

# Line below is where you want the binaries to go 
outbasebase.dir=/dev/projects/AntBuilds 

key.store=c:/users/you/your-release-key.keystore 
key.alias=your_release_alias 
key.store.password=YourSecretPassword 
key.alias.password=YourSecretPassword 
#------------------------------------------------------ 

ant.project.name=${projectname} 
base.dir=${workspace.dir}/${projectname} 
source.dir=${base.dir}/src 
outbase.dir=${outbasebase.dir}/${projectname} 
out.dir=${outbase.dir}/bin 
layout.dir=${base.dir}/res/layout 

Se poi si ottiene una riga di comando in/dev/progetti/EclipseHelios/AndroidWorkspace/YourActualProjectName

e digitare 'uscito formica', si dovrebbe finire con un apk costruito e firmato a/dev/progetti/AntBuilds/YourActualProjectName

Dovresti essere in grado di personalizzare la posizione delle risorse aggiungendo una voce assets.dir nella compilazione.proprietà

+0

Grazie, Nick, ancora sto ottenendo l'errore: "classe taskdef com.android.ant.SetupTask non può essere trovata utilizzando il programma di caricamento classe AntClassLoader []" - hanno aggiornato post originale con queste informazioni. –

+0

Dai un'occhiata qui, sembra che le proprietà non accettino caratteri non ascii: http://blog.klacansky.com/matter-code/ant-taskdef-class-com-android-ant-setuptask-cannot-be-found – Yahel

+0

Grazie, Yahel, ho trovato questo link - Non penso di infrangere le regole non ascii con "/ Applications/android-sdk-mac_86". Aggiungerò a queste risposte più tardi oggi con informazioni su come sono riuscito a lavorare aapt. –

2

Un po 'in ritardo, probabilmente, ma questo post appare in molte ricerche, quindi ho pensato che questo potrebbe essere di interesse.

Ho appena utilizzato uno strumento Zip standard per "disconnettere" l'APK rimuovendo la cartella META-INF, aggiornato i file di asset e quindi ritirato l'APK utilizzando jarsigner. (Se potessi trovare un modo per firmare JAR senza usare jarsigner, quindi non avremmo bisogno di Java SDK installato ovunque, sarebbe davvero utile - idee di chiunque?)

Problemi correlati