2011-01-25 8 views
8

Actualización: Esta es una publicación anterior, y las referencias a continuación a las versiones rotas aapt estarán desactualizadas.Reempaquetar archivo APK para que contenga recursos personalizados: ¿qué herramienta de compilación usar?


Basándose en la información anterior, estoy almacenando los campos de texto personalizados en el directorio activos de mi aplicación.

Escribiré la aplicación, utilizando los datos de usuario predeterminados en un archivo de activos, y el cliente desea reconstruir la aplicación para cada usuario, incluidos los detalles de ese usuario en el archivo de activos.

(soy consciente de que esto es método tiene algunas deficiencias graves, pero el cliente todavía está dispuesto a hacerlo de esta manera - ver Embed login details in APK file, different for each user (or other options?))

Esta pregunta se refiere a los problemas que estoy teniendo con la reconstrucción del archivo APK, una vez que lo haya descomprimido, y actualicé el archivo de activos personalizados. Estoy bastante convencido de que me falta algo pequeño, sin embargo, la documentación y las publicaciones que he encontrado sobre estos métodos no son lo suficientemente útiles para un recién llegado.

  1. aapt - herramienta SDK de Android: Por desgracia los documentos de Android en "Uso aapt" en los documentos android [link] 2 a continuación son muy limitadas. El comando de consola -help muestra un poco más de información. Cuando trato de usarlo para agregar un archivo a test.apk, termina borrando el original y creando un nuevo archivo test.apk.zip que contiene solo el archivo que intenté agregar. No he podido encontrar la combinación de línea de comando correcta para tomar una aplicación descomprimida y volver a empaquetarla, ese sería mi primer premio.

  2. apkbuilder - Herramienta SDK de Android: En primer lugar, esta herramienta está en desuso, lo cual es un punto negativo para ella. Tampoco puedo hacer que funcione con lo que tengo en esa carpeta descomprimida. Creo que me falta un paso previo al apkbuilder porque apkbuilder solicita un archivo zip de recursos y tengo una carpeta de recursos.

  3. hormiga - herramienta de construcción: otras publicaciones similares dicen construir con hormiga, en lugar de utilizar las herramientas de Android. Tengo problemas para hacer que hormiga funcione. Un enlace particular para conseguir que Ant funcione con Android [enlace 3 a continuación] parece prometedor, pero parece que es para un sdk de Android diferente (mi build.xml que es generada por Android se ve diferente a la suya). Desafortunadamente, sé muy poco sobre la hormiga y tengo problemas para convertirme en un experto lo suficiente como para resolver mi problema actual.
    En relación con la solución de nickt abajo - la ejecución del script hormiga me da el error
    com.android.ant.SetupTask clase taskdef no se puede encontrar utilizando el cargador de clases AntClassLoader [].
    He encontrado algunas referencias en línea a este error, he confirmado que local.properties tiene una configuración sdk.dir que apunta a mi carpeta de instalación de sdk de Android (sdk.dir =/Applications/android-sdk-mac_86).

  4. ?????: Puede haber alguna otra opción que no he enumerado/descubierto, que me gustaría conocer.

Me doy cuenta de que profundizar en los engranajes que normalmente cubre mi ide puede dar lugar a dificultades. Pero sé que muchos de los usuarios de SO pueden hacer muchas de estas cosas, y espero obtener el interés de algunos de ellos. Gracias por cualquier ayuda.

(Eclipse 3.6 en Mac Snow Leopard 10.6 64 bit)

PD, aún no puedo publicar más de 1 hipervínculo, así que he incluido estas direcciones para mostrar más información sobre mi pregunta.

(1): stackoverflow.com/questions/4783160/embed-login-details-in-apk-file-different-for-each-user-or-other-options~~V~~3rd

(2): desarrollador .android.com/guía/desarrollo/tools/aapt.html

(3): www.disgruntledrats.com/?p=27

+0

** Ver esto: ** http: // stackoverflow.com/questions/4191762/how-to-view-androidmanifest-xml-from-apk-file/4191807#4191807 –

Respuesta

9

para responder a mi propia pregunta con el método que finalmente elegimos, y "para el registro":

he podido conseguir Hormiga de funcionar correctamente para mí (mi falta de comprensión).

Terminé usando la herramienta aapt. Funciona de acuerdo con la documentación del SDK de Android y realmente es bastante fácil de usar:.

aapt add -v Test.apk "assets/readme.txt" 

Esto añadirá un archivo readme.txt (nos almacenándolo en una subcarpeta de la carpeta actual en ejecución, llamados activos Si desea almacenar el archivo nuevo en otro lugar, aapt ofrece un interruptor de línea de comandos para especificar que)

sin embargo, hay algunas advertencias:

  1. no pude conseguir que funcione en APK firmado archivos.
  2. algunas versiones de aapt no funcionan correctamente! No reconocen la subcarpeta ...

Para resolver 1:

  1. exportación del APK de Eclipse como un APK firmado.
  2. Use la herramienta de claves para generar una clave (consulte los documentos de desarrollo de Android).
  3. Utilice aapt.
  4. Firme el APK usando jarsigner.

Para resolver 2:

Realmente no puedo ayudar con esto. Cada versión del SDK (en Mac) que intenté descargar incluía una herramienta aapt que no reconocía las subcarpetas. Un colega descargó una versión que funcionó, pero aún no pudimos averiguar qué versión descargó, así que guardamos esta copia "mágica" y le cambiamos el nombre, y la usaremos hasta que encontremos una nueva versión que funcione.

+0

¿Puedes explicar las etapas 2 y 4 más en la primera solución? – Guy

+0

Muchas gracias por esta respuesta. Justo lo que estaba buscando. Ya no tengo problemas con 1 o 2, ya que todavía no estoy firmando mis aplicaciones, pero quería cambiar dinámicamente los datos y esto lo hace perfectamente. – darrenp

+0

Gracias por su publicación. Me ayudó a encontrar mi solución. Para la automatización, vea [mi publicación] (http://stackoverflow.com/questions/16898409/persist-meta-inf-services-files-in-apk/17066147#17066147) – AlexS

3

la solución más simple sería dar la fuente de plantilla de la aplicación para su cliente con un script que reconstruye la aplicación desde cero.

De esta manera su cliente simplemente tiene que cambiar los activos en la carpeta, haga doble clic en un archivo por lotes y obtenga la apk en aproximadamente un minuto.

Usted no tiene que saber nada acerca ANT para compilar y paquete sin el IDE, sólo tiene que seguir los pasos aquí:

http://developer.android.com/guide/developing/other-ide.html

El script ANT es generado por el "androide crear" "android actualizar "comandos. Entonces solo necesitas ejecutar "liberación de hormiga" y listo.

+0

Gracias, Yahel, lamentablemente ya había leído ese enlace, y aún así la hormiga no se compila. Más detalles a continuación con la solución de Nick T. –

1

Para ampliar la respuesta de Yahel, sí, creo que Ant es el camino a seguir. Puede ser un poco intimidante, pero es sorprendente lo bien que funciona 'fuera de la caja' sin demasiado lío. Personalizarlo requiere un poco de lectura, pero lo logré, así que te daré el beneficio de mi experiencia.

Primero crea una aplicación de muestra como se sugiere. Supongamos que desea que se cree en c: \ junk. Luego de su línea de comandos en el Android SDK \ tipo de directorio herramientas:

android create project -t 5 -n AndSampleApp -p c:\junk\AndSampleApp -a AndSampleApp -k com.yourpackage.andsample. 

(-t 5 da que el nivel de API 7, Tipo otras opciones 'lista de destinos androide' para ver)

Asumamos ha estado construyendo sus proyectos en un área de trabajo de Eclipse (es/dev/projects/EclipseHelios/AndroidWorkspace en mi máquina). Copiar build.xml y build.properties de la aplicación de ejemplo a la carpeta del proyecto en Eclipse

y editar el build.xml de nueva creación y eliminar la línea

<project name="AndSampleApp" default="help"> 

y reemplazarlo con sólo:

<project> 

Ahora edite los build.properties los de nueva creación, que estará vacía excepto por los comentarios y añadir (customisng en su caso):

# The password will be asked during the build when you use the 'release' target. 
# OH NO IT WON'T! IF YOU PUT THE KEYS & PWDS IN AS BELOW - It'S AUTOMATIC 

# Customised (hard coded) section --------------------- 

projectname=YourActualProjectName 

# Line below is the parent folder of where the sources are 
workspace.dir=/dev/projects/EclipseHelios/AndroidWorkspace 

# Line below is where you want the binaries to go 
outbasebase.dir=/dev/projects/AntBuilds 

key.store=c:/users/you/your-release-key.keystore 
key.alias=your_release_alias 
key.store.password=YourSecretPassword 
key.alias.password=YourSecretPassword 
#------------------------------------------------------ 

ant.project.name=${projectname} 
base.dir=${workspace.dir}/${projectname} 
source.dir=${base.dir}/src 
outbase.dir=${outbasebase.dir}/${projectname} 
out.dir=${outbase.dir}/bin 
layout.dir=${base.dir}/res/layout 

Si a continuación, obtener una línea de comandos en/dev/proyectos/EclipseHelios/AndroidWorkspace/YourActualProjectName

y escriba 'liberación hormiga', que debe terminar con un apk construido y firmado en/dev/proyectos/AntBuilds/YourActualProjectName

Debería poder personalizar la ubicación de los activos añadiendo una entrada assets.dir en la compilación.propiedades

+0

Gracias, Nick, sigo recibiendo el error: "taskdef class com.android.ant.SetupTask no se puede encontrar usando el cargador de clases AntClassLoader []" - se ha actualizado la publicación original con esta información. –

+0

Mire aquí, parece que las propiedades no aceptan caracteres no ascii: http://blog.klacansky.com/matter-code/ant-taskdef-class-com-android-ant-setuptask-cannot-be-found – Yahel

+0

Gracias, Yahel, encontré ese enlace. No creo que rompa ninguna regla no ascii con "/ Applications/android-sdk-mac_86". Agregaré a estas respuestas más tarde hoy con información sobre cómo me puse a trabajar. –

2

Un poco tarde, probablemente, pero esta publicación aparece en muchas búsquedas, así que pensé que esto podría ser de interés.

Acabo de utilizar una herramienta Zip estándar para 'unsign' el APK eliminando la carpeta META-INF, actualicé todos los archivos de activos, y luego resigné el APK usando jarsigner. (Si pudiera encontrar una forma de firmar JARs sin usar jarsigner, entonces no necesitaríamos el Java SDK instalado en todas partes, esto sería realmente útil - ¿ideas a alguien?)

Cuestiones relacionadas