按计划每周更新一篇技术博文,第二篇:《为Android系统定制重启功能》
一、Android系统重启的实现方式
1、广播方式
之前的博文介绍过这种方式《使用广播实现的Android关机及重启》,注意应用要在源码中编译,并且应用需要系统权限。
2、通过init.rc启动系统服务来运行sh文件
a.重启shell文件(system_reboot.sh),放在system/etc/目录下
[java] view plaincopy
  1. #!/system/bin/sh
  2. reboot
b.init.rc中加入一个Service的定义
[java] view plaincopy
  1. service system_reboot /system/etc/system_reboot.sh
  2. oneshot
  3. disabled

c.启动系统服务
[java] view plaincopy
  1. SystemProperties.set("ctl.start", "system_reboot");
3、直接代码中执行命令行
需要取得root权限
[java] view plaincopy
  1. Process proc = Runtime.getRuntime().exec(cmd);

以上三种方法可以实现重启,但现在需要实现长按关机键提示对话框中有重启选项,这就设计修改系统源码,感觉修改源码,是个很难的工作,其实找到关机提示框的代码位置,一切都变得很简单。

二、修改源码定制重启功能
1、跟踪长按Power键相关代码
    首先要了解长按电源键弹出对话框的相关源码位置,通过跟踪找到PhoneWindowManager.java中有截断长按电源键的方法,继续跟踪代码找到Runnable mPowerLongPress = new Runnable(),在该runnable里边调用showGlobalActionsDialog()方法便是显示长按power键弹出的关机提示对话框,如果你的机器是原生态的,默认提示“飞行模式”,“静音”和“关机”选项。
     showGlobalActionsDialog创建关机对话框的代码在GlobalActions.java里边,主要代码如下:
[java] view plaincopy
  1. private AlertDialog createDialog() {
  2. ……
  3. mItems = new ArrayList<Action>();
  4. // first: power off
  5. mItems.add(
  6. new SinglePressAction(
  7. com.android.internal.R.drawable.ic_lock_power_off,
  8. R.string.global_action_power_off) {
  9. public void onPress() {
  10. // shutdown by making sure radio and power are handled accordingly.
  11. ShutdownThread.shutdown(mContext, true);
  12. }
  13. public boolean showDuringKeyguard() {
  14. return true;
  15. }
  16. public boolean showBeforeProvisioning() {
  17. return true;
  18. }
  19. });
  20. // next: airplane mode
  21. mItems.add(mAirplaneModeOn);
  22. // last: silent mode
  23. if (SHOW_SILENT_TOGGLE) {
  24. mItems.add(mSilentModeAction);
  25. }
  26. ……
2、重启方法
    跟踪源码到此处,需要加入重启部分的源码也是往AlertDialog 添加多一项,显示部分的代码直接造这power off即可,需要加入重启逻辑的代码直接修改回调方法onPress里边(上边代码粗体部分),一开始,我尝试了前文中提示的三种方法中的方法一和方法三均行不通,后来也没再进一步排查原因,估计权限问题。
    本打算使用方法二再尝试一下,突然想到为何不去看看关机的逻辑代码ShutdownThread.shutdown(),打开ShutdownThread.java,很快就发现源码里边也有reboot的实现方法,如下:
[java] view plaincopy
  1. /**
  2. * Request a clean shutdown, waiting for subsystems to clean up their
  3. * state etc.  Must be called from a Looper thread in which its UI
  4. * is shown.
  5. *
  6. * @param context Context used to display the shutdown progress dialog.
  7. * @param reason code to pass to the kernel (e.g. "recovery"), or null.
  8. * @param confirm true if user confirmation is needed before shutting down.
  9. */
  10. public static void reboot(final Context context, String reason, boolean confirm){
  11. ……
   该方法的使用直接看注释知道,reboot方法的后两个参数解释如下:
     reason  如果值为是null,正常重启;如果是recovery,系统重启进入recovery mode
     confirm true显示关机提示框,需要用户【确认】;false不显示提示框,直接关机
 
3、代码修改
a.在关机提示框中加入重启选项
    弄清楚关机相关的源码,直接在GlobalActions.java的createDialog方法中加入如下代码即可:
[java] view plaincopy
  1. ...
  2. ext: reboot global_action_reboot
  3. mItems.add(
  4. new SinglePressAction(
  5. com.android.internal.R.drawable.ic_lock_power_off,
  6. R.string.global_action_reboot) {
  7. public void onPress() {
  8. // reboot
  9. ShutdownThread.reboot(mContext,null,false);
  10. }
  11. public boolean showDuringKeyguard() {
  12. return true;
  13. }
  14. public boolean showBeforeProvisioning() {
  15. return true;
  16. }
  17. });
b.修改重启提示框,以区分关机提示框
  因为提示框默认是“关机”,在ShutdownThread.java的beginShutdownSequence(context)方法中代码修改如下:
[java] view plaincopy
  1. /*/
  2. //修改前:
  3. ……
  4. pd.setTitle(context.getText(com.android.internal.R.string.power_off));
  5. pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
  6. ……
  7. /*/
  8. //修改后:
  9. ……
  10. if(mReboot){     // reboot progress
  11. pd.setTitle(context.getText(com.android.internal.R.string.global_action_reboot));
  12. pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));
  13. }else{          // shutdown progress
  14. pd.setTitle(context.getText(com.android.internal.R.string.power_off));
  15. pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
  16. }
  17. ……
  18. //*/
     重启功能实现了,但是不能到此结束,定制Android系统的重启功能,添加选项和修改重启提示框时加入了“重启”和“正在重启”的字符串,所以会涉及到在系统资源文件中添加新的字符串,源码中资源文件涉及到的多国语言直接忽略,我只在values/strings.xml和values-zh-rCN/strings.xml两个文件中加入对应的字符串:
[html] view plaincopy
  1. <string name="global_action_reboot">重启</string>
  2. <string name="reboot_progress">"正在重启..."</string>
c.最后编译
因为修改涉及到系统资源文件又涉及到policy.jar包,经过多次尝试,正确的编译顺序如下:
步骤1.编译frameworks/base/res,在out/target/product/X设备名X/system/framework/目录下生成framework-res.apk
步骤2.编译frameworks/base/,在o同样目录下生成framework.jar包(不能忽略,不然步骤3编译报错)
步骤3.编译frameworks/base/policy,在同样目录下生成policy.jar包
附录:
本例源码以Android 4.0.4为准(2.3一样),关机相关的源码路径:
ics/frameworks/base/policy/src/com/android/internal/policy/impl/目录下:
PhoneWindowManager.java
GlobalActions.java
ics/frameworks/base/core/java/com/android/internal/app/目录下:
ShutdownThread.java

PS:4.1.1 关机相关方法位置有些变化
源码已经把关机的接口整合到:
public class WindowManagerService extends IWindowManager.Stub
        implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs{...}中
不过可以直接使用:
import com.android.server.pm.ShutdownThread;
ShutdownThread.shutdown(mContext, true);
ShutdownThread.rebootSafeMode(mContext, true);

文件路径:
Android4.1.1/jb/frameworks/base/services/java/com/android/server/pm/
ShutdownThread.java

Android4.1.1/jb/frameworks/base/services/java/com/android/server/wm
WindowManagerService.java

...

参考引用:
1、Android应用程序获得root权限

为Android系统定制重启功能相关推荐

  1. Android系统定制源码修改 - MTK平台

                                         Android系统定制源码修改 -  MTK平台  1.修改开机弹出欢迎使用SIM MTK工程/mediatek/packag ...

  2. cm-14.1 Android系统定制(三):Setting相关的默认值、系统属性

    声明 通常情况下,Android系统定制的一个重要环节是对系统性功能的裁剪.增加,最能体现系统功能的就是Setting应用中的设置项,系统功能的多少一般都会体现在Setting中. 另外就是系统的属性 ...

  3. miui主题风格_一种android系统换肤功能的设计,董红光:MIUI主题风格.pdf

    MIUI主题风格主题风格主题风格主题风格 一种Android系统换肤功能的设计思路 董红光 2/29/2012 "主题"是什么 ? Symbian的"主题" A ...

  4. 屏蔽Android系统的WIFI功能 关闭Android系统的实体按键

    屏蔽Android系统的WIFI功能: 1.要root手机  2.安装re管理器 3.进入手机内存/system/bin/wpa_supplicant(文件无后缀). 4.re管理器改成读写模式后, ...

  5. cm-14.1 Android系统定制(二):内置系统应用

    声明 Android系统定制时免不了预置一些APP进系统中: 预置的结果一般有三种:       1.预置的APK用户可以卸载,恢复出厂设置后APK不恢复:       2.预置的APP用户可以卸载, ...

  6. Android 系统自动重启Bug(高通平台)

    点击打开链接 最近客户反馈了一个Bug,我们的系统用着用着会自动重启,尤其是在拨号的时候极容易死机或者进入下载模式.根据老大和高通的支持得到了一个解决方案. 在Android系统中,有这么一个文件夹: ...

  7. Android系统定制开机logo和开机动画

    定制开机logo和开机动画 开机logo 开机动画 bootanimation.zip 生成zip文件 添加新的开机动画 开机logo MTK ASOP中lk阶段的logo是开机后的第一个界面,也被称 ...

  8. android系统定制添加分辨率,density设置

    本文基于qcom msm8909 android5.1平台,因为客户需求以及实际使用,主板接入的显示屏有各种尺寸,这样对屏幕的显示造成了极大的影响,因此着手开发了一个设置功能,主要针对屏幕分辨率和de ...

  9. 基于OpenGL的Android系统视频转换功能实现

          第1章OpenGL ES 3D图形编程首先OpenGL.OpenGL的英文全称是OpenGL Graphics Library,中午名称是开发式图形库.OpenGL为程序开发人员定义了一个 ...

最新文章

  1. 损失函数理解汇总,结合PyTorch1.7和TensorFlow2
  2. CentOS启动不显示图形界面直接进入命令行模式
  3. 一只青蛙跳向三个台阶_青蛙跳台阶
  4. 【最全最详细】publiccms实现将公共部分提取成单独模块引入
  5. Erlang/Elixir 社区摘要: 2016-05-21
  6. nginx的反向代理、负载均衡、页面缓存、URL重写及读写分离
  7. Javascript常见设计模式解析
  8. 第一代计算机硬件逻辑主要采用,第一代计算机的硬件逻辑主要采用电子管,程序设计语言采用BASIC语言...
  9. 什么是计算机?计算机的硬件系统组成有哪些?
  10. java 自动创建html网页超链接
  11. [智慧园区]之访客应用
  12. Overture教程之如何更改整首谱子的调号
  13. Qt设置按钮背景图片
  14. Python之科赫曲线绘制
  15. 数字兆欧表的使用及安全注意事项
  16. 软件测试中的用户思维
  17. 【车载以太网】【测试】架构及测试工具
  18. 计算机原理接口,《计算机原理与接口》教学大纲
  19. 如何减少http请求的次数
  20. 徒手格斗技巧,源自特种部队,防身必备

热门文章

  1. 你必须要找到你所爱的东西
  2. Pwn2Own黑客大赛战况:iPhone 20秒被黑
  3. Java中什么是JAP之hibernate-mvc修改功能-Springmvc
  4. Vue学习笔记之09-v-model双向绑定
  5. 乳化液稳定剂php,乳化液稳定剂PHP对小于0.1mm煤泥浮选的影响
  6. 学生信息系统求助_学生管理信息系统_示例
  7. 大学c语言python_C语言和Python爬虫哪个好?老男孩IT教育
  8. gms签名不一致_电子签名拍照-多媒体互动装置介绍「振邦视界」
  9. onenote快捷键_onenote快捷键的高效用法
  10. .net在web.config中设置网站编码格式