Vistas y attributes personalizados utilizados en todas las aplicaciones de Android

He desarrollado varias aplicaciones de Android ahora y he creado un código base de classs que uso con frecuencia en más de una aplicación. Este código está en un repository de subversión (svn) con cada aplicación en su propio repository. Cada aplicación tiene references svn: externals para los packages necesarios (p. Ej., Com.company.android.views). Esto funciona muy bien, excepto en el caso en que la class R debe importarse para attributes personalizados.

Una vista personalizada tiene una import como esta:

import com.company.apps.myapp.R 

para que pueda tener un código como este:

 attributes.getBoolean(R.styleable.WebImageView_autoload, autoload) 

Ese atributo personalizado se define en res / values ​​/ attrs.xml:

 <declare-styleable name="WebImageView"> <attr name="autoload" format="boolean" /> ...others </declare-styleable> 

Esto funciona perfectamente, pero el problema surge cuando tengo una segunda aplicación que usa esta misma vista. Ahora actualizo la import para import com.company.apps.anotherapp.R para que funcione con "anotherapp" y que lo rompa con "myapp". Al trabajar en varias aplicaciones a la vez, esto se convierte en un problema.

Mi solución temporal ha sido verificar una actualización de las classs aplicables y luego bloquear el svn: externals a esa revisión específica. Cada aplicación termina siendo bloqueada a una revisión diferente, que se vuelve desorderada rápidamente, pero eso parece mejor que copyr las diversas classs directamente en el repository de la aplicación.

La única otra solución que he pensado es utilizar la reflexión, algo así como:

 Class class = Class.forName(context.getPackageName() + ".R"); Field[] fields = class.getDeclanetworkingFields(); 

Y luego recorra los campos, asignando los que me interesan a las variables que se usan en toda la class. Sin embargo, esto parece bastante duro, especialmente cuando podríamos estar hablando de varias classs que necesitan hacer esto.

¿Cómo puedo resolver este problema? ¿Hay alguna manera de importar dinámicamente el file com.company.apps. *. R o de alguna manera generar una class R diferente que no dependa de la aplicación específica? ¿O hay alguna otra solución obvia (o no tan obvia) que he echado de less?

Me tomó un time, pero encontré una buena respuesta: Library Projects .

Estructuralmente, un proyecto de biblioteca es similar a un proyecto de aplicación estándar de Android. Por ejemplo, incluye un file de manifiesto en la raíz del proyecto, así como src /, res / y directorys similares. El proyecto puede contener los mismos types de código fuente y resources que un proyecto estándar de Android, almacenado de la misma manera. Por ejemplo, el código fuente en el proyecto de la biblioteca puede acceder a sus propios resources a través de su class R.