update services play instalar google enable drain are android memory location google-play-services

android - instalar - install update enable google play services



Activaciones excesivas de Alarm Manager en Android con la ubicaciĆ³n de los servicios de Google Play (1)

Recibí un informe de rendimiento de Android Vital en la consola de Google Play acerca de las activaciones de Excessive Alarm Manager:

https://developer.android.com/topic/performance/vitals/wakeup.html

Utilizo la API de ubicación de Google Play Services para solicitar actualizaciones de ubicación en segundo plano. En el informe, se muestra que las activaciones de activación excesivas fueron causadas por com.google.android.location.ALARM_WAKEUP_LOCATOR de LocationListener.

Debajo del fragmento de código que causa las alarmas:

private synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(context) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } /** * Runs when a GoogleApiClient object successfully connects. */ @Override public void onConnected(Bundle connectionHint) { try { // Set location request mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(5 * 60000); mLocationRequest.setFastestInterval(60000); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); mLocationRequest.setMaxWaitTime(30 * 60000); // Create a pending intent to listening on location service when the update become available Intent mIntent = new Intent(context, LocationReceiver.class); mIntent.setAction(LocationReceiver.LOCATION_EXTRA); mPendingIntent = PendingIntent.getBroadcast(context, 42, mIntent, PendingIntent.FLAG_CANCEL_CURRENT); // Permission check before launching location services if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mPendingIntent); } catch (Exception e) { e.printStackTrace(); } }

¿Está esta activación de alarma vinculada a la API de ubicación de los servicios de Google Play?

¿Alguien sabe cómo solucionar este problema?


La ubicación de Google api

Este es un problema con com.google.android.location.ALARM_WAKEUP_LOCATOR al com.google.android.location.ALARM_WAKEUP_LOCATOR los dispositivos cada 60 segundos y mantenerlos despiertos durante hasta 15 segundos, lo que causa problemas importantes de drenaje de la batería.

Se han fixes los usos del teléfono a través de apps externas y se enseña a los usuarios cómo revocar el permiso para una aplicación.

La solución

A continuación se proporcionan las herramientas para reducir el uso de la batería de la aplicación.

Es imposible proporcionar una solución personalizada para la aplicación, ya que la solución depende del caso de uso y la lógica empresarial de la aplicación y de un análisis de costo-beneficio de lo que desea lograr con las actualizaciones de ubicación.

Intervalos de tiempo

No es de extrañar que haya problemas de rendimiento de la batería. De los siguientes ajustes:

mLocationRequest.setInterval(5 * 60000); mLocationRequest.setFastestInterval(60000); mLocationRequest.setMaxWaitTime(30 * 60000);

Su intervalo está configurado para actualizarse cada 5 minutos (5 * 60000 ms). Eso es 24 horas al día. Si esto se actualiza con éxito cada 5 minutos: 12 veces / hora == 288 veces por día.

El intervalo más rápido se establece en 1 minuto (60000). Aunque eso está disponible porque se accede a la ubicación en otra parte del dispositivo, seguirá usando energía en su aplicación).

El tiempo máximo es de solo 30 minutos. Lo que significa que, en el mejor de los casos, el dispositivo se activará y sondeará un mínimo de 48 veces por día.

Incrementa estos tiempos .

setMaxWaitTime ... Esto puede consumir menos batería y proporcionar ubicaciones más precisas, según las capacidades de hardware del dispositivo. Debe configurar este valor para que sea lo más grande posible para sus necesidades si no necesita la entrega inmediata de la ubicación. ...

En Android 8, Google ha limitado el número de solicitudes a solo unas pocas por hora . Considere usar esto como una guía para establecer los intervalos para las solicitudes.

Limitar el número de actualizaciones

El número de actualizaciones dentro de un cierto período de tiempo puede ser limitado. Ya sea cancelando activamente la solicitud de ubicación una vez que se haya utilizado la cantidad de actualizaciones o estableciendo un expiration en la solicitud. De esta manera, la aplicación se puede administrar creando una solicitud en algún desencadenante dentro de la aplicación y administrándola con cuidado para que no continúe sin cesar. Es difícil crear un flujo, ya que no conozco el caso de uso de la aplicación.

setNumUpdates (int numUpdates)

Por defecto, las ubicaciones se actualizan continuamente hasta que la solicitud se elimina explícitamente, sin embargo, opcionalmente, puede solicitar un número establecido de actualizaciones. Por ejemplo, si su aplicación solo necesita una ubicación nueva, llame a este método con un valor de 1 antes de pasar la solicitud al cliente de ubicación.

Detener actualizaciones de ubicación

Otra opción es administrar las actualizaciones de las ubicaciones de parada cuando no son necesarias. Los enlaces dan ejemplos de cómo llamar a esto cuando una actividad pierde el enfoque, sin embargo, podría implementarse dentro de la aplicación, cuando se cumplan ciertos requisitos (eso está dentro de su lógica empresarial) o incluso dando al usuario que lo encienda y apague desde la aplicación sí mismo.

Optimización de la batería

Asegúrese de que su aplicación no ignora las optimizaciones de la batería .

Desplazamiento

La administración de setSmallestDisplacement (float smallestDisplacementMeters) ayudará a afinar la aplicación, dependiendo de la lógica empresarial.

Lo siguiente fue escrito antes de la pregunta actualizada.

Con qué frecuencia las actualizaciones de la aplicación pueden ser establecidas tanto por el desarrollador como por el usuario. Los intervals y priorities .

Para el developer .

Puede configurar estos al realizar una solicitud de ubicación, por ejemplo:

protected void createLocationRequest() { LocationRequest mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(10000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); }

También hay una configuración para PRIORITY_NO_POWER , que significa que la aplicación solo obtendrá actualizaciones cuando el usuario las solicite.

Para el usuario.

Deberá pedirle al usuario que cambie la configuración de la ubicación

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { // All location settings are satisfied. The client can initialize // location requests here. // ... } }); task.addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { int statusCode = ((ApiException) e).getStatusCode(); switch (statusCode) { case CommonStatusCodes.RESOLUTION_REQUIRED: // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). ResolvableApiException resolvable = (ResolvableApiException) e; resolvable.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException sendEx) { // Ignore the error. } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: // Location settings are not satisfied. However, we have no way // to fix the settings so we won''t show the dialog. break; } } });

Para administrar los cambios en la configuración del usuario use una llamada de ubicación.

... puede usar la nueva clase LocationCallback en lugar de su LocationListener existente para recibir las actualizaciones de LocationAvailability además de las actualizaciones de ubicación, brindándole una simple devolución de llamada cada vez que la configuración haya cambiado, lo que afectará el conjunto actual de LocationRequests.

Google ha abordado este problema en Android 8.

En un esfuerzo por reducir el consumo de energía, Android 8.0 (nivel de API 26) limita la frecuencia con la que las aplicaciones en segundo plano pueden recuperar la ubicación actual del usuario. Las aplicaciones pueden recibir actualizaciones de ubicación solo unas pocas veces por hora.

Nota: estas limitaciones se aplican a todas las aplicaciones utilizadas en dispositivos con Android 8.0 (nivel de API 26) o superior, independientemente de la versión de SDK de destino de la aplicación.

Si utiliza el Administrador de alarmas.

Esto puede estar relacionado con el administrador de alarmas .

No es una solución simple, en última instancia, deberá volver a escribir cómo está programando sus actualizaciones.

  1. Para al menos reducir la velocidad del problema, deberá depurar su código y encontrar cualquier instancia en la que el Administrador de alarmas llame o cree horarios y reduzca los intervalos.

  2. Después de eso, deberá volver a escribir la parte completa de la programación de la actualización de la ubicación de la aplicación.

Arreglar el problema

Identifique los lugares en su aplicación donde programe las alarmas de activación y reduzca la frecuencia con la que se activan esas alarmas. Aquí hay algunos consejos:

  • Busque llamadas a los diversos métodos set() en AlarmManager que incluyen el RTC_WAKEUP o ELAPSED_REALTIME_WAKEUP.
  • Recomendamos incluir el nombre de su paquete, clase o método en el nombre de la etiqueta de su alarma para que pueda identificar fácilmente la ubicación en su fuente donde se configuró la alarma. Aquí hay algunos consejos adicionales:
    • Deje fuera cualquier información de identificación personal (PII) en el nombre, como una dirección de correo electrónico. De lo contrario, el dispositivo registra _UNKNOWN en lugar del nombre de la alarma.
    • No obtenga el nombre de la clase o del método mediante programación, por ejemplo, llamando a getName() , ya que Proguard podría confundirlo. En su lugar, utilice una cadena codificada.
    • No agregue un contador o identificadores únicos a las etiquetas de alarma. El sistema no podrá agregar alarmas configuradas de esa manera porque todas tienen identificadores únicos.

Después de solucionar el problema, verifique que las alarmas de activación funcionen como se espera ejecutando el siguiente comando ADB :

adb shell dumpsys alarm

Este comando proporciona información sobre el estado del servicio del sistema de alarma en el dispositivo. Para más información, vea dumpsys .

Si tiene problemas particulares con alguno de los anteriores, deberá publicar otra pregunta con un mcve .

Para mejorar la aplicación, esto implicaría volver a escribir el código como se menciona aquí en Mejores prácticas . No utilice el administrador de alarmas para programar tareas en segundo plano , y la ubicación se consideraría una tarea en segundo plano, si el teléfono está inactivo. Además dices que es una tarea de fondo. Utilice JobScheduler o Firebase JobDispatcher .

Si el Administrador de alarmas es la mejor opción ( que no está aquí ), es importante tener una buena lectura aquí Programar alarmas repetidas , pero es necesario comprender las compensaciones

Una alarma mal diseñada puede causar el agotamiento de la batería y una carga significativa en los servidores.