PDA

Ver la versión completa : Android: ¿cómo modificar los recursos de una app ya hecha?



Segata Sanshiro
19/06/2012, 13:10
Me gustaría crear una herramienta que pudiera modificar los recursos de una app mía.

En concreto, me gustaría que unos XML de la aplicación, que contienen los textos, se pudieran modificar fácilmente sin usar el Eclipse. Los ficheros XML se modificarían con cualquier programa de PC. Luego, para "rearmar" la app con los nuevos textos, en principio se me ocurre escribir un script que la recompile y la firme sin usar Eclipse, con las utilidades de la línea de comandos del SDK.

Me gustaría saber si hay alguna forma más fácil de hacerlo, para no tener que recompilar la app entera a cada cambio. Pero teniendo en cuenta que dentro de un apk ya hecho no se guardan las cosas en texto plano, no sé si habrá alguna alternativa.

Gracias por vuestra halluda.

juanvvc
19/06/2012, 13:24
Los archivos apk no son más que archivos zip, así que puedes comprimirlos y descomprimirlos con las herramientas habituales.

Descomprime el apk, cambia lo que necesites y vuelve a comprimirlo como un zip.

Y endespués:


jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

Ya está. No lo he probado nunca, así que cuéntanos si funciona o no.

Por otro lado, ¿para qué necesitas cambiar XML? ¿No te valdría más cargar esos archivos que necesitas desde el sistema de ficheros y dejarte de recompilaciones, refirmados y demás? Además, ahora que estoy pensando, si esos XML son los de layout o tienen identificadores automáticos en R.java, quizá tengas que volver a generar ese archivo R.java con ant (aunque no estoy nada seguro)

GameMaster
19/06/2012, 13:25
para ello no tendrias que recompilar de nuevo, con que tu programa habra la app, modifique el XML y lo vuelve a salvar seria suficiente

Segata Sanshiro
19/06/2012, 13:43
Los archivos apk no son más que archivos zip, así que puedes comprimirlos y descomprimirlos con las herramientas habituales.

Descomprime el apk, cambia lo que necesites y vuelve a comprimirlo como un zip.

Y endespués:


jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

Ya está. No lo he probado nunca, así que cuéntanos si funciona o no.

Vale, creía que no se podía porque los recursos iban compilados en ficheros arsc, pero veo que van en ficheros separados, en carpetas normales. Las imágenes se ven bien, pero los XML no son legibles. Abriéndolos en UTF-16 ya sí se puede leer el contenido pero sigue habiendo muchos caracteres extraños. ¿Sabéis por qué es?


Por otro lado, ¿para qué necesitas cambiar XML? ¿No te valdría más cargar esos archivos que necesitas desde el sistema de ficheros y dejarte de recompilaciones, refirmados y demás?

No estoy seguro de si me vale para este proyecto concreto pero gracias por la sugerencia :)

Gracias a los dos.

otto_xd
19/06/2012, 15:10
Mucho mas comodo adquirir los xml de la red o de una sd?Pones uno con valores por defecto y luego multiples posibles fuentes.

Sino te va a tocar lo que dicen, modificar xml, descomprimir apk, mezclar, comprimir.

Para tu propio servidor es "facil", para publicar en el market complicado.

^MiSaTo^
19/06/2012, 15:14
Eso de comprimir y descomprimir... yo no lo recomendaría la verdad. Primero porque no se siquiera si te va a funcionar como tal.
Por qué no haces eso que te dice otto? O bueno si me dices exactamnete qué quieres hacer te puedo guiar algo más porque ahora mismo es un poco abstracto.

PD: Estoy cayendo ahora... no intentarás cambiar los R verdad? los XML que genera android solo para los recursos. Porque si es así vete olvidando, eso no se puede hacer a mano ;)

Segata Sanshiro
19/06/2012, 15:38
No va a ser nada comercial así que puedo hacer todas las chapucillas que hagan falta, o hacer que se lo baje de un servidor ahora que tengo el mini VPS.

Quiero hacer alguna aplicación que sea como un pequeño ebook, suficientemente pequeño como para no necesitar recursos en la SD. El recurso que me gustaría modificar es el texto, para añadir algo o corregir errores una vez está hecha la aplicación. He hablado antes de XML pero podrían ser simples ficheros txt en el directorio res.

Tenía curiosidad por si se podían modificar los contenidos solo a partir del apk, o bien por ver cómo sería eso de hacer un script que automatizara la compilación y el firmado (que estoy tirando siempre de Eclipse como es lógico, pero quería ver cómo se hacía a mano). De todas formas tener los recursos en la SD es tan sencillo que puede que mande a la mierda la curiosidad y lo haga así xD

Gracias de nuevo.

^MiSaTo^
19/06/2012, 15:41
El problema es que todos los recursos internos de la aplicación (imágenes y textos) que vayas a cargar con lo de getResources() o similares, eso lo genera android con su formato propio y aunque quieras no vas a poder modificarlos sin tener que recompilar.
Otra cosa es que tengas un fichero externo al apk, y lo cargues de otra manera (no con getResources()).

PD: y la próxima vez, pregunta a los que sabemos de android que juanvvc yo se que lo ha dicho de buena fe, pero descomprimir un apk sirve de poco para estas cosas xD

juanvvc
19/06/2012, 15:48
Bueno, en mi comentario ya dijé que decomprimir el apk a mí no me parecía buena idea, siento si no lo dejé suficientemente claro :D

Por cierto, ya puestos, si en vez de como recursos lo metes como assets (aún dentro del apk) es posible que no codifique nada. Los assets se comportan como "un sistema de ficheros interno al apk", así que los manejas con sus InputStream in = getAssets().open("file.txt"); y demás, no con getResource()

Aún así y como hemos dicho todos, lo suyo es que este tipo de recursos cambiantes esté en la SD o en internet y lo cargues externamente.

^MiSaTo^
19/06/2012, 15:50
Bueno, en mi comentario ya dijé que decomprimir el apk a mí no me parecía buena idea, siento si no lo dejé suficientemente claro :D

Por cierto, ya puestos, si en vez de como recursos lo metes como assets (aún dentro del apk) es posible que no codifique nada. Los assets se comportan como "un sistema de ficheros interno al apk", así que los manejas con sus InputStream in = getAssets().open("file.txt"); y demás, no con getResource()

Aún así y como hemos dicho todos, lo suyo es que este tipo de recursos cambiantes esté en la SD o en internet y lo cargues externamente.

Ya pero hacerlo con un InputStream de esa manera tampoco es que sea muy recomendable ;) Lo suyo es usar getResources y demás (que lo siento pero no recuerdo los nombres de los métodos ahora mismo xD).

juanvvc
19/06/2012, 15:55
Si yo lo decía para que el SDK no codificase los XML, que parece que los XML que van como recursos dentro de "res" van codificados y los archivos dentro de "assest" se meten en el apk tal cual, sin modificar.

^MiSaTo^
19/06/2012, 16:14
No siempre ;) Por ejemplo yo usaba una bbdd y me la encriptó o codificó o yo que se qué pero no podía acceder a ella explorando los archivos normalmente. Y estaba en assets

ZeNiTRaM
20/06/2012, 17:07
Echa un ojo a ver si te sirve: http://code.google.com/p/android-apktool/

Segata Sanshiro
20/06/2012, 17:21
Gracias tío, ya lo había visto y tengo pendiente echarlo un vistazo, parece fácil de automatizar. Si veo que es difícil tiraré de archivos en la SD como hacen muchas aplicaciones comerciales.

^MiSaTo^
20/06/2012, 18:13
Gracias tío, ya lo había visto y tengo pendiente echarlo un vistazo, parece fácil de automatizar. Si veo que es difícil tiraré de archivos en la SD como hacen muchas aplicaciones comerciales.

Deberías tirar de archivos en la SD que es como se debe hacer ;) Al menos si quieres hacer algo más o menos "profesional"