Compartir a través de


Preparación de una aplicación para lanzamiento

Después de codificar y probar una aplicación, es necesario preparar un paquete para su distribución. La primera tarea de preparar este paquete es compilar la aplicación para la versión, lo que implica principalmente establecer algunos atributos de aplicación.

Siga estos pasos para compilar la aplicación para su lanzamiento:

  • Especifique el icono de aplicación : cada aplicación de Xamarin.Android debe tener especificado un icono de aplicación. Aunque técnicamente no es necesario, algunos mercados, como Google Play, lo requieren.

  • Versión de la aplicación : este paso implica inicializar o actualizar la información de control de versiones. Esto es importante para futuras actualizaciones de aplicaciones y para asegurarse de que los usuarios conozcan qué versión de la aplicación han instalado.

  • Reducir el APK : el tamaño del APK final se puede reducir considerablemente mediante el enlazador de Xamarin.Android en el código administrado y ProGuard en el bytecode de Java.

  • Proteger la aplicación – impida que los usuarios o atacantes depuren, manipulen o realicen ingeniería inversa de la aplicación deshabilitando la depuración, ofuscando el código gestionado, agregando mecanismos anti-depuración y anti-manipulación, y usando la compilación nativa.

  • Establecer propiedades de empaquetado : las propiedades de empaquetado controlan la creación del paquete de aplicación android (APK). Este paso optimiza el APK, protege sus recursos y modulariza el empaquetado según sea necesario. Además, puede proporcionar a los usuarios una agrupación de aplicaciones android optimizada para sus dispositivos.

  • Compilación : este paso compila el código y los recursos para comprobar que se compila en modo de versión.

  • Archivo para publicación : este paso compila la aplicación y la coloca en un archivo para firmar y publicar.

Cada uno de estos pasos se describe a continuación con más detalle.

Especificar el icono de aplicación

Se recomienda encarecidamente que cada aplicación de Xamarin.Android especifique un icono de aplicación. Algunos marketplaces de aplicaciones no permitirán que una aplicación android se publique sin una. La Icon propiedad del Application atributo se usa para especificar el icono de aplicación de un proyecto de Xamarin.Android.

En Visual Studio 2017 y versiones posteriores, especifique el icono de la aplicación a través de la sección Manifiesto de Android de propiedades del proyecto, como se muestra en la captura de pantalla siguiente:

Establecer el icono de la aplicación

En estos ejemplos, @drawable/icon hace referencia a un archivo de icono que se encuentra en Resources/drawable/icon.png (tenga en cuenta que la extensión .png no se incluye en el nombre del recurso). Este atributo también se puede declarar en el archivo Properties\AssemblyInfo.cs, como se muestra en este fragmento de código de ejemplo:

[assembly: Application(Icon = "@drawable/icon")]

Normalmente, using Android.App se declara en la parte superior de AssemblyInfo.cs (el espacio de nombres del Application atributo es Android.App); sin embargo, es posible que tenga que agregar esta using instrucción si aún no está presente.

Versión de la aplicación

El control de versiones es importante para el mantenimiento y la distribución de aplicaciones Android. Sin algún tipo de control de versiones en su lugar, es difícil determinar si o cómo se debe actualizar una aplicación. Para ayudar con el control de versiones, Android reconoce dos tipos diferentes de información:

  • Número de versión : valor entero (usado internamente por Android y la aplicación) que representa la versión de la aplicación. La mayoría de las aplicaciones comienzan con este valor establecido en 1 y, a continuación, se incrementa con cada compilación. Este valor no tiene ninguna relación o afinidad con el atributo de nombre de versión (consulte a continuación). Las aplicaciones y los servicios de publicación no deben mostrar este valor a los usuarios. Este valor se almacena en el archivo AndroidManifest.xml como android:versionCode.

  • Nombre de la versión: una cadena que solo se usa para comunicar información al usuario sobre la versión de la aplicación (como instalada en un dispositivo específico). El nombre de la versión está pensado para mostrarse a los usuarios o en Google Play. Android no usa internamente esta cadena. El nombre de la versión puede ser cualquier valor de cadena que ayude a un usuario a identificar la compilación instalada en su dispositivo. Este valor se almacena en el archivo AndroidManifest.xml como android:versionName.

En Visual Studio, estos valores se pueden establecer en la sección Manifiesto de Android de propiedades del proyecto, como se muestra en la captura de pantalla siguiente:

Establecer el número de versión

Reducir el APK

Los APK de Xamarin.Android se pueden hacer más pequeños mediante una combinación del enlazador de Xamarin.Android, que elimina el código administrado innecesario, y la herramienta ProGuard del SDK de Android, que quita código de bytes Java sin usar. El proceso de compilación usa primero el enlazador de Xamarin.Android para optimizar la aplicación en el nivel de código administrado (C#) y, después, usa ProGuard (si está habilitado) para optimizar el APK en el nivel de código de bytes de Java.

Configurar el enlazador

El modo de versión desactiva el entorno de ejecución compartido y activa la vinculación para que la aplicación solo envíe las partes de Xamarin.Android necesarias en tiempo de ejecución. El enlazador de Xamarin.Android usa análisis estáticos para determinar qué ensamblados, tipos y miembros de tipo se usan o hacen referencia a ellos mediante una aplicación de Xamarin.Android. A continuación, el enlazador descarta todos los ensamblados, tipos y miembros no usados ni referenciados. Esto puede dar lugar a una reducción significativa del tamaño del paquete. Por ejemplo, considere el ejemplo HelloWorld , que experimenta una reducción de 83% en el tamaño final de su APK:

  • Configuración: Ninguna – Xamarin.Android 4.2.5, Tamaño = 17,4 MB.

  • Configuración: solo ensamblajes del SDK – Xamarin.Android 4.2.5 Tamaño = 3,0 MB.

Establezca las opciones del enlazador a través de la sección Opciones de Android de las propiedades del proyecto:

Opciones del vinculador

El menú desplegable Vinculación proporciona las siguientes opciones para controlar el enlazador:

  • None – Esto desactiva el enlazador; no se realizará ninguna vinculación.

  • Solo ensamblados del SDK : esto solo vinculará los ensamblados necesarios para Xamarin.Android. No se vincularán otros ensamblados.

  • Sdk y ensamblados de usuario : esto vinculará todos los ensamblados que requiere la aplicación y no solo los que necesita Xamarin.Android.

La vinculación puede producir algunos efectos secundarios no deseados, por lo que es importante que una aplicación se vuelva a probar en modo de versión en un dispositivo físico.

ProGuard

ProGuard es una herramienta de Android SDK que vincula y ofusca el código Java. ProGuard se usa normalmente para crear aplicaciones más pequeñas reduciendo la superficie de bibliotecas grandes incluidas (como Google Play Services) en tu APK. ProGuard quita el código de bytes de Java sin usar, lo que hace que la aplicación resultante sea más pequeña. Por ejemplo, el uso de ProGuard en aplicaciones pequeñas de Xamarin.Android suele lograr aproximadamente una reducción de tamaño de 24%: el uso de ProGuard en aplicaciones más grandes con varias dependencias de biblioteca suele lograr una reducción de tamaño aún mayor.

ProGuard no es una alternativa al enlazador de Xamarin.Android. El enlazador de Xamarin.Android vincula el código administrado , mientras que ProGuard vincula el código de bytes de Java. El proceso de compilación usa primero el enlazador de Xamarin.Android para optimizar el código administrado (C#) en la aplicación y, después, usa ProGuard (si está habilitado) para optimizar el APK en el nivel de código de bytes de Java.

Cuando se activa Habilitar ProGuard , Xamarin.Android ejecuta la herramienta ProGuard en el APK resultante. ProGuard genera y usa un archivo de configuración de ProGuard en tiempo de compilación. Xamarin.Android también admite acciones de compilación personalizadas de ProguardConfiguration . Puede agregar un archivo de configuración de ProGuard personalizado al proyecto, hacer clic con el botón derecho en él y seleccionarlo como una acción de compilación, como se muestra en este ejemplo:

ProGuard está deshabilitado de forma predeterminada. La opción Habilitar ProGuard solo está disponible cuando el proyecto está en el modo Release. Se omiten todas las acciones de compilación de ProGuard a menos que Enable ProGuard (Habilitar ProGuard) esté activado. La configuración de Xamarin.Android ProGuard no ofusca el APK y no es posible habilitar ofuscación, incluso con archivos de configuración personalizados. Si desea usar ofuscación, consulte Protección de aplicaciones con Dotfuscator.

Para obtener información más detallada sobre el uso de la herramienta ProGuard, consulte ProGuard.

Protección de la aplicación

Desactivar la depuración

Durante el desarrollo de una aplicación Android, la depuración se realiza mediante el uso del Protocolo de conexión de depuración de Java (JDWP). Se trata de una tecnología que permite a las herramientas como adb comunicarse con una JVM con fines de depuración. JDWP está activado de forma predeterminada para las compilaciones de depuración de una aplicación de Xamarin.Android. Aunque JDWP es importante durante el desarrollo, puede suponer un problema de seguridad para las aplicaciones publicadas.

Importante

Deshabilite siempre el estado de depuración en una aplicación publicada, ya que es posible (a través de JDWP) obtener acceso completo al proceso de Java y ejecutar código arbitrario en el contexto de la aplicación si este estado de depuración no está deshabilitado.

El manifiesto de Android contiene el android:debuggable atributo , que controla si se puede depurar o no la aplicación. Se considera una buena práctica establecer el atributo android:debuggable en false. La manera más sencilla de hacerlo es agregando una instrucción de compilación condicional en AssemblyInfo.cs:

#if DEBUG
[assembly: Application(Debuggable=true)]
#else
[assembly: Application(Debuggable=false)]
#endif

Tenga en cuenta que las compilaciones de depuración establecen automáticamente algunos permisos para facilitar la depuración (como Internet y ReadExternalStorage). Sin embargo, las compilaciones de versión solo utilizan los permisos que usted configure explícitamente. Si encuentra que cambiar a la compilación release hace que la aplicación pierda un permiso que estaba disponible en la compilación de depuración, compruebe que ha habilitado explícitamente este permiso en la lista Permisos necesarios , tal como se describe en Permisos.

Protección de aplicaciones con Dotfuscator

Incluso con la depuración deshabilitada, todavía es posible que los atacantes vuelvan a empaquetar una aplicación, agregando o quitando opciones o permisos de configuración. Esto les permite realizar ingeniería inversa, depurar o alterar la aplicación. Dotfuscator Community Edition (CE) se puede usar para ofuscar el código administrado e insertar código de detección de estado de seguridad en tiempo de ejecución en una aplicación de Xamarin.Android en tiempo de compilación para detectar y responder si la aplicación se ejecuta en un dispositivo raíz.

Dotfuscator CE se incluye con Visual Studio 2017. Para usar Dotfuscator, haga clic en Herramientas > PreEmptive Protection - Dotfuscator.

Para configurar Dotfuscator CE, consulte Uso de Dotfuscator Community Edition con Xamarin. Una vez configurado, Dotfuscator CE protegerá automáticamente cada compilación que se cree.

Empaquetar ensamblados en código nativo

Cuando esta opción está habilitada, los ensamblados se agrupan en una biblioteca compartida nativa. Esto permite comprimir los ensamblados, lo que permite archivos más pequeños .apk . La compresión de ensamblado también confiere una forma mínima de ofuscación; no se debería confiar en ella.

Esta opción requiere una licencia Enterprise y solo está disponible cuando se deshabilita el uso de implementación rápida . Agrupar ensamblados en código nativo está deshabilitado de forma predeterminada.

Tenga en cuenta que la opción Agrupar en código nativono significa que los ensamblados se compilen en código nativo. No es posible usar la compilación AOT para compilar ensamblados en código nativo.

Compilación AOT

La opción compilación AOT (de la página Propiedades de empaquetado) habilita la compilación Ahead Of Time (AOT) de los ensamblados. Cuando esta opción está habilitada, la sobrecarga de inicio Just-In-Time (JIT) se minimiza mediante la precompilación de ensamblados antes del tiempo de ejecución. El código nativo resultante se incluye en el APK junto con los ensamblados no compilados. Esto da como resultado un tiempo de inicio de aplicación más corto, pero a costa de tamaños apk ligeramente mayores.

La opción Compilación de AOT requiere una licencia Enterprise o superior. La compilación AOT solo está disponible cuando el proyecto está configurado para el modo de versión y está deshabilitado de forma predeterminada. Para obtener más información sobre la compilación de AOT, consulte AOT.

Compilador de optimización de LLVM

El compilador de optimización de LLVM creará código compilado más pequeño y rápido y convertirá ensamblados compilados AOT en código nativo, pero a costa de tiempos de compilación más lentos. El compilador LLVM está deshabilitado de forma predeterminada. Para usar el compilador LLVM, la opción compilación de AOT debe estar habilitada primero (en la página Propiedades de empaquetado ).

Nota:

La opción Compilador de optimización de LLVM requiere una licencia Enterprise.

Establecer propiedades de empaquetado

Las propiedades de empaquetado se pueden establecer en la sección Opciones de Android de propiedades del proyecto, como se muestra en la captura de pantalla siguiente:

Propiedades de empaquetado

Muchas de estas propiedades, como Usar tiempo de ejecución compartido y Usar implementación rápida están pensadas para el modo de depuración. Sin embargo, cuando la aplicación está configurada para el modo de versión, hay otras opciones que determinan cómo se optimiza la aplicación para la velocidad de tamaño y ejecución, cómo está protegida contra alteraciones y cómo se puede empaquetar para admitir diferentes arquitecturas y restricciones de tamaño.

Especificar arquitecturas admitidas

Al preparar una aplicación de Xamarin.Android para su lanzamiento, es necesario especificar las arquitecturas de CPU que se admiten. Un único APK puede contener código de máquina para admitir varias arquitecturas diferentes. Consulte Arquitecturas de CPU para más información sobre cómo admitir varias arquitecturas de CPU.

Generar un paquete (.APK) para cada ABI seleccionada

Cuando esta opción está habilitada, se creará un APK para cada una de las ABI admitidas (seleccionada en la pestaña Avanzadas , como se describe en Arquitecturas de CPU) en lugar de un único APK grande para todas las ABI admitidas. Esta opción solo está disponible cuando el proyecto está configurado para el modo de versión y está deshabilitado de forma predeterminada.

Multi-Dex

Cuando se habilita la opción Habilitar multidex, se utilizan las herramientas del SDK de Android para eludir el límite de 65K métodos del formato de archivo .dex. La limitación del método 65K se basa en el número de métodos de Java a los que hace referencia una aplicación (incluidos los de las bibliotecas de las que depende la aplicación), no se basa en el número de métodos escritos en el código fuente. Si una aplicación solo define algunos métodos, pero usa muchas (o bibliotecas grandes), es posible que se supere el límite de 65 000.

Es posible que una aplicación no use todos los métodos de cada biblioteca a la que se hace referencia; por lo tanto, es posible que una herramienta como ProGuard (vea arriba) puede quitar los métodos sin usar del código. El procedimiento recomendado es habilitar Habilitar Multi-Dex solo si es absolutamente necesario, es decir, la aplicación todavía hace referencia a más de 65 000 métodos java incluso después de usar ProGuard.

Para obtener más información sobre Multi-Dex, vea Configurar aplicaciones con más de 64K Métodos.

Paquetes de aplicaciones de Android

Las agrupaciones de aplicaciones difieren de las API, ya que no se pueden implementar directamente en un dispositivo. Más bien, es un formato que está pensado para ser cargado con todo tu código compilado y recursos. Después de cargar tu paquete de aplicaciones firmado, Google Play tendrá todo lo que necesita para compilar y firmar los APKs de tu aplicación y servirlos a los usuarios utilizando Dynamic Delivery.

Para habilitar la compatibilidad con paquetes de aplicaciones de Android, deberá seleccionar el valor de la propiedad Formato de paquete de Androidbundle dentro de las opciones de su proyecto de Android. Antes de hacerlo, asegúrese de cambiar el proyecto a configuración Release, ya que los paquetes de aplicaciones están diseñados exclusivamente para versiones de lanzamiento.

Ahora puede generar una agrupación de aplicaciones siguiendo el flujo de archivo. Esto generará una agrupación de aplicaciones para la aplicación.

Para obtener más información sobre los paquetes de aplicaciones de Android, consulte Paquetes de aplicaciones de Android.

Compile

Una vez completados todos los pasos anteriores, la aplicación está lista para la compilación. Seleccione Compilar > Recompilar solución para comprobar que se compila correctamente en el modo de versión. Tenga en cuenta que este paso aún no genera un APK.

La firma del paquete de aplicación describe el empaquetado y la firma con más detalle.

Archivo para la publicación

Para comenzar el proceso de publicación, haga clic con el botón derecho en el proyecto en el Explorador de soluciones y seleccione el elemento de menú contextual Archivo... :

Archivo de la aplicación

Archivo... inicia archive Manager y comienza el proceso de archivado de la agrupación de aplicaciones como se muestra en esta captura de pantalla:

Administrador de archivos

Otra manera de crear un archivo es hacer clic con el botón derecho en la solución en el Explorador de soluciones y seleccionar Archivar todo..., que compila la solución y archiva todos los proyectos de Xamarin que pueden generar un archivo:

Archivar todo

Tanto Archive como Archive All inician automáticamente el Administrador de archivos. Para iniciar el Administrador de archivos directamente, haga clic en el elemento de menú Herramientas > Archive Manager... :

Iniciar el Administrador de archivos

Los archivos de la solución en cualquier momento haciendo clic con el botón derecho en el nodo Solución y seleccionando Ver archivos:

Consulta de los archivos

El Administrador de archivos

El Administrador de archivos se compone de un panel Lista de soluciones, una lista de archivos y un panel de detalles:

Paneles de Archive Manager

La lista de soluciones muestra todas las soluciones que tienen al menos un proyecto archivado. La lista de soluciones incluye las secciones siguientes:

  • Solución actual : muestra la solución actual. Tenga en cuenta que esta área puede estar vacía si la solución actual no tiene un archivo existente.
  • Todos los archivos : muestra todas las soluciones que tienen un archivo.
  • Cuadro de texto de búsqueda (en la parte superior): filtra las soluciones listadas en la lista Todos los Archivos de acuerdo con la cadena de búsqueda ingresada en el cuadro de texto.

La lista de archivos muestra la lista de todos los archivos de la solución seleccionada. La lista de archivos incluye las secciones siguientes:

  • Nombre de la solución seleccionado : muestra el nombre de la solución seleccionada en la lista de soluciones. Toda la información que se muestra en la lista de archivos hace referencia a esta solución seleccionada.
  • Filtro de plataformas : este campo permite filtrar los archivos por tipo de plataforma (como iOS o Android).
  • Elementos de archivo: lista de archivos para la solución seleccionada. Cada elemento de esta lista incluye el nombre del proyecto, la fecha de creación y la plataforma. También puede mostrar información adicional, como el progreso cuando se archiva o publica un elemento.

El Panel de detalles muestra información adicional sobre cada archivo. También permite al usuario iniciar el flujo de trabajo distribución o abrir la carpeta donde se ha creado la distribución. La sección Comentarios de compilación permite incluir comentarios de compilación en el archivo.

Distribución

Cuando una versión archivada de la aplicación esté lista para publicarse, seleccione el archivo en el Administrador de archivos y haga clic en el botón Distribuir... :

Botón Distribuir

El cuadro de diálogo Canal de distribución muestra información sobre la aplicación, una indicación del progreso del flujo de trabajo de distribución y una elección de canales de distribución. Al ejecutar el programa por primera vez, se presentan dos opciones:

Seleccionar canal de distribución

Es posible elegir uno de los siguientes canales de distribución:

  • Ad-Hoc : guarda un APK firmado en el disco que se puede transferir localmente a dispositivos Android. Continúe a Firmar el paquete de la aplicación para obtener información sobre cómo crear una identidad de firma de Android, crear un nuevo certificado de firma para aplicaciones Android y publicar una versión ad hoc de la aplicación en el disco. Esta es una buena manera de crear un APK para las pruebas.

  • Google Play – Publica un APK firmado en Google Play. Continúe publicando en Google Play para aprender a firmar y publicar un APK en Google Play Store.