RK3399 Android8.1 息屏不休眠修改
作者:互联网
RK3399 Android8.1 息屏不休眠修改
前言
最近在做一款基于Android的人脸识别门禁硬件方案。老硬件我们使用的是RK3399和Android8.1来开发。
RK3399发热确实真的好严重啊,系统相对来说也不太稳定,可能是AP工艺带来的问题吧。前期研发的时候,碰上了各种芯片短缺、美国制裁等(其实我也想关我啥事,但是就是买不到好的芯片,高通和MTK的),退而求其次,选择了现在国内好多厂商都在用的RK系列芯片,本着高配的方案,直接上了RK3399;Camera sensor使用的是IMx307双摄方案;其他的硬件就很好买到了。
功能需求
人脸门禁有个需求就是在应用作为Launcher,在系统启动的时候就启动该app。当没有人或者没有检测到物体的时候,后台应用还是一直跑着,但是屏幕要关闭掉(降低功耗来带了温度升高,后续估计还要重新打开,因为要播放广告)。所以就需要进行息屏但是不能够休眠,不然应用不能自己唤醒自己,导致无法使用无感操作(直接刷脸操作)。
修改
需要修改Android的PMS源代码才能够达到目的。首先要理解PMS的框架,我是 [参考](https://blog.csdn.net/m0_37579906/article/details/109352423?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242)这篇博客进行修改的。这几篇文章总结的真的很不错。
好了,废话就不多说了开干
1、修改系统休眠超时时间
修改frameworks/base/packages/SettingsProvider/res/values/defaults.xml这个文件把"def_screen_off_timeout" 这个值设置成60000,60000代表60s超时关屏;
2、系统会调用reallyGoToSleepNoUpdateLocked()方法然后进入Sleep状态,所以我们需要把这个函数调用屏蔽掉;
private boolean reallyGoToSleepNoUpdateLocked(long eventTime, int uid) {
if (eventTime < mLastWakeTime || mWakefulness == WAKEFULNESS_ASLEEP
|| !mBootCompleted || !mSystemReady) {
return false;
}
try {
//设置为ASLEEP状态
setWakefulnessLocked(WAKEFULNESS_ASLEEP,
PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
return true;
}
修改frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java这个文件
把reallyGoToSleepNoUpdateLocked()这个函数调用屏蔽掉。
3、屏蔽掉这个函数后,编译烧录系统后,会发现在timeout后屏幕息屏了,并且应用还在全力的跑着。但是无法唤醒屏幕亮屏。造成这个问题的主要原因是没有事件去更改Power的状态,所以只能通过按键进行唤醒屏幕和系统。
4、解决不需要按键就可以唤醒系统的方法
我是用的方式是直截了当,当睡眠的时候,我不更改电源的状态。这样就可以通过触摸屏幕进行唤醒屏幕。
--- a/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
@@ -1441,7 +1441,7 @@ public final class PowerManagerService extends SystemService
private void goToSleepInternal(long eventTime, int reason, int flags, int uid) {
synchronized (mLock) {
if (goToSleepNoUpdateLocked(eventTime, reason, flags, uid)) {
- updatePowerStateLocked();
+ ;//updatePowerStateLocked();
}
}
}
@@ -1492,7 +1492,7 @@ public final class PowerManagerService extends SystemService
mLastSleepTime = eventTime;
mSandmanSummoned = true;
- setWakefulnessLocked(WAKEFULNESS_DOZING, reason);
+ //setWakefulnessLocked(WAKEFULNESS_DOZING, reason);
// Report the number of wake locks that will be cleared by going to sleep.
int numWakeLocksCleared = 0;
@@ -1511,7 +1511,7 @@ public final class PowerManagerService extends SystemService
// Skip dozing if requested.
if ((flags & PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE) != 0) {
- reallyGoToSleepNoUpdateLocked(eventTime, uid);
+ ;//reallyGoToSleepNoUpdateLocked(eventTime, uid);
}
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
@@ -1565,7 +1565,7 @@ public final class PowerManagerService extends SystemService
try {
Slog.i(TAG, "Sleeping (uid " + uid +")...");
- setWakefulnessLocked(WAKEFULNESS_ASLEEP, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);
+ //setWakefulnessLocked(WAKEFULNESS_ASLEEP, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
@@ -2249,8 +2249,8 @@ public final class PowerManagerService extends SystemService
}
// Doze has ended or will be stopped. Update the power state.
- reallyGoToSleepNoUpdateLocked(SystemClock.uptimeMillis(), Process.SYSTEM_UID);
- updatePowerStateLocked();
+ //reallyGoToSleepNoUpdateLocked(SystemClock.uptimeMillis(), Process.SYSTEM_UID);
+ //updatePowerStateLocked();
}
}
至此相关的修改已经完成,满足系统的需求,后续有需要在进行优化。已经更换了高通的AP,后续看开发需要进行修改。至此作为一条笔记,望日后有需要再回来阅读。
参考 https://blog.csdn.net/m0_37579906/article/details/109352423?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
标签:息屏,reallyGoToSleepNoUpdateLocked,eventTime,java,uid,Trace,Android8.1,RK3399,Powe 来源: https://blog.csdn.net/weixin_50005386/article/details/115398739