2010-07-29 14 views
9

Quiero construir una aplicación en 2 versiones, una pagada, otra gratis, y sé que aapt tiene una opción "--rename-manifest-package" debería ayudar, pero yo no No sé cómo usarlo en build.xml. Encuentro 2 lugar en el que puede modificar:Android build.xml personalizado para cambiar el nombre del paquete de manifiesto

<!-- first --> 
<target name="-resource-src" depends="-dirs"> 
    <echo>Generating R.java/Manifest.java from the resources...</echo> 
    <exec executable="${aapt}" failonerror="true"> 
     <arg value="package" /> 
     <arg line="${v.option}" /> 
     <arg value="-m" /> 
     <arg value="-J" /> 
     <arg path="${gen.absolute.dir}" /> 
     <arg value="-M" /> 
     <arg path="AndroidManifest.xml" /> 
     <arg value="-S" /> 
     <arg path="${resource.absolute.dir}" /> 
     <arg value="-I" /> 
     <arg path="${android.jar}" />  
    </exec> 
</target> 



<!-- sencod --> 
<target name="-package-resources"> 
    <echo>Packaging resources</echo> 
    <aaptexec executable="${aapt}" 
      command="package" 
      manifest="AndroidManifest.xml" 
      resources="${resource.absolute.dir}" 
      assets="${asset.absolute.dir}" 
      androidjar="${android.jar}" 
      outfolder="${out.absolute.dir}" 
    basename="${ant.project.name}" > 
</aaptexec> 
</target> 

este artículo (http://blog.uncommons.org/2010/07/19/building-two-versions-of-the-same-android-app/) dijo que debería añadir "--rename-manifiesto de paquete" en el segundo lugar, pero ¿cómo?

+1

En su lugar, puede considerar el uso de un proyecto de biblioteca de Android: http://developer.android.com/guide/developing/eclipse-adt.html#libraryProject – CommonsWare

+0

Encontré la solución aquí: http://stackoverflow.com/ questions/17287018/changing-application-package-name-in-custom-ant-build-step –

Respuesta

8

La opción --rename-manifest-package no se puede utilizar con la tarea ant aaptexec. Es una opción que debe ir directamente al ejecutable aapt, así;

<exec executable="${aapt}" failonerror="true"> 
    <arg value="package" /> 
    <arg value="-f" /> 
    <arg value="-v" /> 
    <arg value="--version-code" /> 
    <arg value="${version.code}" /> 
    <arg value="--debug-mode" /> 
    <arg value="-M" /> 
    <arg path="AndroidManifest.xml" /> 
    <arg value="-A" /> 
    <arg path="${asset.absolute.dir}" /> 
    <arg value="-I" /> 
    <arg path="${android.jar}" /> 
    <arg value="-F" /> 
    <arg path="${out.absolute.dir}/${resource.package.file.name}" /> 
    <arg value="-S" /> 
    <arg path="${resource.absolute.dir}" /> 
    <arg value="--rename-manifest-package" /> 
    <arg value="com.example.pro" /> 
</exec> 

No encontré la manera de editar un archivo que realmente cambia la forma en que Eclipse construye. Así que puse esa pieza de código en el build.xml, lo puse en la raíz del proyecto y lo construí desde la consola escribiendo;

ant debug 

Y si usted depende de cualquier biblioteca, también deben ir al empaque. Mire en su archivo predeterminado.properties y verá la referencia a la lib. Luego agrégalo a la regla anterior, así;

<arg value="-S" /> 
<arg path="${android.library.reference.1}/res" /> 

Comienza a sentirse cada vez más como un truco que puede romperse con cualquier actualización de plataforma SDK.

+0

actualizando a 2.3 sdk parece que lo mato todo ... muy triste ... pero aún así gracias por su respuesta –

+0

Estoy corriendo 2.3 y está funcionando. –

+0

Confirmo que funciona con la versión actual (r12) de la SDK, usando un ejemplo simple. Tenga en cuenta que el objetivo que debe sobrescribirse es "-package-resources". Es decir: ' Recursos de empaquetado BoD

2

manifestpackage es el valor de arg option "--rename-manifest-package" para la tarea ant. Use esto para crear diferentes paquetes para su aplicación. anular

target name="-package-resources" 

desde el guión hormiga

+0

Tengo un poco de prisa y no estoy buscando hacer esto todavía ... fue solo curiosidad. ¿Alguien puede confirmar que este método funciona? –

+0

Sí, el atributo manifestpackage se introdujo en r17 - ver [link] (https://android-review.googlesource.com/#/c/32670/) –

2

recientemente que tenía que ser capaz de cambiar el nombre del paquete de una aplicación en tiempo de compilación. Esta es una necesidad común cuando tienes una versión paga y una versión gratuita de una aplicación. También es útil si desea poder instalar varias versiones de una aplicación en su teléfono, como una versión "dev" y una versión "estable".

Una forma de hacerlo es transformar todo el proyecto como un proyecto de biblioteca, y luego crear un proyecto final para cada versión, que depende del proyecto de la biblioteca.

Aapt magia

Hay otra manera: aapt tiene un parámetro --rename-manifiesto-paquete que vuelve a escribir el nombre del paquete del archivo binario en el AndroidManifest.xml APK final.

Esto es lo que dice ayuda aapt:

--rename-manifest-package 
     Rewrite the manifest so that its package name is the package name 
     given here. Relative class names (for example .Foo) will be 
     changed to absolute names with the old package so that the code 
     does not need to change. 

La gran ventaja es que su código no va a cambiar, la clase R permanece idéntica.

Ant

Desde r17, esta opción está disponible en la tarea Ant aapt, a través del atributo manifestpackage.Tendrá que sustituir el objetivo -El paquete de recursos, copiado del build.xml SDK:

<target name="-package-resources" depends="-crunch"> 
    <do-only-if-not-library elseText="Library project: do not package resources..." > 
    <aapt executable="${aapt}" 
    manifestpackage="com.my.package" 
    > 
... 
    </aapt> 
    </do-only-if-not-library> 
</target> 

Maven

El androide: apk objetivo del androide-maven-plugin tiene un renameManifestPackage parámetro.

Una última cosa

Si carga algunos identificadores de recursos en tiempo de ejecución, es posible que tenga que actualizar el código.

que solía hacer esto:

String packageName = context.getPackageName(); 
Resources res = context.getResources(); 
int id = res.getIdentifier("my_drawable", "drawable", packageName); 

Esto generalmente funciona muy bien, especialmente en proyectos de biblioteca en la que no conoce el nombre del paquete.

Sin embargo, el problema aquí es que los recursos se procesaron antes de que el nombre del paquete finalmente se actualizara. Así que packageName está mal.

Sin embargo, es fácil de solucionar recuperando el nombre del paquete de otro recurso con Resources.getResourcePackageName().

Vamos a crear un identificador de recursos destinados a tal fin, por ejemplo, en res/valores/ids.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item name="used_for_package_name_retrieval" type="id"/> 
</resources> 

y ahora tenemos el paquete correcto:

Resources res = context.getResources(); 
String packageName = res.getResourcePackageName(R.id.used_for_package_name_retrieval); 
int id = res.getIdentifier("some_drawable", "drawable", packageName); 

Conclusión

Este consejo ayuda a crear diferentes versiones de la misma aplicación.

+0

Será mejor que proporciones un resumen del enlace para mayor rigurosidad. – VahidNaderi

+1

El artículo mencionado aquí es útil debido a la observación de que el nombre del paquete no se cambia por completo durante la compilación, y el método Resources.getIdentifier() no funciona como se esperaba. Esto le afectará si desea cambiar el nombre del paquete de hormiga para un proyecto Phonegap (corvova). –

+0

Lo único que agregaría es que puede agregar la personalización en custom_rules.xml que androides build.xml importa – tik27

Cuestiones relacionadas