Administrar dos aplicaciones similares

He estado progtwigndo una aplicación para Android por un time y queremos lanzar dos versiones que tengan cambios menores el uno del otro. Me preocupa el mantenimiento de la aplicación una vez que la dividimos en dos (cambio algo en una y no la actualizo en la otra). ¿Cuál es la mejor manera de hacerlo? Estaba pensando en crear dos twigs svn para cada versión de la aplicación y hacer que las personas confirmen los cambios en el tronco y luego fusionarlos en las twigs. ¿Es esta la solución más fácil y eficaz en el time?

Aprende a usar la ant

http://developer.android.com/guide/developing/projects/projects-cmdline.html

Como ejemplo básico, puede generar un file build.xml desde la línea de command, dentro del directory del proyecto con

android update project -p ./ 

A continuación, puede crear un directory de configuration y almacenar algunos elementos, como AndroidManifest.xml y Config.java que guarda en su package. Reemplazar ciertos elementos con tokens, por ejemplo, build -appone.properties podría leer

 config.package_name=com.me.appone config.some_var = "foobar" 

y sus files en config tendrán tokens reemplazando text original como, Config.java

 ... public static final String FOO_BAR = "@CONFIG.SOME_VAR@"; ... 

Luego puedes editar tu build.xml y agregar objectives personalizados como ese

 <target name="-configapp"> <copy file="config/Config.java" todir="${source.dir}/com/me/appone/" overwrite="true" encoding="utf-8"> <filterset> <filter token="CONFIG.SOME_VAR" value="${config.some_var}"/> </filterset> </copy> </target> <target name="release-appone"> <loadproperties srcFile="build-appone.properties"/> <antcall target="-configapp"/> <antcall target="release"/> </target> 

entonces puedes build el release-appone objective ejecutando

 ant release-appone 

o haciendo clic derecho en build.xml, Ejecutar como -> 2. Ant Task …, luego seleccionando tu objective y presionando el button de ejecución.

Se puede encontrar más información sobre la ant en los interwebs.

AndroidManifest.xml

Vale la pena mencionar que si va a mover el nombre del package, el código de la versión y el nombre de la versión en un file build.properties y copyrlo en el directory raíz usando filters de config / AndroidManifest.xml, debe explicar los diferentes nombres de packages . Entonces no hay routes relativas a las actividades en manifest y también necesitará personalizar el objective -pre-compile para mover el R.java generado al directory correcto (basado en el nombre del package) y usar el bit antgerex para arreglar el nombre del package en R.java, donde -pre-comstackr es un objective vacío ya existente reservado para su uso por google

Actualizando R.java

Para actualizar R.java, desea anular el objective de compilation previa, localizar R.java, mover el file y utilizar replaceregexp para editar el nombre del package dentro del file de forma adecuada. Puede search documentation para cada llamada de ant para personalizarla según sus necesidades. Aquí hay un ejemplo que puede contener errores con algunos comentarios sobre porciones relevantes para leer más en la documentation de ant.

 <target name="-pre-compile"> <echo>Fixing R.java</echo> <!-- setup a prop for reuse that points to R.java containing dir --> <property name="config.gen_pkg" value="${gen.absolute.dir}/com/me/dir"/> <!-- this pulls a list of directories and assigns it to a refid via "id" --> <dirset id="config.R_loc" dir="${config.gen_pkg}" includes="*"/> <!-- this takes the refid and pushes it into a usable property --> <property name="prop.R_loc" refid="config.R_loc"/> <!-- now we move the file to where we want --> <move file="${config.gen_pkg}/${prop.R_loc}/R.java" todir="${config.gen_pkg}" overwrite="true" encoding="utf-8"/> <!-- use regex to update the package name --> <replaceregexp file="${config.gen_pkg}/R.java" match="^package com.*$" replace="package com.correct.package.name" byline="true"/> </target> 

Tendrás que adaptar esto a tus propias circunstancias, por supuesto.

La mejor manera es poner la mayor parte de tu código en un proyecto de biblioteca. Luego crea tantos proyectos como necesites como carillas finas sobre la biblioteca. Hacemos esto, por ejemplo, para crear aplicaciones separadas para Android Market y Amazon Appstore. (Utilizamos el código de licencia para el primero y no para el segundo, los manifiestos deben ser ligeramente diferentes, para las aplicaciones que se vinculan al mercado, necesitamos diferentes URL para cada mercado, etc.)

¿Hay alguna manera de agregar algún tipo de cambio de function a su aplicación? ¿Quizás algo que viviría en la configuration de la aplicación, o se basaría en la authentication del usuario para activar / desactivar el set correcto de características?

De esta manera, tiene una base de código con ambos sets de características (suponiendo que haya un código común entre las dos aplicaciones).

No he hecho desarrollo de Android o dispositivos mobilees, pero he utilizado esta técnica con éxito en el desarrollo web de Java donde teníamos la misma aplicación con diferentes características activadas según los usuarios del sistema.

Evitaría dividirlo en dos bases de código diferentes. Simplemente está introduciendo mucho más sobrecarga en mantenimiento para usted.