1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言
最近在做一款基于Android的人脸识别门禁硬件方案。老硬件我们使用的是RK3399和Android8.1来开发。 RK3399发热确实真的好严重啊,系统相对来说也不太稳定,可能是AP工艺带来的问题吧。前期研发的时候,碰上了各种芯片短缺、美国制裁等(其实我也想关我啥事,但是就是买不到好的芯片,高通和MTK的),退而求其次,选择了现在国内好多厂商都在用的RK系列芯片,本着高配的方案,直接上了RK3399;Camera sensor使用的是IMx307双摄方案;其他的硬件就很好买到了。 功能需求 人脸门禁有个需求就是在应用作为Launcher,在系统启动的时候就启动该app。当没有人或者没有检测到物体的时候,后台应用还是一直跑着,但是屏幕要关闭掉(降低功耗来带了温度升高,后续估计还要重新打开,因为要播放广告)。所以就需要进行息屏但是不能够休眠,不然应用不能自己唤醒自己,导致无法使用无感操作(直接刷脸操作)。 修改 需要修改Android的PMS源代码才能够达到目的。首先要理解PMS的框架,这篇博客进行修改的。这几篇文章总结的真的很不错。 好了,废话就不多说了开干 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,后续看开发需要进行修改。至此作为一条笔记,望日后有需要再回来阅读。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
1162 浏览 0 评论
1330 浏览 1 评论
1015 浏览 1 评论
2345 浏览 1 评论
3671 浏览 1 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 18:57 , Processed in 0.708353 second(s), Total 73, Slave 55 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号