Cómo mantener la versión gratuita / de pago de la aplicación separada en subversión

Tengo una aplicación paga en el mercado Android, sin embargo, quiero lanzar una versión gratuita compatible con publicidad.

La manera más fácil en que pensé hacer esto fue configurar una sucursal en mi repository 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 packages únicos. Esta solución ya no me funciona porque tendría que cambiar el package de cada file de class, lo que haría que fusionar el tronco y la twig fuera muy doloroso.

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

¿Has considerado las directivas del comstackdor ?

Ejemplo:

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

Puede mantener exactamente la misma base de código y dirigirse a las dos comstackciones usando dos scripts de compilation separados o uno paramétrico.

 msbuild /p:DefineConstants=FREE 

Para hacerlo con Java, lee esto y esto . Y tal vez esto .

Solo su package de request debe ser único. Mira aquí . Ese es el package declarado en su file de manifiesto. Puedes tener la mayor parte de tu código en com.mydomain.myapp , y solo tienes una actividad principal diferente en com.mydomain.myapp.free .

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

Hice esto y, francamente, no es una gran estrategia en la práctica. Mucho mejor, especialmente en entornos comstackdos, es tener un process de compilation independiente gratuito versus pagado, por lo que hay una base de código en lugar de dos. Si hay dos bases de código, las cosas divergirán.

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.

¿Has considerado una solución de proyecto múltiple? (caveot: en realidad no lo he hecho, pero parece factible, y creo que Android lo permitirá. Lo intentaré más adelante y lo veré con certeza.) Compile todo el código de la aplicación en el contenedor principal del proyecto. 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 package. Estas aplicaciones simplemente se delegarán en el contenedor principal para casi todo, excepto que su versión de anuncio includeá el código para admitir los anuncios.

También puede encontrar esta discusión sobre un tema similar interesante.

Crear su aplicación utilizando una feature toggle le permitiría alcanzar su objective, pero es posible que tenga que volver a trabajar mucho código.

Al definir 2 (recomendaría 3) el entorno contenedor de características en un file .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, tienes una versión que es uniforme y requiere solo una twig en tu fuente de control de versiones

En sus scripts específicos, debe verificar si la característica está autorizada, de lo contrario, no la muestra