android - tutorial - wakelock detector sin root
¿Cómo puedo ver qué wakelocks están activos? (7)
Por alguna razón mi teléfono Android no se va a dormir. Supongo que un wakelock lo mantiene despierto, pero no hay forma de saber qué wakelock están activos. Los servicios en ejecución no enumeran nada sospechoso, y ciertamente nada diferente de lo habitual. Así que mis preguntas son:
¿Android lanza definitivamente wakelocks cuando finaliza un proceso? ¿Es posible que una aplicación esté mal escrita y no haya lanzado un wakelock antes de salir?
¿Hay alguna manera de ver los wakelocks activos?
Esto es lo que muestra dumpsys power
:
$ dumpsys power
Power Manager State:
mIsPowered=true mPowerState=0 mScreenOffTime=226093 ms
mPartialCount=0
mWakeLockState=
mUserState=
mPowerState=
mLocks.gather=
mNextTimeout=91922738 now=92136117 -213s from now
mDimScreen=true mStayOnConditions=0
mScreenOffReason=3 mUserState=0
mBroadcastQueue={-1,-1,-1}
mBroadcastWhy={0,0,0}
mPokey=1 mPokeAwakeonSet=false
mKeyboardVisible=false mUserActivityAllowed=false
mKeylightDelay=6000 mDimDelay=47000 mScreenOffDelay=7000
mPreventScreenOn=false mScreenBrightnessOverride=-1 mButtonBrightnessOverride=-1
mScreenOffTimeoutSetting=60000 mMaximumScreenOffTimeout=2147483647
mLastScreenOnTime=0
mBroadcastWakeLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mStayOnWhilePluggedInScreenDimLock=UnsynchronizedWakeLock(mFlags=0x6 mCount=0 mHeld=false)
mStayOnWhilePluggedInPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mPreventScreenOnPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mProximityPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mProximityWakeLockCount=0
mProximitySensorEnabled=false
mProximitySensorActive=false
mProximityPendingValue=-1
mLastProximityEventTime=0
mLightSensorEnabled=false
mLightSensorValue=-1.0 mLightSensorPendingValue=-1.0
mLightSensorScreenBrightness=35 mLightSensorButtonBrightness=255 mLightSensorKeyboardBrightness=0
mUseSoftwareAutoBrightness=true
mAutoBrightessEnabled=false
mScreenBrightness: animating=false targetValue=-1 curValue=0.0 delta=-1.3333334
mLocks.size=0:
mPokeLocks.size=1:
poke lock ''PhoneApp'': POKE_LOCK_IGNORE_CHEEK_EVENTS
¿Android lanza definitivamente wakelocks cuando finaliza un proceso?
Lo dudo, aunque no lo sé a ciencia cierta.
¿Es posible que una aplicación esté mal escrita y no haya lanzado un wakelock antes de salir?
AFAIK, sí.
¿Hay alguna manera de ver los wakelocks activos?
Ejecute adb shell dumpsys power
.
Android no libera wakelocks cuando finaliza el proceso. Debe ser liberado explícitamente por el proceso antes de terminar.
Como ya han dicho otros, adb shell dumpsys power puede mostrarte wakelocks activos.
Sin embargo, para aplicaciones que no lanzaron wakelock, según la respuesta aquí: https://.com/a/16258624/428271 Debería ser lanzado por Android. Sin embargo, es para el caso en el que se elimina la aplicación / proceso, pero debe ser aplicable cuando la aplicación / proceso también se completa. También proporciona las referencias del código fuente en lugar de solo decir ''código ingresado''
En las nuevas versiones de Android puedes ver la lista de wakelocks aquí:
adb shell "cat /sys/kernel/debug/wakeup_sources"
Para ver el funcionamiento de los bloqueos de activación activos:
adb shell dumpsys power | grep -i wake
Puede usar el siguiente comando adb para requerir un bloqueo de activación
adb shell "echo mylock > /sys/power/wake_lock"
Luego, puede usar el siguiente comando para ver si este bloqueo está activo. Verá que la columna de tiempo cambia continuamente, significa que el bloqueo de activación está activo
watch -n 1 ''adb shell "cat /proc/wakelocks" | grep mylock''
Ahora, use este comando adb para liberar el bloqueo de activación
adb shell "echo mylock > /sys/power/wake_unlock"
Luego, verifique nuevamente, la columna de tiempo se congelará, significa que el bloqueo de activación no está activo
watch -n 1 ''adb shell "cat /proc/wakelocks" | grep mylock''
Puede utilizar la misma técnica para observar el bloqueo de activación que obtiene en el código.
Puede verificar la aplicación " Detector de Wakelock " que está disponible en Google Play
Tiene una interfaz de usuario simple que muestra la lista detallada de wakelocks adquiridos para cada aplicación y, como usted mencionó, muestra las aplicaciones activas en ejecución en la parte superior, que podrían tener wakelock presente en este momento.