Diferenciación de la compilación de depuración y producción de una aplicación para Android

Hace poco comencé a aprender sobre el desarrollo de aplicaciones para Android. También es mi primera experiencia con el lenguaje Java.

Hay algunas herramientas de depuración que quiero incorporar en mi desarrollo de aplicaciones en una forma de dependencia de paquetes Java. Por razones obvias, me gustaría incluirlo sólo para depurar compilaciones.

En iOS, podemos usar la configuración de compilación para enlazar con las bibliotecas de depuración sólo para las compilaciones de depuración y utilizar macros para eliminar partes del código que se ocupa de la depuración. Esto hace que sea realmente fácil cambiar entre compilaciones de depuración y producción. De todos modos para lograr lo mismo para Android?

Hasta ahora, lo más cercano que obtuve es usar perfiles Maven para sobrescribir archivos de propiedades, que se cargan por la aplicación, pero esto requiere que las bibliotecas de depuración sigan siendo importadas.


Para aclarar mi pregunta, aquí es lo que quiero hacer: He construido una biblioteca que le permitirá navegar por la base de datos SQLite en su navegador. Es realmente útil para fines de depuración, pero no quiero enviar mi aplicación con la biblioteca.

Otro propósito es usar HockeyApp. HockeyApp proporciona dos funciones: notificación de actualización y notificación de fallos. Necesito tres diferentes compilaciones para que esto funcione:

  • Producción: Informes de bloqueo Activado, notificación de actualización Desactivado
  • Beta: Ambos
  • Debug: ambos desactivados

En <application> del manifiesto, puede establecer el atributo debuggable . Eclipse lo hace automáticamente si omite el atributo. Las compilaciones de depuración tienen debuggable=true , las compilaciones bien exportadas tienen debuggable=false .

Esto afecta a Log.d y puede verificar el código de manera condicional utilizando lo siguiente:

 boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)); 

Además de Maven, una forma es usar un inyector de dependencia como Dagger

Construyendo sobre anotaciones estándar de javax.inject (JSR-330), cada clase es fácil de probar. Usted no necesita un montón de boilerplate sólo para intercambiar el RpcCreditCardService de un FakeCreditCardService.

La inyección de dependencia no es sólo para pruebas. También facilita la creación de módulos reutilizables e intercambiables. Puede compartir el mismo AuthenticationModule en todas sus aplicaciones. Y puede ejecutar DevLoggingModule durante el desarrollo y ProdLoggingModule en la producción para obtener el comportamiento adecuado en cada situación.

Una forma de resolver esto es comprobar el valor devuelto de PackageManager # getInstallerPackageName . Devuelve null si el apk se instaló manualmente a través de adb, a través de una página web oa través de un servicio como HockeyApp. De hecho, recientemente he añadido un cheque similar a nuestro sdk, vea este commit .

Tenga en cuenta que esta solución sólo es fiable si sólo distribuye su aplicación (pagada) a través de Google Play. La última vez que lo comprobé, tiendas alternativas como Amazon App Store o AndroidPIT no estaban configurando la fuente del instalador (es posible establecerlo desde el nivel 11 de la API, vea PackageManager # setInstallerPackageName ).

Otra opción es comprobar el nombre del paquete en tiempo de ejecución. Para las versiones beta, agregaría ".beta" al nombre del paquete y, a continuación, compruebe que este sufijo habilite actualizaciones en la aplicación o depure cosas. Puede hacerlo moviendo su base de código en un proyecto de biblioteca y configurando dos proyectos de aplicación que hacen referencia a este proyecto de biblioteca: uno para la aplicación de tienda y otro para la aplicación beta. Nuestro uso aapt con la opción --rename-manifest-package para cambiar el nombre del paquete de beta construye (vea los detalles aquí ).

Usted tiene uso BuildConfig.DEBUG, esto es creado por la herramienta androide adt

/ Gen / BuildConfig

  • Agregar archivos .aar locales a mi compilación gradle
  • Android y Maven: Acelerar la compilación e implementación de proyectos
  • Cómo unban un proyecto en Maven
  • Pasa parámetro de perfil MAVEN de jenkins
  • Configuración de la biblioteca de soporte de Android con maven
  • NoClassDefFound error al importar el proyecto desde git
  • Maven para los proyectos de Android?
  • Android Studio publica una biblioteca local
  • Añadir biblioteca java al proyecto Android Studio con el repositorio maven
  • Cómo agregar biblioteca google play servicio en el estudio android con éxito
  • Error al crear un proyecto de Android con Maven: nivel de plataforma / API 16 no disponible
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.