MTK 快速开机 技术详解
Android version 2.3.5
首先查看Settings里控制开关
01
|
// 获取当前状态
|
02
|
boolean ipoSettingEnabled = Settings.System.getInt(getContentResolver(),
|
03
|
Settings.System.IPO_SETTING, 1 ) == 1 ;
|
04
|
if (mIpoSetting!= null ){
|
05
|
mIpoSetting.setChecked(ipoSettingEnabled);
|
06
|
}
|
07
|
//设置新状态
|
08
|
boolean isChecked = ((CheckBoxPreference) preference).isChecked();
|
09
|
Settings.System.putInt(getContentResolver(), Settings.System.IPO_SETTING,
|
10
|
isChecked ? 1 : 0 );
|
全局搜索 Settings.System.IPO_SETTING ,发现在关机系统里调用了该状态(ShutdownThread.java)
ShutdownThread 里的 checkShutdownFlow 方法
01
|
// 判断是否不支持该功能 是否需要重启
|
02
|
if (FeatureOption.MTK_IPO_SUPPORT == false || mReboot == true ) {
|
03
|
mShutdownFlow = NORMAL_SHUTDOWN_FLOW; // 更改状态
|
04
|
return ;
|
05
|
}
|
06
|
boolean isIPOEnabled;
|
07
|
try {
|
08
|
// 获取当前状态
|
09
|
isIPOEnabled = Settings.System.getInt(sInstance.mContext.getContentResolver(),
|
10
|
Settings.System.IPO_SETTING, 1 ) == 1 ;
|
11
|
} catch (NullPointerException ex) {
|
12
|
mShutdownFlow = NORMAL_SHUTDOWN_FLOW;
|
13
|
return ;
|
14
|
}
|
15
|
if (isIPOEnabled == true ) {
|
16
|
// 判断系统参数
|
17
|
if ( "1" .equals(SystemProperties.get( "sys.ipo.battlow" )))
|
18
|
mShutdownFlow = NORMAL_SHUTDOWN_FLOW;
|
19
|
else
|
20
|
mShutdownFlow = IPO_SHUTDOWN_FLOW;
|
21
|
} else {
|
22
|
mShutdownFlow = NORMAL_SHUTDOWN_FLOW;
|
23
|
}
|
24
|
return ;
|
以上函数如果正常进入快速关机模式
mShutdownFlow = IPO_SHUTDOWN_FLOW
关机流程会调用 ShutdownThread.shutdown(mContext, true);
ShutdownThread 里的 shutdown 方法
01
|
bConfirmForAnimation = confirm;
|
02
|
if (confirm) {
|
03
|
if (mDialog == null ) {
|
04
|
mDialog = new AlertDialog.Builder(context)
|
05
|
.setIcon(android.R.drawable.ic_dialog_alert)
|
06
|
.setTitle(com.android.internal.R.string.power_off)
|
07
|
.setMessage(com.android.internal.R.string.shutdown_confirm)
|
08
|
.setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() {
|
09
|
public void onClick(DialogInterface dialog, int which) {
|
10
|
//确认关机 检查状态
|
11
|
beginShutdownSequence(context);
|
12
|
if (mDialog != null ) {
|
13
|
mDialog = null ;
|
14
|
}
|
15
|
}
|
16
|
})
|
17
|
.setNegativeButton(com.android.internal.R.string.no, new DialogInterface.OnClickListener() {
|
18
|
public void onClick(DialogInterface dialog, int which) {
|
19
|
synchronized (sIsStartedGuard) {
|
20
|
sIsStarted = false ;
|
21
|
}
|
22
|
if (mDialog != null ) {
|
23
|
mDialog = null ;
|
24
|
}
|
25
|
}
|
26
|
})
|
27
|
.create();
|
28
|
mDialog.setCancelable( false );
|
29
|
mDialog.getWindow().setType(
|
30
|
WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
|
31
|
mDialog.getWindow().addFlags(
|
32
|
WindowManager.LayoutParams.FLAG_DIM_BEHIND);
|
33
|
}
|
34
|
if (!mDialog.isShowing()) {
|
35
|
mDialog.show();
|
36
|
}
|
37
|
} else {
|
38
|
beginShutdownSequence(context);
|
39
|
}
|
ShutdownThread 里的 beginShutdownSequence 方法
1
|
if (mShutdownFlow == IPO_SHUTDOWN_FLOW) {
|
2
|
checkShutdownFlow();
|
3
|
synchronized (mShutdownThreadSync) {
|
4
|
mShutdownThreadSync.notify();
|
5
|
}
|
6
|
}
|
ShutdownThread 里的 run 方法
01
|
public void run() {
|
02
|
checkShutdownFlow();
|
03
|
while (mShutdownFlow == IPO_SHUTDOWN_FLOW) {
|
04
|
stMgr.saveStates(mContext);
|
05
|
running();
|
06
|
}
|
07
|
if (mShutdownFlow != IPO_SHUTDOWN_FLOW) {
|
08
|
running();
|
09
|
}
|
10
|
}
|
adb logcat -s “ShutdownThread”
01
|
--------- beginning of /dev/log/system
|
02
|
--------- beginning of /dev/log/main
|
03
|
D/ShutdownThread( 189 ): !!! Request to shutdown !!!
|
04
|
D/ShutdownThread( 189 ): Notifying thread to start radio shutdown
|
05
|
D/ShutdownThread( 189 ): PowerOff dialog doesn't exist. Create it first
|
06
|
D/ShutdownThread( 189 ): ShutdownThread exists already
|
07
|
D/ShutdownThread( 189 ): checkShutdownFlow: IPO_Support= true mReboot= false
|
08
|
D/ShutdownThread( 189 ): checkShutdownFlow: isIPOEnabled= true mShutdownFlow= 1
|
09
|
D/ShutdownThread( 189 ): shutdown acquire partial WakeLock 2
|
10
|
I/ShutdownThread( 189 ): Sending shutdown broadcast...
|
11
|
I/ShutdownThread( 189 ): Waiting for Bluetooth and Radio...
|
12
|
I/ShutdownThread( 189 ): Radio and Bluetooth shutdown complete.
|
13
|
I/ShutdownThread( 189 ): Shutting down MountService
|
14
|
W/ShutdownThread( 189 ): Result code 0 from MountService.shutdown
|
15
|
I/ShutdownThread( 189 ): Performing ipo low-level shutdown...
|
ShutdownManager 里的 saveStates 方法
1
|
//保存wifi状态
|
ShutdownThread 里的 running 方法
1
|
//广播全局事件 android.intent.action.ACTION_SHUTDOWN_IPO
|
2
|
//关闭蓝牙
|
3
|
//关闭Radio
|
4
|
//关闭MountService
|
5
|
stMgr.shutdown(mContext);
|
ShutdownManager 里的 shutdown 方法
1
|
mPowerManager = (PowerManager)context.getSystemService( "power" );
|
2
|
mPowerManager.goToSleep(SystemClock.uptimeMillis());
|
3
|
......
|
4
|
SystemProperties.set( "ctl.start" , "ipod" );
|
5
|
Intent intent = new Intent( "android.intent.action.black.mode" );
|
6
|
intent.putExtra( "_black_mode" , true );
|
7
|
context.sendBroadcast(intent);
|
adb logcat -s “ShutdownManager”
01
|
--------- beginning of /dev/log/system
|
02
|
--------- beginning of /dev/log/main
|
03
|
I/ShutdownManager( 189 ): btState: false
|
04
|
I/ShutdownManager( 189 ): saveStates: wifi: 0 , airplaneModeState: 0
|
05
|
V/ShutdownManager( 189 ): Current Wallpaper = null
|
06
|
V/ShutdownManager( 189 ): Current IME: com.android.inputmethod.pinyin
|
07
|
I/ShutdownManager( 189 ): accessibility is disabled
|
08
|
I/ShutdownManager( 189 ): killProcess (IME): com.android.inputmethod.pinyin
|
09
|
I/ShutdownManager( 189 ): forceStopPackage: com.cooliris.media
|
10
|
V/ShutdownManager( 189 ): process = com.android.settings
|
11
|
I/ShutdownManager( 189 ): forceStopPackage: com.android.settings
|
12
|
I/ShutdownManager( 189 ): forceStopPackage: com.mediatek.launcherplus
|
13
|
I/ShutdownManager( 189 ): forceStopPackage: com.android.mms
|
14
|
I/ShutdownManager( 189 ): forceStopPackage: android.process.media
|
15
|
I/ShutdownManager( 189 ): forceStopPackage: android.process.media
|
16
|
I/ShutdownManager( 189 ): forceStopPackage: android.process.media
|
17
|
I/ShutdownManager( 189 ): forceStopPackage: com.mediatek.moreapp
|
18
|
I/ShutdownManager( 189 ): forceStopPackage: com.mediatek.omacp
|
19
|
I/ShutdownManager( 189 ): forceStopPackage: com.android.email
|
20
|
V/ShutdownManager( 189 ): uid-process = com.mediatek.mdlogger
|
21
|
I/ShutdownManager( 189 ): forceStopPackage: com.android.providers.calendar
|
22
|
I/ShutdownManager( 189 ): forceStopPackage: com.android.deskclock
|
23
|
V/ShutdownManager( 189 ): uid-process = com.android.ActivityNetwork
|
24
|
I/ShutdownManager( 189 ): forceStopPackage: com.mediatek.weather
|
ActivityManagerPlus 接收到关机广播
adb logcat -s “ActivityManagerPlus”
1
|
--------- beginning of /dev/log/system
|
2
|
--------- beginning of /dev/log/main
|
3
|
I/ActivityManagerPlus( 189 ): Receive:
|
4
|
Intent { act=android.intent.action.ACTION_SHUTDOWN_IPO }
|
5
|
I/ActivityManagerPlus( 189 ): finished
|
6
|
I/ActivityManagerPlus( 189 ): Receive:
|
7
|
Intent { act=android.intent.action.black.mode (has extras) }
|
8
|
I/ActivityManagerPlus( 189 ): createIPOWin
|
ActivityManagerPlus 里的 createIPOWin 方法 关机调用
01
|
Window win = PolicyManager.makeNewWindow(context);
|
02
|
win.setType( 2016 );
|
03
|
win.setFlags( 1024 , 1024 );
|
04
|
win.setLayout(- 1 , - 1 );
|
05
|
win.requestFeature( 1 );
|
06
|
android.view.WindowManager.LayoutParams params = win.getAttributes();
|
07
|
params.setTitle( "IPOWindow" );
|
08
|
params.flags = 24 ;
|
09
|
WindowManagerImpl wm = (WindowManagerImpl)context.getSystemService( "window" );
|
10
|
view = win.getDecorView();
|
11
|
wm.addView(view, params);
|
ActivityManagerPlus 里的 removeIPOWin 方法 开机调用
1
|
WindowManagerImpl wm = (WindowManagerImpl)context.getSystemService( "window" );
|
2
|
wm.removeView(view);
|
底层实现
mediatek/source/external/ipod/
MTK 快速开机 技术详解相关推荐
- CentOS 开机启动详解
优化centos开机启动项 2011年06月14日 7:21 /etc/inittab文件,把 代码: id:5:initdefault:这一行,修改成 代码: id:3:initdefault:保存 ...
- 视频直播技术详解(8)直播云 SDK 性能测试模型
<视频直播技术详解>系列之八:直播云 SDK 性能测试模型 牛小七2016年10月12日发布在 视频直播技术详解 七牛云于 6 月底发布了一个针对视频直播的实时流网络 LiveNet 和完 ...
- 视频直播技术详解(0)开篇
(原标题:<视频直播技术详解>系列之一:开篇) 文|何李石 随着互联网用户消费内容和交互方式的升级,支撑这些内容和交互方式的基础设施也正在悄悄发生变革.手机设备拍摄视频能力和网络的升级催生 ...
- IBM p5服务器上的虚拟 分享,IBMp5服务器系统虚拟技术详解
<IBMp5服务器系统虚拟技术详解>由会员分享,可在线阅读,更多相关<IBMp5服务器系统虚拟技术详解(10页珍藏版)>请在人人文库网上搜索. 1.IBM p5 服务器系统虚拟 ...
- 技术详解:基于人脸识别的 AI 弹幕
--------点击屏幕右侧或者屏幕底部"+订阅",关注我,随时分享机器智能最新行业动态及技术干货---------- 有时候,弹幕比剧情还精彩,那些脑洞大开.观点鲜明的弹幕,可以 ...
- 《视频直播技术详解》系列之八:直播云 SDK 性能测试模型
七牛云于 6 月底发布了一个针对视频直播的实时流网络 LiveNet 和完整的直播云解决方案,很多开发者对这个网络和解决方案的细节和使用场景非常感兴趣. 结合七牛实时流网络 LiveNet 和直播云解 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(上篇)
一.序言 Hadoop是一个技术生态圈,zookeeper是hadoop生态圈里一个非常重要的技术,当我研究学习hadoop的相关技术时候,有两块知识曾经让我十分的困惑,一个是hbase,一个就是zo ...
- Apollo进阶课程㉓丨Apollo规划技术详解——Motion Planning with Environment
原文链接:进阶课程㉓丨Apollo规划技术详解--Motion Planning with Environment 当行为层决定要在当前环境中执行的驾驶行为时,其可以是例如巡航-车道,改变车道或右转, ...
- Apollo进阶课程㉒丨Apollo规划技术详解——Motion Planning with Autonomous Driving
原文链接:进阶课程㉒丨Apollo规划技术详解--Motion Planning with Autonomous Driving 自动驾驶车辆的规划决策模块负责生成车辆的行驶行为,是体现车辆智慧水平的 ...
最新文章
- 限时福利:腾讯高级专家手把手教你打造 OCR 神器!
- MapReduce基础开发之六Map多输入
- 错误日志的实时抓取保证代码质量
- 《互联网公司工程师图鉴》
- java堆内存 数据结构_JAVA内存区域
- 小型elf Hello,World程序
- java+mysql校园学校宿舍管理系统源码
- MQTT.fx客户端MQTT接入阿里云物联网平台,登录、订阅、发布消息
- 衡量视频序列特性的TI(时间信息)和SI(空间信息)
- silverlight小结
- 探讨SQL Server中Case 的不同用法
- Java+MySQL+swing学生管理系统
- 2.4G RFID动物耳标解决方案 SI24R2F+
- 锐捷网络设备初始化配置
- 如何优化PNG,JPG图片减小图片文件大小
- tensorflow中的ops(或者说op)的理解
- 机器学习基础——先验概率、后验概率和似然估计的讲解;频率派和贝叶斯派之分;以及MLE和MAP方法的解析
- [编程题]蓄水池大作战 Golang 面相对象 无需算法 有手就行
- 万豪国际集团在山东日照设立首家酒店
- 2021 年全国大学生物联网设计竞赛(华为杯)全国总决赛获奖名单
热门文章
- 嵌入式转linux服务器,嵌入式linux下web服务器搭建
- springboot幂等性_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题
- 063_提升Hoisting
- cdn贝免费套餐_阿里云香港服务器带宽太贵怎么办?香港节点全球CDN加速你值得拥有...
- Nginx--------地址重写
- mysql模糊查询不会区分大小写_MySQL模糊查询(like)时区分大小写
- 调整表格的行高_Word表格无法调整行高?尽然是这个原因,90%的人都可能遇到...
- python进阶项目设计_推荐系统进阶:设计和构建推荐系统流程综述(1)
- 卡片的sak为不支持的类型_“师傅”两字是不能随便叫的!78%的网友不支持称顺风车主为“师傅”...
- iis7+php_5.5,IIS7+php5.5+fastcgi