何らかの理由で、私のAndroid電話はスリープ状態になりません。ウェイクロックがスリープ状態を維持していると思いますが、どのウェイクロックがアクティブかを知る方法はありません。実行中のサービスは疑わしいものは何でもリストアップし、確かにいつもと違うものは何もありません。
Androidプロセスの終了時にウェイクロックを確実に解放しますか?アプリが誤って作成され、終了前にウェイクロックを解放しなかった可能性はありますか?
アクティブなウェイクロックを確認する方法はありますか?
これは何 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=の新しいバージョンでは、ウェイクロックのリストをここで見ることができます:
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プロセスの終了時にウェイクロックを確実に解放しますか?
確かではありませんが、私はそれを疑います。
アプリが不適切に作成され、終了する前にウェイクロックをリリースしなかった可能性はありますか?
わかった、はい。
アクティブなウェイクロックを確認する方法はありますか?
実行adb Shell dumpsys power
。
他の人がすでに言ったように、adb Shell dumpsys powerはアクティブなウェイクロックを表示できます。
ただし、ここでの答えによると、wakelockをリリースしなかったアプリの場合は、 https://stackoverflow.com/a/16258624/428271 Androidでリリースする必要があります。ただし、これはアプリ/プロセスが強制終了される場合のためですが、アプリ/プロセスが完了した場合にも適用できるはずです。また、単に「チェックインされたコード」と言うのではなく、ソースコード参照を提供します。
Google Playで利用可能な「Wakelock Detector」アプリを確認できます
各アプリケーションごとに取得したウェイクロックの詳細リストを表示するシンプルなUIがあり、前述のように、上部にアクティブな実行中アプリが表示されますwakelockは現在存在しています。
アクティブなウェイクロックを実行するには、次を実行します。
adb Shell dumpsys power | grep -i wake
価値があるものについては、Android 7.1.1でこれがまさに私が探していたものです:
greatqlte:/ $ dumpsys power | grep WAKE_LOCK
PARTIAL_WAKE_LOCK 'ES Wake Lock' ACQ=-38m52s804ms LONG (uid=10275 pid=12504)
PARTIAL_WAKE_LOCK '*net_scheduler*' ACQ=-40ms (uid=10031 pid=3026 ws=Work Source{10031 com.google.Android.gms})
Androidは、プロセスの終了時にウェイクロックを解放しません。終了する前にプロセスによって明示的に解放される必要があります。