2012-01-06 14 views
7

XML-driven Leggendo la Online Developer Guide page on XML layouts, ho trovato la seguente dichiarazione:GUI e prestazioni

vostre descrizioni di interfaccia utente sono esterni al codice dell'applicazione, il che significa che è possibile modificare o adattare senza dover modificare il codice sorgente e ricompilare.

Conosco i numerosi vantaggi dei layout e delle risorse XML, ma poiché i file XML sono posizionati all'interno dell'APK, penso che non ci sia un modo reale di modificare la GUI senza riconfezionarla. Voglio dire, molti di noi usano il plugin ADT di eclipse e ANT per confezionare le app, quindi non c'è alcun reale vantaggio nel non compilare i file di classe (poiché dopo aver modificato i file di risorse, uno sviluppatore dovrà riconfezionare l'app e produrre un nuovo APK file). Per questo motivo, non è possibile ridistribuire solo la GUI sui dispositivi senza ridistribuire l'intero APK.

Se questa supposizione fosse vera, allora i file XML saranno gli stessi durante la vita di un file APK. Immagino che questi file (specialmente quelli di layout) debbano essere analizzati ed elaborati in fase di esecuzione (prima di onCreate di un'attività) che sarebbe meno efficiente della costruzione della GUI a livello di programmazione (come in Swing). Il layout non è di solito un collo di bottiglia, ma se sono corretto, vedo qui una piccola perdita di tempo che potrebbe essere meglio utilizzata (ad esempio, con animazioni).

Leggendo la stessa pagina, si legge:

Quando si compila l'applicazione, ogni file di layout XML è compilato in una risorsa View.

Ispezione uno dei miei APK, ho cercato per un file precompilato all'interno classes.dex e non c'è niente ma le mie classi Java e il file R.class. I file XML di layout si trovano all'interno dello /res/layout folder e c'è un file denominato resources.arsc che sembra contenere informazioni su altre risorse (stringhe, nomi di icone), ma nulla di relativo a Views, penso (correggimi se ho torto).

Le mie domande:

  • sono file di layout XML precompilati, e al quale file?
  • In caso contrario, esiste un'opzione di compilazione per precompilare completamente le informazioni di layout in un file per un tempo di caricamento più rapido? (idealmente, questo sarebbe un file di classe)
  • In caso contrario, esiste un modo per creare quel file nella prima esecuzione e inserirlo nella cartella di installazione dell'applicazione, in modo che le esecuzioni di runtime successive possano leggere quel file anziché analizzare il file XML e ha un tempo di caricamento più veloce?

Grazie in anticipo.

risposta

8

Se si dispone di un papero la documentazione classe per LayoutInflater, noterete dicono:

Per motivi di prestazioni, vista l'inflazione si basa fortemente su di pre-elaborazione dei file XML che viene fatto al momento della compilazione . Pertanto, non è attualmente possibile utilizzare LayoutInflater con un XmlPullParser su un semplice file XML in fase di runtime; funziona solo con un XmlPullParser restituito da una risorsa compilata (R.something file.)

Quindi sì, file di layout sono infatti pre-compilate in una certa misura, e, a giudicare dal brano sopra riportato, sarebbe nel file di output R$layout.class (ma non sono sicuro al 100% su questo). Il file di layout precompilato si trova nel pacchetto APK compilato, come /res/layout/<layout_id>.xml. Noterai se lo estrai e lo apri in un editor di testo che la maggior parte degli elementi XML in testo semplice sono stati mappati in qualche forma binaria.

Probabilmente sarebbe lo stesso tipo di compressione che è possibile vedere nei file AndroidManifest.xml che vengono impacchettati negli APK.

+0

Grazie per il collegamento. Posso confermare che esiste una R $ layout.class, ma nella mia app detiene solo gli ID 'int'. –

+0

Ok, ispezionando i file XML all'interno dell'apk, si scopre che non sono XML, ma file preelaborati. Immagino che questi siano in un formato tale che l'analisi di runtime effettuata dal layout di inflatter sia considerevolmente più veloce. –

+0

Ho dato un'occhiata all'interno di uno dei miei APK, il file di layout si trova all'interno dell'APK con lo stesso percorso del file sorgente, tranne che è compilato in un formato binario. (edit: ninja'd!) – slyfox