2011-11-10 4 views
7

Con el tiempo, nuestro proyecto de Android se ha expandido mucho, y en estos días estamos creando múltiples APK de la misma fuente. Esto se ha convertido en un desafío debido a los requisitos de nombre del paquete de Android.¿Cómo resolver los atributos personalizados de las bibliotecas de Android y el remapeo del nombre del paquete durante la compilación?

Tenemos todo nuestro código compartido en un proyecto de biblioteca de Android, que se incluye en el proyecto de aplicación principal. Además, tenemos "superposiciones" de bibliotecas de Android para los recursos de marca que se aplican para cada marca. Cuando queremos construir una marca, incluimos algunas propiedades adicionales para esa marca que terminan incluyendo las bibliotecas de Android "superpuestas" antes del código compartido principal de la Biblioteca de Android. Para ilustrar:

AppProject 
    Include: BrandALibrary or BrandBLibrary 
    Include: SharedLibrary 

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

El 'BrandALibrary o BrandBLibrary' se enciende en el momento de la construcción, mediante la inclusión de archivos .properties en tiempo de compilación usando modificadores de línea de comandos. Nada demasiado elegante allí. La secuencia de comandos de compilación también debe cambiar el nombre del paquete .APK en tiempo de compilación para que los dos archivos .APK puedan coexistir en un dispositivo determinado al mismo tiempo (principalmente para fines de control de calidad, ya que no esperamos que los clientes tengan ambos en al mismo tiempo ... aunque podrían).

Todo funcionó muy bien hasta que nuestra compilación se rompió hoy después de agregar una clase a nuestro proyecto de biblioteca de códigos compartidos. Al mirar alrededor para una razón por la cual esto se ocurring me topé con la siguiente página web, donde el hombre había encontrado con el mismo problema y había fijado su versión de aapt para hacer este trabajo:

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

Durante nuestra construcción , los siguientes errores se presentan en los registros:

-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 

Mis atributos personalizados son nada espectacular, tengo un state_add y state_list definidos que puedo usar para establecer los estados predeterminados para un control que muestra un botón con un icono que indica qué estados se deben mostrar. Es como un botón 'alternar' en cierto modo, y podría terminar reemplazando este control con un botón de alternar.

Seguí this tutorial cuando creé este botón.

Mi pregunta es, finalmente (este tipo es largo sin aliento, ¿no es así?), ¿Hay alguna manera de asegurarse de que aapt 'remapear' los nombres de los paquetes utilizados en los atributos personalizados. Si hasta me quiero escribir más controles personalizados en nuestra biblioteca, tendremos que cita a ser capaz de hacer lo siguiente:

  • Si un espacio de nombres personalizado se define en el proyecto de la biblioteca, reasignar ese espacio de nombres para el espacio de nombres de la aplicación de Android que se está construyendo.

¿Se está perdiendo algo fundamental con la forma en que se mapean los atributos personalizados durante una compilación Ant? ¿Hay algo simple que pueda hacer para solucionar mis problemas de compilación?

+0

Es conocido tema. Aquí está el estado de la falla: http://code.google.com/p/android/issues/detail?id=9656 Star it. Vamos a obtener la corrección más rápido. :-) –

+0

Gracias Andrzej. Lo he hecho. Mientras tanto, he eliminado el código que solía usar para hacer esto y me he conformado con solo usar un ToggleButton y manipular su estado verificado adecuadamente en el código para obtener el mismo efecto.Es triste cuando algo como esto no funciona porque el marco mismo derrota la posibilidad. –

Respuesta

19

Esto was solved.

Por ejemplo:

<?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

Esto ayudó mucho. ¡Gracias! –

+3

Otro buen artículo de referencia: El caso de las bibliotecas de Android y los atributos personalizados de xml (parte 2) http://devmaze.wordpress.com/2011/05/22/the-case-of-android-libraries-and-custom-xml -attributes-part-2 / – Noah

Cuestiones relacionadas