提示:本文仅仅针对MTK平台实现需求,对其它芯片主控平台暂无借鉴可言
文章目录
- 需求
- 需求描述
- 实际手机功能图
- 资料相关说明
- 实现方案
- 修改方案
- 修改内容点
- 内置App
- 修改MtkAlarmManagerService.java
- 坑点解决
- 总结
需求
实现手机一样的定时开关机功能
需求描述
在手机中,都有定时开关机功能,其次在闹铃app中,定时后,在手机关机状态下,设置的闹铃时间到后,手机先开机后闹铃。
实际产品定制中,需要有这样的定时开关机功能,系统提供这样的接口,应用调用。
实际手机功能图
资料相关说明
- mtk 平台在Android8.1 之后,就已经去掉了定时开关机功能,如果实现需要移植8.1 平台基础源码到最新的Android平台
- 定时开关机功能 本质上就是和闹铃App 一样的方案,两种不同的形式 。本质还是通过AlarmManager 来实现的 AlarmManager 源码
- 本文描述针对MTK系列,其它平台在闹铃设置的逻辑和定时逻辑其实是想通的。在以前 自己做过闹钟应用,API 其实一致的。
- MTK 关机闹钟实现,低侵入式修改 framework 方案
- Android8.1 MTK platform adds timer switch function
- 自动开机提前2分钟
实现方案
修改方案
- 在Android系统源码中内置Android8.1 源码对应的开关机源码,作为系统应用。 Android8.1 定时开关机源码:SchedulePowerOnOff GitHub 上面 SchedulePowerOnOff 源码
- vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkAlarmManagerService.java 修改,适配对应的包名使其具备功能。
修改内容点
内置App
可完全参考借鉴之前文章MTK内置第三方APP-卸载不可卸载-签名问题
修改MtkAlarmManagerService.java
修改内容如下:
--- a/vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkAlarmManagerService.java
+++ b/vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkAlarmManagerService.java
@@ -361,7 +361,8 @@ public class MtkAlarmManagerService extends AlarmManagerService{
// Only DeskClock is allowed to set this alarm
if (mNativeData != 0 && mNativeData != -1) {
- if (setPackageName.equals("com.android.deskclock")) {
+ if (setPackageName.equals("com.android.deskclock")^M
+ /*add by xzhe on 20230404*/ || setPackageName.equals("com.mediatek.schpwronoff")) {^M
/// M: Extra Logging @{
if (DEBUG_ALARM_CLOCK) {
Slog.i(TAG, "mBootPackage = " + setPackageName + " set Prop 2");
@@ -411,7 +412,8 @@ public class MtkAlarmManagerService extends AlarmManagerService{
// AlarmPair tempAlarmPair = mPoweroffAlarms.remove(name);
// it will always to cancel the alarm in alarm driver
if (mNativeData != 0 && mNativeData != -1) {
- if (name.equals("com.android.deskclock")) {
+ if (name.equals("com.android.deskclock")^M
+ /*add by xzhe on 20230404*/ || name.equals("com.mediatek.schpwronoff")) {^M
set(mNativeData, PRE_SCHEDULE_POWER_OFF_ALARM, 0, 0);
}
}
坑点解决
- 定时闹铃和定时开机 在关机状态下,机器会提前150s,3分钟,120分钟 就开机了,我们称之为提前开机。 对于闹钟而言是正常的,但是对于定时开机而言,时间是需要准确的。解决方案要么应用端 适配、要么系统将时间设置为中间值 比如一分钟。 具体修改如下:
vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkAlarmManagerService.java
修改POWER_OFF_ALARM_BUFFER_TIME 根据实际情况,综合修改具体时间值
什么意思呢?
/**
* M: This alarm type is used to set an alarm that would be triggered if device
* is in powerOff state. It is set to trigger POWER_OFF_ALARM_BUFFER_TIME ms earlier
* than the actual alarm time so that phone is in wakeup state when actual alarm
* triggers
*/
- 上面提供的 定时开关机源码,只是针对系统设置添加了一个功能。具体对外释放的接口还需自己来实现。 那就是需要研究一下 SchedulePowerOnOff 源码了。还好源码比较简单,自己看看原理,对外释放接口来实现。
总结
- 针对MTK方案实现定时开关机功能,并对外释放接口
- 定时开关机功能和闹铃功能API上面都用到了AlarmManager.java,对于定时任务有一定的参考意义。