2012-04-18 9 views
5

Tengo una aplicación paga en el mercado de Android, sin embargo, quiero lanzar una versión gratuita con publicidad.Cómo mantener la versión gratuita/de pago de la aplicación separada en subversión

La manera más fácil que pensé hacer esto fue configurar una rama en mi repositorio de subversión que tiene el código adicional para agregar los anuncios. Sin embargo, cuando fui a enviar esto al mercado de Android, requieren nombres de paquetes únicos. Esta solución ya no me funciona porque tendría que cambiar el paquete de cada archivo de clase, lo que haría que fusionar el tronco y la rama fuera muy doloroso.

¿Cuál es la mejor manera de mantener juntos estos dos proyectos, compartir parches, pero con un paquete diferente?

+2

No estoy seguro de por qué las personas votan como fuera de tema. Esta es claramente una pregunta acerca de la estructura del proyecto y la administración de la configuración, que pertenecen aquí. –

Respuesta

3

Si realmente desea separar, la mejor manera es configurarlo como dos partes del mismo repositorio. De esta forma, al menos puedes fusionar los cambios en las diferentes ramas. Si quieres mantener las cosas completamente separadas, entonces estarás haciendo muchos archivos de parches.

He hecho esto y, francamente, no es una gran estrategia en la práctica. Mucho mejor, especialmente en entornos compilados, es tener un proceso de compilación independiente gratuito frente a pago, por lo que hay una base de código en lugar de dos. Si hay dos bases de datos, las cosas serán divergentes.

+0

Esa es la cuestión, no los quiero separados. Lo único que quiero separar es el código adicional que agrega los anuncios. Sin embargo, Android me obliga a tener un nombre de paquete único para mi aplicación. Así que me vería obligado a tener un cambio mayor que solo dos o tres archivos. – Malfist

+0

Quizás, un pequeño vudú precompilador también debería funcionar. Los sistemas de compilación son cosas increíbles. –

8

¿Has considerado las directivas del compilador ?

Ejemplo:

#define FREE 
// ... 
#if FREE 
Console.WriteLine("Free version"); 
#else 
Console.WriteLine("Paid version"); 
#endif 

Usted puede mantener exactamente la misma base de código y apuntar a los dos construye usando dos scripts de construcción separadas o una parametrable.

msbuild /p:DefineConstants=FREE 

Para hacerlo con Java, leer y thisthis. Y tal vez this.

+0

No pensé que Java escuchara esas cosas – Malfist

+0

También existe en Java. –

+0

@ Pierre303 Lo siento, no sabía que pudieras hacer eso. Sin embargo, todavía no resuelve el problema del paquete ... hmmm. –

0

El control de versiones es una manera pobre de manejar cosas como esta. Al final terminará con una pesadilla de mantenimiento: dos aplicaciones separadas que deben ser casi idénticas.

¿Ha considerado una solución de proyecto múltiple? (caveot: No he hecho esto, pero parece factible, y creo que Android lo permitirá. Lo intentaré más adelante y lo veré con certeza.) Compila todo el código de tu aplicación en un proyecto principal jar. Luego, cree dos aplicaciones de Android separadas, una para su versión paga y otra para la versión gratuita. Esto resolverá su problema de nombres de paquete. Estas aplicaciones simplemente se delegarán en el contenedor principal para casi todo, excepto que su versión de anuncio incluirá el código para admitir los anuncios.

También puede encontrar this discussion on a similar topic interesante.

5

Solo su paquete de aplicación debe ser único. Ver here. Ese es el paquete declarado en su archivo de manifiesto. Puede tener la mayor parte de su código en com.mydomain.myapp, y solo tiene una actividad principal diferente en com.mydomain.myapp.free.

0

Construir su aplicación usando un feature toggle le permitiría alcanzar su objetivo, pero es posible que tenga que volver a trabajar una gran cantidad de código.

Al definir 2 (recomendaría 3) el entorno del contenedor de características en a.ini como:

[paid] 
features.ads = false 
features.featureOne = true 
features.featureTwo = true 
features.premiumFeature = true 
features.underDevFeature = false 
features.debug = false; 

[free:paid] 
features.ads = true 
features.premiumFeature = false 

; And the optionnal third 
[development:paid] 
features.debug = true 
features.underDevFeature = true 

De esta manera, usted tiene una versión que es uniforme y requieren sólo una rama en su versión de código de control

En las secuencias de comandos específicos que luego tiene que comprobar si está autorizada la característica , si no, no lo muestra

Cuestiones relacionadas