Capítulo ocho Otra optimización de la optimización del rendimiento (4)

Directorio de artículos

Capítulo ocho Otra optimización de la optimización del rendimiento (4)

(1) Optimización de red

(1) Necesidad de optimización de red

1. Pequeño consumo de tráfico 2. Pequeño
consumo de energía
3. Corto tiempo de espera del usuario

(2) Herramientas para analizar conexiones de red

1 、 Monitor de red

Pertenece a la herramienta integrada Monitor de Android, que rastrea la solicitud de datos de la aplicación seleccionada en tiempo real. Podemos conectarnos al teléfono móvil, seleccionar y depurar el proceso de la aplicación, y luego operar la solicitud de página que necesitamos analizar en la aplicación.

2. Herramienta de proxy de red

En general, las herramientas de proxy de red tienen dos funciones:

  • Interceptar paquetes de respuesta de solicitud de red, analizar solicitudes de red
  • Configure una red proxy, que generalmente se usa para probar diferentes entornos de red en el desarrollo de aplicaciones móviles, como Wifi / 4G / 3G / red débil, etc.
    Hay muchas herramientas proxy, como Wireshark, Fiddler, Charles, etc.

(3) Optimización de la conexión de red

1. Pensamiento

Reducir el tiempo activo de la radio
significa reducir la frecuencia de adquisición de datos de la red. Esto reduce el consumo de energía de la radio y controla el uso de energía.
Reducir el tamaño del paquete de datos obtenido
puede reducir el consumo de tráfico y hacer que cada solicitud sea más rápida, lo que no es bueno en la situación de la red. El caso también tiene un buen rendimiento, mejorando la experiencia del usuario.

2. Diseño

(1) Diseño de interfaz
  • Diseño de
    la API El diseño de la API entre la aplicación y el servidor debe considerar la frecuencia de las solicitudes de red, el estado de los recursos, etc. para que la aplicación pueda completar la visualización de los requisitos comerciales y las interfaces con menos solicitudes.
  • Compresión Gzip
    Use Gzip para comprimir la solicitud y la respuesta, reducir la cantidad de datos transmitidos y, por lo tanto, reducir el consumo de tráfico.
  • El uso de Protocol Buffer en lugar de JSON
    Protocol Buffer es un formato de intercambio de datos introducido por Google. Si nuestra interfaz transmite una gran cantidad de datos cada vez, podemos considerar protobuf, que será mucho más pequeño que los datos
    JSON . JSON también tiene sus ventajas, pero Mayor legibilidad: reduzca la cantidad de datos (por supuesto, la conveniencia de mapear a POJO)
  • El tamaño de la
    imagen es mucho mayor que el de la solicitud de interfaz. Por lo tanto, también es un punto que debemos optimizar. Podemos informar al servidor sobre el ancho y la altura de la imagen al obtener la imagen, para que el servidor pueda proporcionar una imagen adecuada. Evitar el desperdicio.
(2) caché de red

El almacenamiento en caché adecuado no solo puede hacer que nuestra aplicación se vea más rápida, sino que también evita un consumo innecesario de tráfico.

  • Cuando hay una red, de acuerdo con el tiempo de control de caché establecido, se determina si se debe usar el caché o realizar una solicitud de red nuevamente.
  • Use el caché directamente sin un entorno de red para garantizar una experiencia de lectura.
(3) solicitud de red de embalaje

Cuando el diseño de la interfaz no puede satisfacer nuestras necesidades comerciales. Por ejemplo, una interfaz puede necesitar solicitar varias interfaces, o la red es buena, y queremos obtener más datos cuando está en estado Wifi.
En este momento, podemos empaquetar algunas solicitudes de red, por ejemplo Al mismo tiempo que solicita la lista, se obtienen los datos detallados del elemento del artículo con una alta tasa de clics en el encabezado.

(4) Supervisar el estado relevante

Al monitorear el estado del dispositivo: estado de suspensión, estado de carga, estado de la red
combinado con JobScheduler para realizar solicitudes de red de acuerdo con la situación real. Por ejemplo, imágenes de publicidad de la pantalla de bienvenida de Splash, podemos descargar y almacenar en caché localmente cuando estamos conectados a Wifi; Aplicación de noticias Carga, caché sin conexión en estado Wifi.

(5) Pruebas y optimización de redes débiles

Además de la optimización normal de la red, también debemos considerar el rendimiento de la aplicación en el caso de una red débil. Crear e iniciar un emulador de Android puede establecer la velocidad de la red y retrasar
la optimización de la red débil, lo que esencialmente permite a los usuarios fluir en el caso de redes débiles Use nuestra aplicación. Todo lo que tenemos que hacer es combinar los elementos de optimización anteriores:

  • Compresión / reducción de la transmisión de datos.
  • Usar caché para reducir la transmisión de red
  • Para redes débiles (redes móviles), las imágenes no se cargan automáticamente
  • Interfaz primera respuesta, solicitud de envío retrasado
(6) Optimización del servidor

Incluyendo desarrollo de código del lado del servidor, métodos de implementación, etc.

(4) El impacto de Http y Https en la velocidad de acceso (rendimiento)

HTTPS desempeña un papel muy importante en la protección de la privacidad del usuario y la prevención del secuestro del tráfico, pero al mismo tiempo, HTTPS también reducirá la velocidad de acceso del usuario y aumentará el consumo de recursos informáticos del servidor del sitio web.
El impacto proviene principalmente de dos aspectos:
a. RTT de red (tiempo de ida y vuelta) aumentado por la interacción del protocolo.
b) Los cálculos relacionados con el cifrado y descifrado llevan tiempo.

1. Mayor tiempo de red

La red de la primera solicitud HTTP requiere mucho tiempo. Los usuarios solo necesitan completar el protocolo de enlace de tres vías TCP para establecer una conexión TCP y pueden enviar directamente solicitudes HTTP para obtener datos de la capa de aplicación. Además, no es necesario consumir recursos informáticos durante todo el proceso de acceso. El proceso de acceso HTTPS es mucho más complicado que HTTP. En algunos escenarios, el uso del acceso HTTPS puede aumentar 7 RTT.

2. El tiempo de cálculo aumenta

El proceso de cifrado y descifrado durante el intercambio de claves requiere un cálculo muy lento de los recursos de la CPU

(2) Optimización del uso de la batería.

(1) Herramienta para analizar el uso de electricidad.

a.Batterystats &
bugreport b.Battery Historian

(2) principales factores de consumo de energía

1. Solicitud de red

2 、 WakeLock

Para optimizar el uso de la energía, el sistema Android mismo se apagará cuando no haya operación para ahorrar energía.
Puede usar WakeLock para mantener la CPU en funcionamiento o evitar que la pantalla se oscurezca / apague, de modo que el teléfono pueda funcionar cuando el usuario no esté funcionando Algunas cosas (como reproducir una pantalla de video); o realizar otras operaciones después de apagar la pantalla.

3 、 GPS

(3) Optimización de energía

1. Optimizar las solicitudes de red

(Ver optimización de red)

2. Use WakeLock con precaución

(1) La adquisición y liberación de WakeLock aparecen en pares
(2) Use el tiempo de espera WakeLock para evitar una liberación anormal sin liberación

// Acquires the wake lock with a timeout.
acquire(long timeout)

3. Monitoree el estado de carga del teléfono

BatteryManager enviará una transmisión continua que contiene el estado de carga. Podemos obtener el estado de carga y los detalles de la batería a través de esta transmisión:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

Nota: Debido a que esta es una transmisión continua, no necesitamos escribir un receptor, podemos obtener los datos relevantes directamente a través de la intención.

(1) Obtenga el estado de carga y los detalles de energía a través de Intent.
Por ejemplo, si el dispositivo se está cargando:

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?
int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;

(2) Registre el receptor para monitorear los cambios en el estado de carga.
Mientras el dispositivo esté conectado o desconectado de la fuente de alimentación, el BatteryManager transmitirá la operación correspondiente. Podemos registrar el receptor para monitorear:

<receiver android:name=".PowerConnectionReceiver">
  <intent-filter>
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  </intent-filter>
</receiver>

El monitoreo del estado de la batería nos permite poner algunas operaciones en carga o suficiente energía para mejorar la experiencia del usuario, por ejemplo, sincronización de datos del usuario, carga de registros, etc.

4 、 Doze y App Standby

Android 6.0 proporciona dos técnicas para el ahorro de electricidad Doze y Aplicación de espera.
(. 1) Doze
sueño. Si el dispositivo está inactivo durante un período más largo, la técnica utilizada para reducir la pérdida Doze poder retardando la actividad de la red de fondo, el funcionamiento de la CPU y similares.
( 2) Aplicación Standy
App Standby. No es la aplicación que recientemente ha sido "favorecida" por los usuarios, la aplicación Standy retrasará las actividades de red en segundo plano de esta aplicación.

5. Sobre el posicionamiento

(1) Use GPS para posicionamiento, recuerde cerrar a tiempo

// Remove the listener you previously added
locationManager.removeUpdates(locationListener);

(2) Reduzca la frecuencia de actualización
(3) Elija GPS o red o ambos de acuerdo con la situación real. Usar solo uno reducirá el consumo de energía.

(3) Explicación detallada de ANR

(1) Introducción a ANR

1. Definición

El nombre completo de ANR es Aplicación sin respuesta, que es "la aplicación no responde".

2. Causas

En Android, la capacidad de respuesta de la aplicación es monitoreada por los servicios del sistema Activity Manager y Window Manager. Generalmente, el cuadro de diálogo ANR aparecerá en las siguientes dos situaciones:
(1) No puede responder a eventos de entrada del usuario (como entrada de teclado, táctil) dentro de 5s (Pantalla, etc.).
(2) BroadcastReceiver no puede finalizar en 10 segundos.
La razón principal de las dos situaciones anteriores es que el subproceso principal (subproceso de interfaz de usuario) ha realizado demasiadas operaciones de bloqueo y tiempo, como la lectura y escritura de archivos, la lectura y escritura de bases de datos, Consultas por Internet, etc.

3. Cómo evitar

No realice operaciones pesadas en el hilo principal (hilo de la interfaz de usuario).

(2) análisis ANR

1. Obtenga el archivo de rastreo generado por ANR

Cuando se genera ANR, el sistema generará un archivo traces.txt en / data / anr /. Puede exportarlo al local a través del comando adb:

$adb pull data/anr/traces.txt .

2. Analizar trace.txt

1. ANR causado por bloqueo ordinario
 - locked <0x35fc9e33> (a java.lang.Object)
  at java.lang.Thread.sleep(Thread.java:985) // 主线程中sleep过长时间, 阻塞导致无响应.
2. CPU a plena carga
100%TOTAL: 5.9% user + 4.1% kernel + 89% iowait

La CPU ocupa el 100% y está completamente cargada, creo que la mayor parte está ocupada por IOwait, es decir, operaciones IO. En este momento, al analizar la pila de llamadas al método, generalmente encontrará que hay lecturas y escrituras de archivos frecuentes o operaciones de lectura y escritura de bases de datos en el método en el hilo principal.

3. Problema de memoria (pérdida de memoria / desbordamiento)
size: 17036 23111 N/A 40147
allocated: 16484 20675 N/A 37159
free: 296 2436 N/A 2732//free内存所剩无几

3. Procesamiento de ANR

1. El hilo principal está bloqueado

Abra subprocesos secundarios separados para manejar transacciones de bloqueo que consumen mucho tiempo.

2. CPU a plena carga / bloqueo de E / S

El bloqueo de E / S generalmente significa que la lectura y escritura de archivos o las operaciones de la base de datos se ejecutan en el subproceso principal, o se puede ejecutar de forma asincrónica abriendo subprocesos.

3. Memoria insuficiente

Aumente la memoria de VM, use el atributo largeHeap, solucione los problemas de pérdidas de memoria (optimización de memoria), etc.

(3) Evite el método ANR

Centrándose en la prevención, existe el concepto de subproceso principal y subproceso, reconocer el punto de bloqueo del código y hacer un buen uso de los subprocesos.
Idea: No realice operaciones pesadas en el hilo principal (hilo de la interfaz de usuario).

1. Operaciones realizadas en el hilo principal

  • Todas las devoluciones de llamada del ciclo de vida de Activity se ejecutan en el hilo principal.
  • El servicio se ejecuta en el hilo principal de forma predeterminada.
  • La devolución de llamada onReceive de BroadcastReceiver se ejecuta en el hilo principal.
  • El handleMessage, post (Runnable) del controlador del looper que no utiliza el subproceso secundario se ejecuta en el subproceso principal.
  • Además de doInBackground, la devolución de llamada de AsyncTask se ejecuta en el hilo principal.
  • La publicación de View (Runnable) se ejecuta en el hilo principal.

2. La forma de usar subprocesos

1.modo de hilo

Heredar hilo

class PrimeThread extends Thread {
    long minPrime;
    PrimeThread(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
         . . .
    }
}

PrimeThread p = new PrimeThread(143);
p.start();

Implemente la interfaz Runnable

class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
         . . .
    }
}

PrimeRun p = new PrimeRun(143);
new Thread(p).start();
Método 2.AsyncTask

AsyncTask inicia tareas asincrónicas

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    // Do the long-running work in here
    // 执行在子线程
    protected Long doInBackground(URL... urls) {
        int count = urls.length;
        long totalSize = 0;
        for (int i = 0; i < count; i++) {
            totalSize += Downloader.downloadFile(urls[i]);
            publishProgress((int) ((i / (float) count) * 100));
            // Escape early if cancel() is called
            if (isCancelled()) break;
        }
        return totalSize;
    }

    // This is called each time you call publishProgress()
    // 执行在主线程
    protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
    }

    // This is called when doInBackground() is finished
    // 执行在主线程
    protected void onPostExecute(Long result) {
        showNotification("Downloaded " + result + " bytes");
    }
}

// 启动方式
new DownloadFilesTask().execute(url1, url2, url3);
3.HandlerThread

Una forma de combinar Handler y Thread en Android. De manera predeterminada, el handleMessage del Handler se ejecuta en el hilo principal, pero si paso un looper de un hilo secundario a este Handler, handleMessage se ejecutará en este hilo secundario. Es tal combinación:

// 启动一个名为new_thread的子线程
HandlerThread thread = new HandlerThread("new_thread");
thread.start();

// 取new_thread赋值给ServiceHandler
private ServiceHandler mServiceHandler;
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);

private final class ServiceHandler extends Handler {
    public ServiceHandler(Looper looper) {
      super(looper);
    }
    
    @Override
    public void handleMessage(Message msg) {
      // 此时handleMessage是运行在new_thread这个子线程中了.
    }
}
Servicio 4.Intent

El servicio se ejecuta en el subproceso principal, pero IntentService se ejecuta en el subproceso secundario.
De hecho, IntentService implementa un modo HandlerThread + ServiceHandler.

5.método del cargador

El cargador de datos introducido en Android 3.0 se puede usar en Actividad / Fragmento. Admite la carga asincrónica de datos y puede monitorear la fuente de datos para entregar nuevos resultados cuando los datos cambian. El CursorLoader comúnmente usado se usa para cargar datos de la base de datos.

// 使用LoaderManager来初始化Loader
getLoaderManager().initLoader(0, null, this);

//如果 ID 指定的加载器已存在,则将重复使用上次创建的加载器。
//如果 ID 指定的加载器不存在,则 initLoader() 将触发 LoaderManager.LoaderCallbacks 方法 //onCreateLoader()。在此方法中,您可以实现代码以实例化并返回新加载器

// 创建一个Loader
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // This is called when a new Loader needs to be created.  This
    // sample only has one Loader, so we don't care about the ID.
    // First, pick the base URI to use depending on whether we are
    // currently filtering.
    Uri baseUri;
    if (mCurFilter != null) {
        baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
                  Uri.encode(mCurFilter));
    } else {
        baseUri = Contacts.CONTENT_URI;
    }

    // Now create and return a CursorLoader that will take care of
    // creating a Cursor for the data being displayed.
    String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
            + Contacts.HAS_PHONE_NUMBER + "=1) AND ("
            + Contacts.DISPLAY_NAME + " != '' ))";
    return new CursorLoader(getActivity(), baseUri,
            CONTACTS_SUMMARY_PROJECTION, select, null,
            Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
}

// 加载完成
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // Swap the new cursor in.  (The framework will take care of closing the
    // old cursor once we return.)
    mAdapter.swapCursor(data);
}

(4) herramientas de análisis de rendimiento

Inserte la descripción de la imagen aquí

1. Herramientas oficiales

El propio Android nos proporciona muchas herramientas de análisis y pruebas de rendimiento de la aplicación, y la mayoría de ellas están integradas en Android Studio o DDMS, lo cual es muy conveniente de usar.
1.1 StrictMode
(1) muestra que, como su
nombre lo indica, el "modo estricto" se usa principalmente para restringir la aplicación para hacer algo Cosas que no cumplen con las especificaciones de rendimiento. Generalmente se usa para detectar operaciones que requieren mucho tiempo y bloqueo en el hilo principal. Después de habilitar StrictMode, si realiza algunas operaciones como leer y escribir archivos, acceso a la red, etc. en el hilo, se emitirán algunas advertencias en la consola de registro, advertencia La información incluye Stack Trace para mostrar dónde salió algo mal.
(2) Función
Utilizada principalmente para el análisis de optimización de subprocesos principales
1.2 Systrace
(1) Explique que
Systrace es una herramienta para recopilar y detectar información de tiempo, puede mostrar dónde se consume la CPU y el tiempo Ahora, cada proceso y subproceso ha hecho algo en su segmento de tiempo de CPU. Indicará qué salió mal y dará sugerencias de corrección.
Se registra en un archivo de seguimiento (html). Puede usar Chrome directamente Abra el navegador para ver. La interfaz es la siguiente:
Inserte la descripción de la imagen aquí
(2) Función
Se utiliza para analizar el tiempo de dibujo de la interfaz de usuario, combinado con el Visor de jerarquía para mejorar la interfaz de usuario Rendimiento. También se puede utilizar para descubrir operaciones que requieren mucho tiempo.
1.3 Hierarchy Viewer
(1) muestra que
Hierarchy Viewer proporciona una interfaz visual para observar el nivel de diseño, lo que nos permite optimizar el nivel de diseño, eliminar niveles de vista innecesarios e innecesarios, y mejorar el diseño. Velocidad:
Inserte la descripción de la imagen aquí
es necesario explicar:
Los tres puntos marcados por el cuadro rojo en la figura anterior son los datos clave del análisis. Desde la izquierda, representan el rendimiento de la Medida, el Diseño y el Dibujo de la Vista. Además, el color indica el índice de tiempo de la Vista, dividido en:

  • Verde, lo que indica que el rendimiento de esta Vista es más rápido que más del 50% de la Vista en el Árbol de vistas.
  • Amarillo, lo que indica que el rendimiento de esta Vista es más lento que el de más del 50% del Árbol de Vistas.
  • Rojo, lo que indica que el rendimiento de la Vista es el más lento en el Árbol de la vista.
    (2) Función
    Utilizada para el análisis del nivel de Vista, puede analizar los puntos de bloqueo del rendimiento en el Árbol de la vista, para
    tratar los síntomas, mejorar el rendimiento del diseño. 1.4 TraceView
    (1 ) Descripción
    Inserte la descripción de la imagen aquí
    Una herramienta gráfica utilizada para mostrar y analizar el tiempo de ejecución de un método.
    (2)
    Pila de llamadas al método de análisis de funciones y su tiempo de ejecución, ejecución del método optimizado.
    1.5 Monitor de memoria
    (1) Descripción
    detector de uso de memoria, que puede detectar en tiempo real El uso actual de la memoria de la aplicación y la información de la versión, y se muestran en una interfaz gráfica.
    (2) El rol se
    Inserte la descripción de la imagen aquí
    utiliza para el análisis de memoria, la solución de problemas de pérdida de memoria es la mejor opción. Se puede combinar con el visor de montón, el rastreador de asignación para analizar. Puede exportar el archivo hprof Combinado con una herramienta MAT de terceros para analizar el punto de fuga.
    1.6 Otro monitor
    (1) muestra que
    Android Studio Monitor también proporciona otros tres Motinor: CPU, GPU, Red.
    (2) La función se
    utiliza para rastrear y monitorear la CPU, GPU y Red respectivamente El uso de cambios extremos se puede utilizar como una guía para la optimización de la red, la optimización del tráfico y la optimización de renderizado.
    1.7 Otros
    desarrollos de Android También hay muchas opciones para monitorear el rendimiento en el modo de usuario, que se pueden usar:
    Inserte la descripción de la imagen aquí
    Opciones de desarrollador

2. Herramientas de terceros

2.1 Historiador de la batería de Google
(1) Descripción
de la herramienta producida por Google que utiliza el archivo de informe de errores del sistema Android para hacer análisis de uso de energía.
(2) Función
utilizada para el análisis de uso de energía.
2.2 Emmagee (NetEase)
(1) Descripción
para la aplicación de Android Pruebas y análisis exhaustivos de la CPU, memoria, red, alimentación, etc.
(2) Función Es
más adecuado que la herramienta oficial para que los chinos realicen el análisis de rendimiento general de la aplicación.
2.3 el análisis de fugas
(1) muestra que
Square se produce, debe ser una boutique. La herramienta de monitoreo de pérdida de memoria de la sonda.
(2) Función Está
integrada en la aplicación, que es la mejor manera de prevenir problemas de memoria.

Publicado 74 artículos originales · ganó 15 · vistas 6255

Supongo que te gusta

Origin blog.csdn.net/qq_29966203/article/details/90473690
Recomendado
Clasificación