¿Cómo puedo admitir mi aplicación Android para varias tiendas de Android?

Recientemente he empezado a vender mi aplicación de Android en el Android Market de Google, e implementé su esquema de licencias de aplicación para prevenir el uso no autorizado de mi aplicación. Ahora estoy planeando publicarlo para la Amazon App Store de Android, así, y quiero saber la mejor manera de mantener dos versiones de mi aplicación: una que implementa el Android Licensing, y otra que no lo hace.

Aunque mi solución actual funciona, no es óptima, y ​​estoy tratando de averiguar cómo otras personas han tratado con esto. En este momento, he implementado dos pantallas de bienvenida para mi aplicación, SplashGoogle.java y SplashAmazon.java. Tengo dos archivos Manifest correspondientes, GoogleManifest.xml y AmazonManifest.xml. Cada manifiesto define un splash diferente como la intención del lanzador.

Cuando quiero publicar una versión de mi aplicación, renombro uno de estos archivos de manifiesto a AndroidManifest.xml, exporto la aplicación y luego hago lo mismo con el otro manifiesto. Esta es mi solución porque es lo mejor que puedo imaginar, y no sé de otras maneras de hacer esto. Funciona porque la única diferencia entre el Amazonas y las versiones de mercado de Google de mi aplicación, son las correspondientes clases splash, una que comprueba la licencia y la otra que no.

En el futuro, es posible que desee implementar cambios adicionales (o consolidar para tener sólo una pantalla de bienvenida) y busco un medio más permanente para gestionar cambios sutiles dentro de la misma aplicación.

Me imagino que problemas similares se producen cuando los desarrolladores crean versiones lite, gratuitas o con soporte de anuncios de aplicaciones pagadas.

Notas adicionales:

  1. Para la versión que usa la Licencia de Android de Google, solicito el permiso CHECK_LICENSE en el archivo AndroidManifet.xml, mientras que en la versión de Amazon, esto no es necesario.

No estoy seguro de si esto debe ser considerado un wiki de la comunidad, pero si es así, por favor marca como tal, en contraposición a cerrar la pregunta. Creo que esto sería útil para un montón de desarrolladores por ahí.

Empezaría por refactorizar su base de código existente en un proyecto de biblioteca de Android. Esto es bastante fácil de hacer. Asegúrese de leer esto. La documentación es bastante escasa pero pude conseguir que funcione con ella. Tenga cuidado de seguir exactamente la sección "Declarar componentes de la biblioteca en el archivo de manifiesto".

Así que para refactorizar en una biblioteca básicamente marca el proyecto existente como un proyecto de biblioteca. Sólo tiene que marcar una casilla en la configuración de proyectos (consulte el enlace).

Ahora vaya a la biblioteca y queremos cambiar el nombre del paquete a algo diferente. Así que por ejemplo si su paquete de versión liberado es com.mywebsite.myappname.android_market entonces yo cambiaría esto a com.mywebsite.myappname.common_code

Puede hacer clic con el botón derecho del ratón en el proyecto y seleccionar Android Tools-> Rename package. Esta mitad funcionó para mí. También tuve que renombrar manualmente todas las referencias en el código a mi clase R manaully. Usted puede utilizar una búsqueda global reemplazar aunque para cambiar el nombre de com.mywebsite.myappname.android_market.R a com.mywebsite.myappname.common_code.R

Ahora tu biblioteca está lista

Ahora es el momento de hacer el proyecto real que va a construir.

Cree un nuevo proyecto android y el nombre con el nombre del paquete para el mercado android, como com.mywebsite.myappname.android_market. Siga las instrucciones en el vínculo para agregar su nueva biblioteca común como una biblioteca que utiliza este paquete.

Una limitación con los proyectos de la biblioteca de Android es que el manifiesto de la biblioteca NO se fusionará en el manifiesto de su proyecto de nivel superior. Necesita pegarlo allí a mano. También (ver enlace) necesita asegurarse de que todo en su manifiesto usa nombres de paquetes totalmente calificados. Así que si solía tener nombres de actividad como android: name = ". SplashScreenActivity" cambiarlo a android: name = "com.mywebsite.myappname.common_code.SplashScreenActivity"

Así que de nuevo se necesita combinar todo a mano, incluyendo permisos, intentos, actividades, etc.

Ahora acaba de construir el proyecto superior y que son buenos. Haga una envoltura para cada variante que desee construir.

También podría tener estos nuevos proyectos de nivel superior implementar cualquier cosa que sea diferente entre sus diferentes versiones. Así que su envoltorio de Android Market podría implementar una pantalla de bienvenida, y su versión de Amazon una pantalla de bienvenida diferente. O simplemente puede utilizar un enum en su proyecto común para conducir un mantener ambas pantallas de bienvenida en allí.

Otra característica interesante es que los recursos del proyecto superior anularán los recursos de la biblioteca si se proporcionan. Por lo tanto, si desea, por ejemplo, en su splash tener un logotipo de la versión de Amazon y un logotipo de Android Market que los cambios basados ​​en la versión sólo tiene que utilizar el mismo nombre de imagen que en común y poner una copia diferente en las dos versiones.

Aunque no está directamente relacionado con tu pregunta, encontré un obstáculo similar al crear versiones gratuitas y pagadas de mi aplicación. Android le permite exportar cualquier aplicación como una biblioteca. Puede encontrar esta opción dentro de las propiedades del proyecto en Eclipse. Así, exportando toda la aplicación como una biblioteca, puede incorporarla a otras aplicaciones. Una vez que se haya exportado su biblioteca, puede crear una aplicación de Amazon y Google utilizando la biblioteca como base. Esto evitará que tenga que cambiar el nombre de los archivos XML para obtener cada aplicación en un estado utilizable.

Las bibliotecas son agradables porque también se puede empacar los recursos con ellos también. Incluso puede agregar recursos que contengan el mismo nombre en las aplicaciones cliente y estos sobrescribirán la versión de la biblioteca. Así que usted podría tener diferentes pantallas de presentación basadas en el mercado de su aplicación está pulg El único lugar de las bibliotecas se quedó corto para mí fue incluidos los activos. Desafortunadamente, los recursos crudos no procesados ​​no se incluirán en una aplicación cliente de una biblioteca.

Me gustaría ver en el uso de control de versiones como git y tener tres ramas. Una rama no tendría un manifiesto, esta rama central tendría todo el código común que podría actualizar una vez. Las otras dos ramas serían Amazon, Google y lo que sea que aparezca. Estas ramas tendrían código específico de aplicación, el manifiesto, pantallas de bienvenida, etc Cuando su hecho de trabajo en su rama principal y desea presionar las actualizaciones, puede hacer una rama temporal de núcleo llamado googleRelease (o algo) y fusionar su rama de google.

Este es un ejemplo relativamente genérico, git es poderoso y se puede abordar en una variedad de maneras.

  • Clave de Google Maps en AndroidManifest.xml de google-services.json
  • Siempre vuelve a la pantalla de inicio de sesión
  • No se puede convertir la cadena '@ bool / some_key' a la clase de destino 'boolean'
  • Comprobando si un BroadcastReceiver está declarado en el manifiesto en tiempo de ejecución?
  • Diferentes resultados en Android 4.1
  • Navegación de la actividad de Android
  • Personalización de partes del manifiesto de Android
  • Cómo ocultar la barra de título a través del código en android
  • Back y Nav Up tienen resultados diferentes
  • AndroidManifest.xml con varias etiquetas de aplicación
  • Pantalla de llamadas entrantes / salientes personalizadas en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.