Calidad del código y Rendimiento con Xamarin

Contenido

El tema de hoy es Calidad del código y rendimiento con Xamarin / Xamarin.Forms.

Cuando hablamos de calidad y rendimiento del código hablamos de la experiencia del usuario. Cuando nuestra aplicación es pobre en rendimiento puede causar interacciones lentas con los usuarios, nuestra aplicación puede congelarse a veces, nuestra aplicación puede reducir la duración de la batería o el dispositivo puede calentarse solo por una operación en un bucle que nunca ha terminado.

Sin embargo, cuando hablamos de calidad y rendimiento hay algo más que implementar código eficiente. Podemos mejorar el rendimiento de nuestras aplicaciones de muchas maneras. Hay muchas técnicas, toneladas de artículos y algunas conferencias muy agradables que hablan de este tema.

Lo que tengo aquí es una recopilación de todos ellos con algunas prácticas recomendadas, herramientas, técnicas, etc. Te digo, este artículo va a volar su mente si trabaja con Xamarin.

¿Qué es Xamarin?

Si eres nuevo en este mundo, vamos a empezar a hablar de lo que es XAMARIN. Xamarin es un framework de código abierto para crear aplicaciones modernas para iOS, Android y Windows con .NET. Xamarin es una capa de abstracción que administra la comunicación de código compartido con el código de plataforma subyacente.

Xamarain Traditional

Cuando hablamos de Xamarin tenemos dos enfoques que podemos seguir. Uno de ellos es Xamarin Traditional (O Xamarin Clásico como algunas personas lo llaman).

Con este enfoque, puede escribir lógica de código una vez y compartirla en los proyectos de Xamarin Android, iOS y Windows, y en esos proyectos independientes está escribiendo código específico para esa plataforma y tiene acceso a sus API nativas.

💡 Esto significa:

Cualquier cosa que pueda hacer en Objective-C, Swift o Java se puede hacer en C# con Xamarin mediante Visual Studio, Visual Studio para Mac y Visual Studio Code en un futuro próximo con MAUI.

Xamarin.Forms

Por otro lado, Xamarin.Forms es un marco de interfaz de usuario que permite a los desarrolladores compilar aplicaciones de Xamarin.iOS, Xamarin.Android y Windows desde un único código base compartido.

Rendimiento

¿Nueva aplicación?

Lo primero es tomar buenas decisiones de arquitectura.

  • Así que elija un buen marco MVVM como Prism, ReactiveUI, MvvmLight, o simplemente lo que le gusta.
  • Si va a haber bases de datos involucradas, asegúrese de que está eligiendo un buen patrón de repositorio.

Si es nuevo en el mundo de Xamarin Forms o tiene un pequeño proyecto Xamarin.Forms Shell puede ser una buena opción porque probablemente tendrá todas las herramientas que necesita para trabajar con.

Elija sus dependencias sabiamente. Así que no vayas demasiado dependency-heavy. Intenta que tu aplicación sea ligera y ágil. Así que eligelos sabiamente, y por supuesto prueba a menudo.

¿Ya tienes una aplicación?

¿La arquitectura que tienes es la mejor opción? Si no es así, escribí un libro electrónico con 7 tácticas para estructurar sus proyectos con Xamarin.Forms que puede usar hoy para nuevos proyectos y los proyectos ya creados.

Puedes descargar aquí.

En la documentación oficial de Microsoft Xamarin, hay una sección centrada en la mejora del rendimiento de la aplicación Xamarin.Forms. In the official Microsoft Xamarin Documentation, there is a section focus on improving Xamarin.Forms app performance.

Aquí algunas recomendaciones:

  • Habilite el compilador XAML*, Use enlaces compilados*, Use representadores rápidos*. Estas opciones están habilitadas de forma predeterminada, pero para las soluciones más antiguas, debe habilitarlas manualmente.
  • Reducir enlaces innecesarios:no use enlaces para contenido que se pueda establecer fácilmente estáticamente. (Por ejemplo, el nombre de la página)
  • Elija el diseño correcto:por ejemplo, si tiene un diseño de pila, que es capaz de tener varios hijos, con un solo hijo es un desperdicio.
  • Optimizar el rendimiento del diseño, Usar programación asincrónica y Elegir cuidadosamente un contenedor de inserción de dependencias son sugerencias específicas que te recomiendo que sigas en la guía.
  • Utilice CollectionView en lugar de ListView:CollectionView es más flexible y eficaz que ListView.
  • Si está utilizando ListView, asegúrese de optimizar el rendimiento con inicialización, desplazamientointeracción.
  • Reducir el tamaño del árbol visual:reducir el número de elementos en una página hará que la página se represente más rápido.
  • Reduzca el tamaño del diccionario de recursos de la aplicación: Xaml que es específico de una página no debe incluirse en el diccionario de recursos de la aplicación, porque los recursos se analizarán en el inicio de la aplicación en lugar de cuando lo requiera una página.

Puedes seguir la guía completa aquí.

Creación de aplicaciones con Xamarin.Forms

Escribí un artículo hablando de ejemplos y sugerencias para crear aplicaciones en Xamarin Forms

En este artículo, hablo de los tres pilares para desarrollar mejores aplicaciones que son:

  1. Tu aplicación
  2. El propósito de la aplicación y
  3. El desarrollador

Además, le di algunos consejos generales y sugerencias para aumentar el rendimiento de la aplicación. En la sección de rendimiento, le di algunos recursos que puede comprobar.

Tip importante:

Trata de evitar RelativeLayout y AbsoluteLayout tanto como puedas.

También en el mismo artículo, di algunos consejos para Visual Studio y algunos consejos para ayudarle a elegir el mejor marco MVVM.

De la misma manera, tienes sus sugerencias para tus proyectos XAML y C# y mucho más.

Puedes leer el artículo completo aquí.

Rendimiento de inicio

Sé que esta es la lista es pequeña, pero si lo piensas te lo prometo, verás los resultados de inmediato.

  • No inicie / registre todos los servicios desde el principio, lazyload siempre que sea posible.
  • No descargues todos tus datos al iniciar.
  • Carga perezosa cualquier cosa que no necesites inmediatamente.
  • Piense en la experiencia del usuario.

Configuración de la versión

Android

  • Habilitar la compresión de diseño
  • Enable startup tracing on Android
    • Utilice AOT con el seguimiento de inicio para un inicio más rápido.
    • Puede utilizar perfiles personalizados con seguimiento de inicio.
  • Configuración del vinculador
    • Activar vincular ensamblados de SDK solo cuando la aplicación está en versión [como mínimo]
    • Activar Vincular todo/SDK y Ensamblar usuario cuando la aplicación está en versión [prueba manual]
  • Habilitar [assembly:LinkerSafe] en proyectos de enlace
  • Utilice paquetes de aplicaciones de Android.

Aquí algunos recursos:

  • Optimizar las compilaciones de Xamarin.Android.Optimize Xamarin.Android builds. enlace
  • Xamarin Android App Bundles. enlace
  • Xamarin Show – Android App Bundles. enlace
  • Articulo de blog de David Ortinau para arrancar el tiempo de inicio de Xamarin.Forms. enlace
  • Uso de perfiles de AOT personalizados con Xamarin.Android. enlace
  • Tiempos de inicio más rápidos con seguimiento de inicio en Android. enlace
  • Inicio de aplicación más rápido mediante perfiles personalizados con seguimiento de inicio. enlace

Resouces del vinculador:

  • Invertir tiempo en Xamarin Linker para tamaños de aplicación más pequeños. enlace
  • Optimización de aplicaciones y bibliotecas de Xamarin con el vinculador. enlace
  • Vinculación en Xamarin.Android.Linking on Xamarin.Android. enlace
  • Xamarin.Android Linker trucos parte 1.Xamarin.Android Linker Tricks Part 1. enlace

iOS

  • Habilitar el compilador de optimización de LLVM

Aquí algunos recursos:

  • Linking en Xamarin.iOS. enlace

Manejo de memoria

Controladores de eventos

Sé que estas cosas son algo que escucharías una y otra vez, pero confía en mí, es muy importante recordar estas reglas.

  • Desasociar siempre controladores de eventos y eliminar observadores
  • Cancelar la suscripción a eventos y evitar delegados anónimos para evitar pérdidas de memoria
  • Una referencia al método anónimo se puede almacenar en un campo y usar para cancelar la suscripción al evento

Solo recuerde darse de baja de los eventos y recuerde cancelar su suscripción antes de que se elimine el objeto de suscriptor. Eso es todo, tenlo en cuenta al principio.

Más tarde, lea el post que le daré y aplicar algunas otras mejores prácticas.

Referencias débiles

En .NET, cualquier referencia normal a otro objeto es una referencia segura. Es decir, cuando se declara una variable de un tipo que no es un tipo primitivo/de valor, se declara una referencia segura.

Por ejemplo, aquí el objeto A y el objeto B tienen fuertes referencias entre sí, y debido a esto, esto crea lo que llamamos un objeto inmortal.

TIP:

Los objetos inmortales son referencias circulares fuertes. En Xamarin.Android el GC controla que pero en Xamarin.iOS tenemos que tener cuidado.

Pero hey podemos utilizar unas referencias débiles para evitar objetos inmortales.

Se crea una referencia débil utilizando la instancia del objeto que se está interceptando. Por lo tanto, el objeto A mantiene una referencia fuerte al objeto B,pero el objeto B mantiene una referencia débil al objeto A.

Cargar datos de manera eficiente

Cuando su carga de una página que necesita para pensar en la experiencia del usuario. Debe ser informativo cuando cargue sus vistas y sus datos.

Una buena práctica es cargar el contenido local primero,estoy hablando de sus vistas y componentes que tiene localmente, y en segundo plano, puede comenzar a cargar sus datos.

Es necesario proporcionar a los usuarios una experiencia de como, hay algo que sucede y no sólo como no hay nada que aparece en la pantalla.

Puede usar un marcador de posición como etiquetas, imágenes, iconos de carga, indicadores de actividad, etc. Algo que me gusta es definir estados como (ocupado, completo, cancelado, etc.) y puedes usarlo con algunas animaciones adicionales.

No enlace cosas que se pueden establecer estáticamente:si tiene dos etiquetas, por ejemplo, una describe algo y la otra es lo que realmente se actualiza con algún tipo de datos, no enlace la etiqueta descriptiva al ViewModel, cosas como estas mejorarán el rendimiento de su aplicación.


Aqui algunos recursos:

  • Mejores practicas de rendimiento y manejo de memoria de Xamarin.Forms. enlace
  • Alexyey Strakh Xamarin Show Episodios: Administración de memoria. enlace
  • Detener referencia débil: Xamarin Community Toolkit: WeakEventManager. enlace

Calidad

Mejores practicas de Async/Await y Task

También escribí un post hablando de este tema aquí.

Async/Await es uno de esos temas sobre los que sientes que sabes mucho, pero luego no lo sabes. La realidad es que hay muchas maneras diferentes de usar Async/Await, y eso es parte del problema.

Por lo tanto, en el artículo, le doy algunos consejos como cómo invocar Tasks, cómo esperar varias tasks y lo que necesita saber sobre los Threads.

Para las tareas, tiene consejos como cómo devolver tareas, evitar «usar métodos void» para conocer el estado de su proceso, cómo devolver la tarea dentro de try / catch o bloques, y así sucesivamente.

Además, tiene algunas sugerencias para Xamarin.Forms y algunos complementos y extensiones que puede usar.

te recomiendo que leas el post aquí.

Controladores de errores y contenedores de tareas

Escribí un artículo sobre el control de errores globales en Xamarin Forms

Muchas veces podemos encontrar excepciones no controladas que son muy difíciles de detectar y registrar, y debe hacerlo para controlar los errores en la aplicación.

Hay controladores globales en cada plataforma para permitirle recibir notificaciones de excepciones que no ha controlado en otro lugar. Ese es un post muy bonito que recomiendo.

Además, escribí un artículo llamado Contenedor de tareas / comandos de RunSafe con Xamarin

Cuando trabajamos con Task y Command la mayoría de las veces hacemos implementaciones comunes de escenarios donde usamos código repetitivo. Por ejemplo, use IsBusy, try-catch, Loggin, etc.

La idea es hacer un wrapper que nos permita almacenar toda esta lógica para que podamos reutilizar ese código.

Tengo algunos consejos muy agradables que puedes consultar allí.

Validar entradas de usuario

Hay una biblioteca que se incluye en todos mis proyectos de Xamarin y que es Plugin.ValidationRules.

Mejore la calidad de sus datos mediante reglas de validación. Las reglas de validación comprueban que los datos que el usuario introduce en el registro cumplen los estándares especificados antes de que el usuario pueda guardar el registro.

Una regla de validación puede contener una fórmula o expresión que evalúa los datos de uno o más campos y devuelve un valor «True» o «False». Las reglas de validación también incluyen un mensaje de error para mostrar al usuario cuando la regla devuelve un valor «False» debido a un valor no válido.

Simple pero potente

Puedes ver la nueva versión aquí.

Prácticas recomendadas para administrar los recursos de los suyos

  • Iconos, imágenes, activos
    • Uso de activos no optimizados para cada plataforma y factor de forma ü
  • Carga de imágenes más rápida
    • evitar:
      • Colocar archivos grandes en un proyecto de .NET Standard
      • Aplazar imágenes o recursos clave/fundamentales cargando desde la web
    • Considere el uso de:
      • GlideX.Forms
      • Xamarin.Forms.Nuke
    • Implementar el almacenamiento en caché con FFImageLoading para imágenes de uso frecuente

Aquí algunos recursos:

  • Jonathon Pepper’s Blog Post en GlideX para Android. enlace
  • Android Asset Studio. enlace
  • Recursos alternativos de Xamarin.Android.Xamarin.Android Alternate Resources. enlace
  • Xamarin.Forms Nuke. enlace
  • FFImageLoading for Xamarin.Forms. enlace
  • Complemento mFractor para Visual Studio. enlace
  • Imágenes compartidas para Xamarin con el vínculo Resizetizer NT.

Prácticas recomendadas de dependencias

  • Optimizar dependencias que se usan

    Quitar todo lo que no se usa (nugets y dependencias adicionales). Que sea agradable y limpio. Así que sea inteligente al respecto, reduzca y simplemente use tantos como sea necesario.
  • Establezca las opciones del Administrador de paquetes NuGet para usar PackageReference como valor predeterminado

    Migrar package.config a PackageReference. Comience a moverse por la Referencia del paquete y en Visual Studio y en el Administrador de NuGet puede establecer su preferencia predeterminada en nuevos proyectos ahora, lo cual es genial e impresionante.

Aquí algunos recursos:

  • Guía de rendimiento de Android de Jonathan Pepper. enlace
  • Migre packages.config a PackageReference. enlace

herramientas

Opciones del generador de perfiles

Cuando desea obtener todo tipo de datos útiles de la aplicación es cuando necesita usar el generador de perfiles.

Profiler le ayuda a… Busque fugas de memoria, imágenes grandes, gráficos de objetos grandes, ámbitos amplios, referencias cruzadas, contextos que impidan que el recolector de elementos no utilizados funcione en propiedades, etc…

Medir: Tiempo de inicio, tiempo de operación, consumo de memoria, perfil de CPU, perfil de red, perfil de E/S, etc…

Tiene algunas opciones de generador de perfiles que tiene por ahí en caso de que nadie lo sepa, tenemos el generador de perfiles de Xamarin, los Xcode Instrumentsel Android Studio Profiler.

Y en caso de que te estés preguntando, cómo empezar a usar estas herramientas, aquí tienes todos los recursos que necesitas.

  • Generación de perfiles de aplicaciones de Xamarin.iOS con instrumentos.Profiling Xamarin.iOS Applications with Instruments. enlace
  • Perfilar aplicaciones Android. enlace

Extensiones de Visual Studio

XamRight – Visual Studio Marketplace: Xamright le ayuda a simplificar el desarrollo de formularios Xamarin y reduce el ciclo de depuración.

XAML Styler – Visual Studio Marketplace: XAML Styler es una extensión de Visual Studio que da formato al código fuente XAML en función de un conjunto de reglas de estilo. •

Fijador de nombres de métodos asincrónicos – Visual Studio Marketplace: la manera más fácil de analizar y corregir nombres de métodos para métodos asincrónicos.


Esto es todo lo que tengo en este artículo para usted. Sé que va a ser útil para usted.

Si quieres ver más consejos como este solo tienes que seguirme @luismatosluna en Twitter o añádeme, Luis Matos, en LinkedIn. ¡Nos vemos allí!

¿Qué opinas de este contenido?
 
Luis Matos

Luis Matos

I help professionals and companies to create value solutions. I am a Systems Engineer, blockchain executive, and international mobile application speaker. Founder of the Malla Consulting Agency and several international technology communities.
Suscribirte
Notificar de
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x

Buscar en el sitio