Análisis de rendimiento de Android --- iniciar la optimización de Caton

1. premisa

Estudio Android 4.2.2

compileSdkVersión 30

buildToolsVersión "30.0.3"

        El retraso de inicio en Android hará que se haga clic en el icono de la pantalla y aparecerá la interfaz de respuesta después de esperar mucho tiempo, o aparecerá una pantalla en blanco o negro durante mucho tiempo durante el inicio. Antes de optimizar, tenemos que analizar y averiguar dónde está la congelación, lo que afecta la razón de nuestro inicio lento. El artículo anterior presentó cómo analizar el problema de la congelación durante el proceso de desarrollo de Android, sin limitarse a la congelación inicial. Dirección del artículo: análisis de rendimiento de Android --- Caton analysis_sunbinkang's blog-CSDN blog

El requisito previo para la optimización es que debe analizar los lugares que puede optimizar, y puede encontrar los lugares que toman mucho tiempo a través de herramientas.

2. Optimización --- arranque en frío

Hoy, nuestro artículo comienza con el problema del arranque en frío para optimizar.

Cuando se trata del inicio de Android, debemos conocer aproximadamente el proceso de inicio para que podamos encontrar el problema mejor y más rápido.

La puesta en marcha de Actividad involucra principalmente cuatro procesos

Proceso SystemServer: principalmente responsable de gestionar todo el Framework

Proceso de la aplicación: cuando el usuario de la aplicación hace clic en el ícono del escritorio, el proceso del Lanzador solicita el proceso del SystemServer y luego notifica a Zygote para que se incube.

Proceso Zygote: Todos los procesos de aplicación son incubados por Zygote, y el proceso Zygote es incubado por el proceso init, un proceso secundario del proceso init.

Proceso lanzador: el primer proceso de aplicación generado por el proceso Zygote.

La puesta en marcha de la Actividad contempla principalmente siete etapas

La primera etapa: Launcher notifica a AMS para iniciar una nueva actividad (ejecutada en el proceso donde se encuentra Launcher)

La segunda etapa: AMS primero verifica la corrección de la Actividad y, si es correcta, almacena temporalmente la información de la Actividad. Luego, AMS notificará al programa Launcher que pause la actividad (ejecutada en el proceso donde se encuentra AMS)

La tercera etapa: pausar la Actividad del Lanzador, y avisar a AMS que ha sido pausada (se ejecuta en el proceso donde se encuentra el Lanzador)

La cuarta etapa: Comprobar si existe el proceso donde se encuentra la actividad, si existe, directamente notificará al proceso e iniciará la Actividad en el proceso, si no existe, llamará a Process.start para crear un nuevo proceso (ejecutado en el proceso AMS, internamente a través de socket y comunicación Zygote, bifurcación de un nuevo proceso)

La quinta etapa: crear una instancia de ActivityThread, realizar algunas operaciones de inicialización y luego ingresar al ciclo Loop. (ejecutado en el proceso de aplicación recién creado)

La sexta etapa: procesar la solicitud de comunicación enviada por el nuevo proceso de aplicación para completar el proceso de creación y notificar la nueva aplicación para vincular la Aplicación. Si la aplicación no existe, se llamará a LoadedApk.makeApplication para crear un nuevo objeto de aplicación . Y notifique al proceso para iniciar el componente de actividad de destino (ejecutado en el proceso AMS)

La séptima etapa: cargar la clase MainActivity y llamar al método de ciclo de instrucción onCreate (ejecutado en el proceso de aplicación recién iniciado)

        Del anterior análisis del proceso de inicio, podemos saber que los puntos que podemos empezar a optimizar son principalmente el ciclo de vida oncreate de nuestra aplicación y el onCreate o onResume, onStart y otros ciclos de vida de la actividad . Otros procesos son todas llamadas al sistema Android y, por lo general, no podemos interferir.

Optimización 1. Cambio de tema para resolver el problema de la pantalla en blanco y negro

        Cuando el sistema carga e inicia la App, toma una cantidad de tiempo correspondiente, lo que hará que el usuario sienta un "retraso" al hacer clic en el ícono de la App. Para resolver este problema, el enfoque de Google es crear la App. Primero muestra una página en blanco y Google configura la ventana de fondo predeterminada del tema predeterminado para que sea blanca o negra , de modo que los usuarios puedan experimentar una respuesta inmediata después de hacer clic en el icono. Si el proceso de inicio de su aplicación o actividad es demasiado lento, lo que hace que la ventana de fondo del sistema no se reemplace a tiempo, habrá una pantalla blanca o negra al inicio (dependiendo de si el tema del tema es oscuro o claro). Para eliminar el problema de la pantalla en blanco y negro al inicio, la mayoría de las aplicaciones lo resuelven configurando su propia imagen de fondo en el tema.


Agregue un tema de inicio a styles.xml o themes.xml en la carpeta de valores de res

<style name="Launcher">
    <item name="android:windowBackground">@drawable/bg</item>
</style>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/white" />
    <item>
        <bitmap
            android:gravity="center"
            android:scaleType="centerCrop"
            android:src="@drawable/icon_qq_login" />
    </item>
</layer-list>

 

 

 

 Resumen: esta solución de optimización es en realidad un paliativo, no una solución permanente. Crea la ilusión de un inicio rápido desde la perspectiva de engañar a los usuarios. Pero es mejor que ver una pantalla blanca o negra.

Optimización 2. Use idleHandler para retrasar el procesamiento

El proyecto real descubrió que Youmeng y Tencent TBS toman mucho tiempo. Al considerar el negocio, se pueden inicializar después de que la CPU esté inactiva, por lo que estas inicializaciones de terceros se colocan aquí.

Looper.myQueue().addIdleHandler {
    // TODO:依赖库的初始化
    false
}

IdleHandler es una interfaz de devolución de llamada y la clase de implementación se puede agregar a través de addIdleHandler de MessageQueue. Cuando las tareas en MessageQueue se procesan temporalmente (no hay una tarea nueva o la tarea siguiente se retrasa), se devolverá la llamada a esta interfaz en este momento, y si devuelve falso, se eliminará, y si devuelve verdadero, será la próxima vez que se procese el mensaje.

Optimización 3. Optimización del diseño

        Reduzca el nivel de anidamiento del diseño, use include, viewStub, meger y otras etiquetas

Optimización 4. Carga asíncrona

        Use subprocesos asincrónicos para cargar algo de lógica, puede usar: RxJava, grupo de subprocesos, AsyncTask, IntentService, HandlerThread, Thread

Optimización 5. Carga diferida

        Por ejemplo, si la página de inicio es un visor+fragmento, puede usar la optimización de carga diferida

Optimización seis, modo estricto StrictMode

        StrictMode es una herramienta para desarrolladores que detecta cosas irracionales que consumen mucho tiempo y que podríamos estar haciendo sin querer y nos las señala para que podamos solucionarlas. StrictMode se usa más comúnmente para capturar el disco de archivos o el acceso a la red en el subproceso principal de la aplicación. Ayudarnos a mantener las operaciones de disco y red fuera del hilo principal hace que la aplicación sea más fluida y receptiva.

Establezca el modo estricto en el método OnCreate de la aplicación.

fun setStrictMode() {
        if (BuildConfig.DEBUG) {
            //线程检测策略
            StrictMode.setThreadPolicy(
                StrictMode.ThreadPolicy.Builder()
                    .detectDiskReads() //读、写操作
                    .detectDiskWrites()
                    .detectNetwork() // or .detectAll() for all detectable problems
                    .penaltyLog()
                    .build()
            );
            StrictMode.setVmPolicy(
                StrictMode.VmPolicy.Builder()
                    .detectLeakedSqlLiteObjects() //Sqlite对象泄露
                    .detectLeakedClosableObjects() //未关闭的Closable对象泄露
                    .penaltyLog() //违规打印日志 
                    .penaltyDeath() //违规崩溃 
                    .build()
            );
        }
    }

Esto puede ayudarnos a encontrar los problemas mejor y de manera oportuna, en lugar de encontrar estos problemas cuando se publique después.

3. Resumen

        El análisis de rendimiento debe analizarse y optimizarse de acuerdo con la situación real del proyecto. La optimización del rendimiento es un proceso que requiere mucho tiempo, por lo que debemos hacer todo lo posible para evitar estos problemas durante el proceso de desarrollo habitual, en lugar de realizar análisis y optimización del rendimiento cuando está a punto de publicarse en línea, por lo que lleva más tiempo del habitual preste atención También requiere más tiempo y mano de obra. Por lo tanto, desarrollar buenos hábitos de desarrollo puede ayudarnos a crecer mejor.

Supongo que te gusta

Origin blog.csdn.net/sunbinkang/article/details/125128651
Recomendado
Clasificación