Ответ 1
В новых версиях Android вы можете увидеть список wakelocks здесь:
adb shell "cat /sys/kernel/debug/wakeup_sources"
По какой-то причине мой телефон Android не заснет. Я предполагаю, что вакелок не бодрствует, но нет способа сказать, какие аквариумы активны. Бегущие службы не перечисляют ничего подозрительного и, конечно же, ничего не отличаются от обычного. Поэтому мои вопросы:
Устанавливает ли Android определенную версию wakelocks при завершении процесса? Возможно, приложение было плохо написано и не выпустило wakelock перед выходом?
Есть ли способ увидеть активные wakelocks?
Вот что показывает 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 вы можете увидеть список wakelocks здесь:
adb shell "cat /sys/kernel/debug/wakeup_sources"
Вы можете использовать команду ниже adb, чтобы потребовать блокировку слежения
adb shell "echo mylock > /sys/power/wake_lock"
Затем вы можете использовать команду ниже, чтобы посмотреть, активна ли эта блокировка. Вы увидите, что временной стол непрерывно изменяется, это означает, что блокировка бодрствования активна.
watch -n 1 'adb shell "cat /proc/wakelocks" | grep mylock'
Теперь, используйте эту команду adb для освобождения блокировки слежения
adb shell "echo mylock > /sys/power/wake_unlock"
Затем, проверьте его снова, столбец времени замерзнет, это означает, что блокировка следа неактивна
watch -n 1 'adb shell "cat /proc/wakelocks" | grep mylock'
Вы можете использовать ту же технику, чтобы наблюдать за блокировкой следа, которую вы приобретаете в коде.
Действительно ли Android освобождает wakelocks при завершении процесса?
Я сомневаюсь, хотя я не знаю наверняка.
Возможно ли, что приложение было плохо написано и не выпустило wakelock перед выходом?
AFAIK, да.
Есть ли способ увидеть активные wakelocks?
Запустите adb shell dumpsys power
.
Как уже говорили другие, сила dumpsys оболочки adb может показать вам активные wakelocks.
Однако для приложений, которые не выпускали wakelock, в соответствии с ответом здесь: fooobar.com/questions/129188/... Он должен быть выпущен Android. Однако это касается случая, когда приложение/процесс убит, но он должен применяться, когда приложение/процесс завершен. Он также предоставляет ссылки на исходный код, а не просто "проверенный код"
Вы можете проверить приложение Wakelock Detector, которое доступно в Google Play
У этого есть простой пользовательский интерфейс, который показывает подробный список приобретенных wakelocks для каждого приложения и, как вы упомянули, на нем отображаются активные запущенные приложения, которые могут иметь wakelock на данный момент.
Android не выпускает wakelocks, когда процесс заканчивается. Он должен быть явно выпущен процессом до окончания.