Cómo arreglar la representación lenta (vitales de Android)

Tengo una aplicación que aparece en la parte inferior del 25% de la nueva Consola de Google Play – sección de aspectos vitales de Android para renderización lenta. Me preocupa esto debido a los artículos que parecen decir que Google Play puede penalizar su aplicación en la clasificación de Play Store si cae en el 25% inferior.

Sin embargo, parece imposible mejorar esta métrica para mi aplicación. Reproduce música y tiene un SeekBar y TextView que se actualiza cada 250ms como cualquier reproductor de música. Hice el programa básico mínimo para demostrar:

public class MainActivity extends AppCompatActivity { int count; SeekBar seekBar; TextView textView; Runnable runnable = new Runnable() { @Override public void run() { textView.setText(Integer.toString(count)); seekBar.setProgress(count); ++count; seekBar.postDelayed(runnable, 250); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); seekBar = (SeekBar) findViewById(R.id.seek); textView = (TextView) findViewById(R.id.text); seekBar.post(runnable); } } 

Proyecto completo aquí: https://github.com/svenoaks/SlowRendering.git

Cuando ejecuto este programa en hardware similar a los dispositivos Nexus, obtengo estos resultados
adb shell dumpsys gfxinfo com.example.xyz.slowrendering comando adb shell dumpsys gfxinfo com.example.xyz.slowrendering :

 Stats since: 19222191084749ns Total frames rendered: 308 Janky frames: 290 (94.16%) 90th percentile: 32ms 95th percentile: 36ms 99th percentile: 44ms Number Missed Vsync: 2 Number High input latency: 0 Number Slow UI thread: 139 Number Slow bitmap uploads: 0 Number Slow issue draw commands: 283 

Esto significaría que casi todos mis fotogramas tomar> 16ms para hacer, supongo que debido a la naturaleza periódica de la actualización. Todas las demás aplicaciones de reproductor de música que he probado también tienen este problema de reproducción lenta en la medida de lo que puedo ver. Me temo que el algoritmo de Google arruinar mi clasificación de aplicaciones, ¿hay alguna manera de mejorar mi puntuación?

El TextView en su diseño está causando el problema. Debido a que tiene el layout width de layout width de wrap_content , que dice que su anchura tiene que ser igual al ancho del contenido (el texto de este ejemplo). Por lo tanto, cada vez que se llama a TextView.setText tiene que producirse un paso de medida / diseño caro. El ajuste simple de layout_width a match_parent solucionará el problema.

Introduzca aquí la descripción de la imagen

Introduzca aquí la descripción de la imagen

Aquí hay dos imágenes de lo que se toma de systrace , que demuestran el trabajo ejecutado en el hilo de interfaz de usuario en 1 marco. La parte superior se hace con layout_width=wrap_content y la inferior con layout_width=match_parent .

Dos métodos siguientes que he probado mejorarán la tarifa de marco:

  • Si publicas el seekBar.postDelayed(runnable, 16) en un intervalo más corto como 16ms (seekBar.postDelayed ( seekBar.postDelayed(runnable, 16) ), obtienes este 60fps liso: Introduzca aquí la descripción de la imagen

    P / s: No estoy seguro de por qué todavía.

  • Utilice alguna otra forma de actualizar el valor de count lugar de dentro del Runnable . Utilice View.postOnAnimation(Runnable) para reprogramar el Runnable. El resultado es 60FPS para el proyecto de ejemplo.

EDIT: dos Runnable que utiliza postOnAnimation(Runnable)

 Runnable runnable = new Runnable() { @Override public void run() { textView.setText(Integer.toString(count)); seekBar.setProgress(count); seekBar.postOnAnimation(this); } }; Runnable updateCount = new Runnable() { @Override public void run() { ++count; seekBar.postDelayed(this, 250); } }; 

Revisé su código. No estoy seguro si este es el código real o si tienes más a esto. En cualquier caso llamaré la atención sobre algunos de los problemas de renderización en android.

1. OverDraw

Overdraw es donde se pierde el tiempo de procesamiento de la GPU mediante el color en píxeles que sólo se vuelven a colorear por otra cosa. Éstos pueden ser comunes si usted ha agregado un fondo a su disposición del envase del padre y entonces los niños también se agregan un fondo o si usted ha agregado un fondo común en usted archivo de los estilos para el tema de la aplicación y después añadió fondos al resto del xml Archivos de diseño que ha creado.

Las causas para el sobregiro puede ser cualquier cosa, intente comprobar su código para esto. Hay una herramienta de desarrollo instalada en todos los dispositivos móviles para comprobar Overdraw en las opciones de desarrollador. Aquí está la documentación oficial para overdraw.

2. Ver jerarquía

Para procesar cada vista, Android pasa por tres etapas:

1.medida

2.juzgar

3.draw

El tiempo que tarda Android en completar estas etapas es proporcional al número de vistas en su jerarquía. Veo en tu archivo de diseño que tienes un diseño de restricciones que incluye un diseño lineal. No veo el uso de esto. Se ha introducido el diseño de restricciones para ayudar a los desarrolladores a reducir la jerarquía de vistas. Reducir el número de niños que un diseño en particular puede tener. También hay una herramienta para ayudarte con esto. Aquí está la guía androide oficial. Pruebe estos pasos para averiguar los problemas de procesamiento de la GPU.

  • Google Play Store enlaza directamente al encabezado de calificaciones
  • Botón de actualización de Google Play Store deshabilitado después de realizar cambios
  • ¿Puedo tener un código de versión inferior en producción desde el canal de pruebas alfa?
  • ¿Existe un API para obtener el informe de ventas en Google Play?
  • Google Play Advertencia Implementación incorrecta de la facturación de Google Play inApp
  • Flujo de referencia de Google Play Google Analytics
  • Cómo obtener la versión de la aplicación en la tienda de reproducción
  • ¿Todavía podemos eliminar aplicaciones no publicadas de Google Play?
  • Android alpha testing "Artículo no encontrado"
  • ¿Cómo dar (ya comprado) la aplicación de Android al cliente como un regalo?
  • ¿Cómo puedo asegurarme de que mi aplicación sólo esté disponible para teléfonos en Android Market?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.