para - decompilar apk android studio
Empaquetar archivos de recursos de Android dentro de un archivo Jar distribuible (9)
Estoy trabajando en un código de Android reutilizable que me gustaría distribuir a otros desarrolladores para usar dentro de sus propias aplicaciones. El código tiene algunas dependencias de recursos (diseños, xml y png dibujables) que me gustaría poder incluir y hacer referencia en un solo paquete (archivo Jar).
¿Es esto posible, y si es así, cuál es el mejor método para hacerlo?
Acabo de descubrir que la herramienta aapt
en el SDK de Android permite la siguiente opción:
--non-constant-id Make the resources ID non constant. This is required to make an R java class that does not contain the final value but is used to make reusable compiled libraries that need to access resources.
Esto suena prometedor, aunque no lo he intentado, así que no tengo ni idea de si funciona. Sospecho que esto es para solucionar el problema abordado por la publicación de @JJKim arriba.
Estaba usando la solución user558185 pero aquí hay una forma más simple. Si sus recursos están en un proyecto de biblioteca (para un complemento de Cordova, por ejemplo), puede obtener recursos con context.getResources().getIdentifier(name, className, context.getPackageName());
Esto sucede cuando el archivo R de recursos del proyecto de biblioteca no se genera correctamente y R el nombre de paquete no coincide con el nombre de paquete requerido por el proyecto de biblioteca.
El uso es el mismo que el de la respuesta del usuario 558185, pero utiliza un método nativo de Android.
Hola, creo que esta es una respuesta tardía, pero todavía tengo que informar sobre AAR
Android ARchive: este archivo puede contener sus archivos de resolución y manifiesto, de modo que el otro desarrollador solo puede importar el archivo a su proyecto y compilar su código.
De esta manera podríamos obtener errores de fusión del manifiesto, la solución para que use la propiedad de reemplazo en su manifiesto y esto debe verificarse antes de la distribución.
No tengo ninguna noticia optimista para ti. En general, no puede distribuir su propio paquete con la facilidad que espera. El principal problema es el archivo R autogenerado. Probablemente le hagas algunas referencias: tienes tus diseños y dibujables. El usuario de su biblioteca tendrá su propio archivo R, que contiene identificadores para sus recursos, no para los que proporciona su biblioteca.
En el caso de recursos dibujables, puede leerlos de forma clásica, sin archivo R. Pero por lo que sé, no puede inflar diseños de archivos xml externos.
Así que el truco feo aquí sería distribuir tu biblioteca junto con todos tus recursos, que el usuario tendría que copiar en su carpeta "res". Para ser honesto, no hay una buena solución para su problema ... lo siento. ¡Saludos!
Puede obtener dinámicamente la identificación de recursos utilizando el método de Android.
int preferences = context.getResources().getIdentifier("preferences", "xml", context.getPackageName());
Más tarde, sus recursos deben incluirse (copiarse) en su nuevo proyecto.
Si está utilizando Eclipse, vaya al proyecto "Properties->Java Build Path"
. Bajo la pestaña "Source"
, agregue la carpeta res que desea empaquetar (por ejemplo, res / raw) .
Agregará la siguiente línea en el archivo .classpath
<classpathentry kind = "src" path = "res / raw" />
Después de construir, el nuevo archivo jar contendrá los archivos en la carpeta res/raw/
. Puede acceder a ellos como sugirió.
diseños:
código duro en su fuente de Java
xml y png:
copie xml & png a la carpeta de proyecto de src y el paquete a jar, por ejemplo
Copie a.png a src / com / example / test
cárgalo como los siguientes códigos java:
InputStream is = YourClassName.class.getClassLoader().getResourceAsStream("com/example/test/a.png");
if ( null != is )
{
Bitmap bmp = BitmapFactory.decodeStream(is);
puede utilizar la abstracción para obtener los valores R de la clase implementadora (el usuario).
protected abstract void getMyLayoutTextBox(int myLayoutTextBox);
Luego, el usuario debe ampliar su clase (que amplía la Activity
) e implementar este método. En su clase, simplemente llame a getMyLayoutTextBox()
y obtendrá el valor R correcto suministrado por el usuario después de que él implemente su jar distribuible.
Puedes leer más sobre la abstracción aquí .
Como Android hace la clase R
automáticamente con archivos de recursos en la carpeta /res
, es imposible usar la clase R
como final static
.
Encontré una buena solución para usar un archivo jar
con los archivos res
. Así es como lo hice:
En el código fuente que se exportará en el archivo
jar
, no use la variableR
porque se reemplazará con una dirección de memoria estática final en tiempo de compilación. En lugar de usarR
, hice mi propio método a continuación:public static int getResourceIdByName(String packageName, String className, String name) { Class r = null; int id = 0; try { r = Class.forName(packageName + ".R"); Class[] classes = r.getClasses(); Class desireClass = null; for (int i = 0; i < classes.length; i++) { if (classes[i].getName().split("//$")[1].equals(className)) { desireClass = classes[i]; break; } } if (desireClass != null) { id = desireClass.getField(name).getInt(desireClass); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return id; }
Por ejemplo, si tiene un diseño llamado
main.xml
, puede obtenerlo llamando al método:int id = getResourceIdByName(context.getPackageName(), "layout", "main");
Si tiene una cadena cuya
id
es "text1", puede obtenerla llamando al métodoint id = getResourceIdByName(context.getPackageName(), "string", "text1");
Este método le proporciona su ID de recurso en tiempo de ejecución. Utiliza la API de reflexión para obtener el estado de
R
en tiempo de ejecución.Usando este método puedes evitar usar la variable
R
Copie sus archivos de
res
a su proyecto de destino.Construir.