2011-11-10 11 views
7

Nel corso del tempo il nostro progetto Android si è espanso molto, e in questi giorni stiamo creando più APK di marca dallo stesso albero dei sorgenti. Questo è diventato difficile a causa dei requisiti di denominazione del pacchetto di Android.Come risolvere gli attributi personalizzati delle librerie Android e la rimappatura dei nomi dei pacchetti durante la compilazione?

Abbiamo tutto il nostro codice condiviso in un progetto di libreria Android, incluso nel progetto principale dell'applicazione. Inoltre, abbiamo "overlay" di librerie Android per le risorse di marca che vengono applicate per ogni marchio. Quando vogliamo creare un marchio, includiamo alcune proprietà aggiuntive per quel marchio che finiscono per includere le librerie Android "sovrapposte" prima della libreria Android del codice condiviso principale. Per illustrare:

AppProject 
    Include: BrandALibrary or BrandBLibrary 
    Include: SharedLibrary 

SharedLibrary 
-> src/.. 
-> res/.. 
BrandALibrary 
-> res/.. 
BrandBLibrary 
-> res/.. 

Il 'BrandALibrary o BrandBLibrary' viene commutata in fase di compilazione, includendo i file .properties al momento della compilazione utilizzando le opzioni della riga di comando. Niente di troppo fantasia lì. Lo script di build deve anche cambiare il nome del pacchetto di APK al momento della compilazione in modo che i due file .APK possano coesistere su un dato dispositivo contemporaneamente (principalmente per scopi di controllo qualità, poiché non ci aspettiamo che i clienti abbiano entrambi nello stesso tempo ... sebbene potessero).

Tutto stava funzionando molto bene fino a quando la nostra build è stata interrotta oggi dopo aver aggiunto una classe al nostro progetto di libreria di codici condivisi. In guardando intorno per un motivo per cui questo è ocurring mi sono imbattuto la seguente pagina web, dove il tizio aveva incontrato lo stesso problema e aveva fissato la sua versione di aapt per fare questo lavoro:

http://devmaze.wordpress.com/2011/05/22/the-case-of-android-libraries-and-custom-xml-attributes-part-2/

Durante la nostra costruzione , i seguenti errori vengono presentati nei registri:

-pre-build: 

-code-gen: 
    [echo] ---------- 
    [echo] Handling aidl files... 
    [aidl] No aidl files to compile. 
    [echo] ---------- 
    [echo] Handling RenderScript files... 
[renderscript] No renderscript files to compile. 
    [echo] ---------- 
    [echo] Handling Resources... 
    [aapt] Found Deleted Target File 
    [aapt] Generating resource IDs... 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\layout\fancy_layout.xml:22: error: No resource identifier found for attribute 'state_add' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\layout\fancy_layout.xml:22: error: No resource identifier found for attribute 'state_list' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector.xml:4: error: No resource identifier found for attribute 'state_add' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector.xml:4: error: No resource 
identifier found for attribute 'state_list' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector.xml:5: error: No resource 
identifier found for attribute 'state_add' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector_button_selector.xml:5: error: No resource identifier found for attribute 'state_list' in package 'com.myapp' 

BUILD FAILED 
C:\android-sdk\tools\ant\build.xml:539: The following error occurred while executing this line: 
C:\android-sdk\tools\ant\build.xml:568: null returned: 1 

miei attributi personalizzati sono niente di spettacolare, ho uno state_add e state_list definiti che posso usare per impostare gli stati predefiniti per un controllo che mostra un pulsante con un'icona che indica quali stati dovrebbero essere mostrati. In un certo senso è come un pulsante di "commutazione", e potrei finire per sostituire questo controllo con un pulsante di attivazione.

Ho seguito this tutorial quando ho creato questo pulsante.

La mia domanda è, finalmente (questo ragazzo è a corto di tempo, non è lui?), C'è un modo per garantire che aapt "rimappasse" i nomi dei pacchetti usati negli attributi personalizzati. Se ho neanche voglia di scrivere più controlli personalizzati nella nostra biblioteca, avremo bisogno APPT essere in grado di effettuare le seguenti operazioni:

  • Se uno spazio dei nomi personalizzato è definito nel progetto di libreria, rimappare che namespace per lo spazio dei nomi del applicazione Android che viene costruita.

Mi manca qualcosa di fondamentale nel modo in cui gli attributi personalizzati vengono mappati durante una build di Ant? C'è qualcosa di semplice che posso fare per risolvere i miei problemi di compilazione?

+0

E 'noto problema. Ecco lo stato del bug: http://code.google.com/p/android/issues/detail?id=9656 Star it. Otterremo la correzione più velocemente. :-) –

+0

Grazie Andrzej. L'ho fatto. Nel frattempo ho rimosso il codice che ho usato per fare questo e mi sono accontentato di usare semplicemente un ToggleButton e di manipolare il suo stato controllato in modo appropriato nel codice per ottenere lo stesso effetto.È triste quando qualcosa del genere non funziona perché la struttura stessa sconfigge la possibilità. –

risposta

19

Questo was solved.

Ad esempio:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res-auto" > 
... 
+0

Questo ha aiutato molto. Grazie! –

+3

Un altro bel articolo di riferimento: il caso delle librerie Android e degli attributi xml personalizzati (parte 2) http://devmaze.wordpress.com/2011/05/22/the-case-of-android-libraries-and-custom-xml -attributes-parte-2 / – Noah