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

上一篇:NIO基础——文件编程


下一篇:RK3399平台开发系列讲解(内核调试篇)9.14、USB逻辑分析仪报文分析