MTK 快速开机 技术详解

来源:互联网 发布:sql注入实例代码 编辑:程序博客网 时间:2024/05/29 18:29

http://blog.csdn.net/mirkerson/article/details/21861595

在我们mtk项目中:如何关闭快速开机功能?

①、在device/reallytek/项目配置rlk6737m_65_n/ProjectConfig.mk(rlk_projects\cxlite_h3713_a1\ProjectConfig.mk)

MTK_IPO_SUPPORT = no  //在ProjectConfig.mk配置的宏一定要在**.mk文件中进行转化才能被上层直接使用

②、在device/reallytek/rlk6737m_65_n/device.mk中

ifeq ($(strip $(MTK_IPO_SUPPORT)), yes)

  PRODUCT_PROPERTY_OVERRIDES += ro.mtk_ipo_support=1  
endif
//以ro.开头表示系统配置文件,并且表示只能读,即放在这里让我们看一下,让我们知道。PRODUCT_PROPERTY_OVERRIDES是android的一种默认格式

③、在上层某一个java文件中的FeatureOption类中调用MTK_IPO_SUPPORT成员变量判断它的值,从而进一步做如下操作

在./packages/apps/Settings/src/com/android/settings/accessibility/AccessibilitySettings.java:  中

FeatureOption.MTK_IPO_SUPPORT == false


首先查看Settings里控制开关

01// 获取当前状态
02boolean ipoSettingEnabled = Settings.System.getInt(getContentResolver(),
03            Settings.System.IPO_SETTING,1) == 1;
04if(mIpoSetting!=null){
05    mIpoSetting.setChecked(ipoSettingEnabled);
06}
07//设置新状态
08boolean isChecked = ((CheckBoxPreference) preference).isChecked();
09Settings.System.putInt(getContentResolver(), Settings.System.IPO_SETTING,
10                isChecked ? 1:0);

全局搜索 Settings.System.IPO_SETTING ,发现在关机系统里调用了该状态(ShutdownThread.Java)

ShutdownThread 里的 checkShutdownFlow 方法

01// 判断是否不支持该功能 是否需要重启
02if (FeatureOption.MTK_IPO_SUPPORT == false || mReboot == true) {
03    mShutdownFlow = NORMAL_SHUTDOWN_FLOW;    // 更改状态     
04    return;
05}
06boolean isIPOEnabled;
07try {
08    // 获取当前状态
09    isIPOEnabled = Settings.System.getInt(sInstance.mContext.getContentResolver(),
10        Settings.System.IPO_SETTING, 1) == 1;
11catch (NullPointerException ex) {
12    mShutdownFlow = NORMAL_SHUTDOWN_FLOW;
13    return;
14}
15if (isIPOEnabled == true) {
16    // 判断系统参数
17    if ("1".equals(SystemProperties.get("sys.ipo.battlow")))
18        mShutdownFlow = NORMAL_SHUTDOWN_FLOW;
19    else
20        mShutdownFlow = IPO_SHUTDOWN_FLOW;
21else {
22        mShutdownFlow = NORMAL_SHUTDOWN_FLOW;
23}
24return;

以上函数如果正常进入快速关机模式 
mShutdownFlow = IPO_SHUTDOWN_FLOW

关机流程会调用 ShutdownThread.shutdown(mContext, true);

ShutdownThread 里的 shutdown 方法

01bConfirmForAnimation = confirm;
02if (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    }
37else {
38    beginShutdownSequence(context);
39}

ShutdownThread 里的 beginShutdownSequence 方法

1if (mShutdownFlow == IPO_SHUTDOWN_FLOW) {
2     checkShutdownFlow();
3     synchronized (mShutdownThreadSync) {
4         mShutdownThreadSync.notify();
5     }
6 }

ShutdownThread 里的 run 方法

01public 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
03D/ShutdownThread(  189): !!! Request to shutdown !!!
04D/ShutdownThread(  189): Notifying thread to start radio shutdown
05D/ShutdownThread(  189): PowerOff dialog doesn't exist. Create it first
06D/ShutdownThread(  189): ShutdownThread exists already
07D/ShutdownThread(  189): checkShutdownFlow: IPO_Support=true mReboot=false
08D/ShutdownThread(  189): checkShutdownFlow: isIPOEnabled=true mShutdownFlow=1
09D/ShutdownThread(  189): shutdown acquire partial WakeLock 2
10I/ShutdownThread(  189): Sending shutdown broadcast...
11I/ShutdownThread(  189): Waiting for Bluetooth and Radio...
12I/ShutdownThread(  189): Radio and Bluetooth shutdown complete.
13I/ShutdownThread(  189): Shutting down MountService
14W/ShutdownThread(  189): Result code 0 from MountService.shutdown
15I/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
5stMgr.shutdown(mContext);

ShutdownManager 里的 shutdown 方法

1mPowerManager = (PowerManager)context.getSystemService("power");
2mPowerManager.goToSleep(SystemClock.uptimeMillis());
3......
4SystemProperties.set("ctl.start""ipod");
5Intent intent = new Intent("android.intent.action.black.mode");
6intent.putExtra("_black_mode"true);
7context.sendBroadcast(intent);

adb logcat -s “ShutdownManager”

01--------- beginning of /dev/log/system
02--------- beginning of /dev/log/main
03I/ShutdownManager(  189): btState: false
04I/ShutdownManager(  189): saveStates: wifi:0, airplaneModeState: 0
05V/ShutdownManager(  189): Current Wallpaper = null
06V/ShutdownManager(  189): Current IME: com.android.inputmethod.pinyin
07I/ShutdownManager(  189): accessibility is disabled
08I/ShutdownManager(  189): killProcess (IME): com.android.inputmethod.pinyin
09I/ShutdownManager(  189): forceStopPackage: com.cooliris.media
10V/ShutdownManager(  189): process = com.android.settings
11I/ShutdownManager(  189): forceStopPackage: com.android.settings
12I/ShutdownManager(  189): forceStopPackage: com.mediatek.launcherplus
13I/ShutdownManager(  189): forceStopPackage: com.android.mms
14I/ShutdownManager(  189): forceStopPackage: android.process.media
15I/ShutdownManager(  189): forceStopPackage: android.process.media
16I/ShutdownManager(  189): forceStopPackage: android.process.media
17I/ShutdownManager(  189): forceStopPackage: com.mediatek.moreapp
18I/ShutdownManager(  189): forceStopPackage: com.mediatek.omacp
19I/ShutdownManager(  189): forceStopPackage: com.android.email
20V/ShutdownManager(  189): uid-process = com.mediatek.mdlogger
21I/ShutdownManager(  189): forceStopPackage: com.android.providers.calendar
22I/ShutdownManager(  189): forceStopPackage: com.android.deskclock
23V/ShutdownManager(  189): uid-process = com.android.ActivityNetwork
24I/ShutdownManager(  189): forceStopPackage: com.mediatek.weather

ActivityManagerPlus 接收到关机广播

adb logcat -s “ActivityManagerPlus”

1--------- beginning of /dev/log/system
2--------- beginning of /dev/log/main
3I/ActivityManagerPlus(  189): Receive:
4Intent { act=android.intent.action.ACTION_SHUTDOWN_IPO }
5I/ActivityManagerPlus(  189): finished
6I/ActivityManagerPlus(  189): Receive:
7Intent { act=android.intent.action.black.mode (has  extras) }
8I/ActivityManagerPlus(  189): createIPOWin

ActivityManagerPlus 里的 createIPOWin 方法 关机调用

01Window win = PolicyManager.makeNewWindow(context);
02win.setType(2016);
03win.setFlags(10241024);
04win.setLayout(-1, -1);
05win.requestFeature(1);
06android.view.WindowManager.LayoutParams params = win.getAttributes();
07params.setTitle("IPOWindow");
08params.flags = 24;
09WindowManagerImpl wm = (WindowManagerImpl)context.getSystemService("window");
10view = win.getDecorView();
11wm.addView(view, params);

ActivityManagerPlus 里的 removeIPOWin 方法 开机调用

1WindowManagerImpl wm = (WindowManagerImpl)context.getSystemService("window");
2wm.removeView(view);

底层实现 
mediatek/source/external/ipod/


0 0
原创粉丝点击