不知道有没有遇到过这样的问题,就是在跑一些应用的时候,屏幕熄灭后会顺便把一些服务给关掉,这时候就需要重新开启,虽然有时候这本身就是一个bug,但是最直接的方法就是让屏幕一直亮着,虽然说这就引入了另外一个bug,但还是看了一下。
如果你需要屏幕不是一直亮着,但是又需要亮屏的时间长一些,最简单的方法就是,在settings->display里面将时间设为30min,这是设置的最长时间了,如果你需要更长的时间怎么办呢,可以按照下面的方法进行配置。
代码路径:frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
在文件中找到函数:updatePowerStateLocked()
这个函数的主要作用是进行电源状态的转换,所以屏幕的亮灭可以由这个函数来控制了。
private void updatePowerStateLocked() {
if (!mSystemReady || mDirty == 0) {
return;
}
if (!Thread.holdsLock(mLock)) {
Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked");
}
Trace.traceBegin(Trace.TRACE_TAG_POWER, "updatePowerState");
try {
updateIsPoweredLocked(mDirty);
updateStayOnLocked(mDirty);
updateScreenBrightnessBoostLocked(mDirty);
final long now = SystemClock.uptimeMillis();
int dirtyPhase2 = 0;
for (;;) {
int dirtyPhase1 = mDirty;
dirtyPhase2 |= dirtyPhase1;
mDirty = 0;
updateWakeLockSummaryLocked(dirtyPhase1);
updateUserActivitySummaryLocked(now, dirtyPhase1);
if (!updateWakefulnessLocked(dirtyPhase1)) {
break;
}
}
boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2);
updateDreamLocked(dirtyPhase2, displayBecameReady);
finishWakefulnessChangeIfNeededLocked();
updateSuspendBlockerLocked();
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
}
这里调用了updateScreenBrightnessBoostLocked(mDirty)
private void updateScreenBrightnessBoostLocked(int dirty) {
if ((dirty & DIRTY_SCREEN_BRIGHTNESS_BOOST) != 0) {
if (mScreenBrightnessBoostInProgress) {
final long now = SystemClock.uptimeMillis();
mHandler.removeMessages(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT);
if (mLastScreenBrightnessBoostTime > mLastSleepTime) {
final long boostTimeout = mLastScreenBrightnessBoostTime +
SCREEN_BRIGHTNESS_BOOST_TIMEOUT;
if (boostTimeout > now) {
Message msg = mHandler.obtainMessage(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT) ;
msg.setAsynchronous(true);
mHandler.sendMessageAtTime(msg, boostTimeout);
return;
}
}
mScreenBrightnessBoostInProgress = false;
mNotifier.onScreenBrightnessBoostChanged();
userActivityNoUpdateLocked(now,
PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
}
}
}
其实说了半天很简单,就是不让它进行屏幕超时的操作,只需要进行下面修改即可
private void updatePowerStateLocked() {
return;
}
直接返回,不进行任何动作,然后在android目录下执行:
source build/envsetup.sh
lunch 23
mmm frameworks/base/services/
将会生成:out/target/product/msm8916_64/system/framework/services.jar
最后用生成的services.jar替换设备里的即可
adb root
adb remount
adb push services.jar /system/framework/services.jar
重启生效
当然,实现屏幕常亮的方法有很多,这只是其中一种。