准备工作:
电脑上安装好JDK、下载smali和baksmali、下载apktools、要修改的ROM、adb工具(可选)
注:由于本教程面向的对象为有一定ROM修改基础的兄弟,所以对于如何使用电脑,如何使用CMD以及上述工具的具体用法等等都不在本贴的讨论范围内,本文将仅讲述如何添加高级重启菜单

1、从要修改的ROM中提取出以下文件
/system/framework/framework-res.apk
/system/framework/android.policy.jar
2、反编译修改framework-res.apk,加入需要的图片以及字符串等资源。
2.1、反编译framework-res.apk
CMD中执行命令
> java -jar apktool.jar d -s framework-res.apk framework-res


2.2、加入字符资源
英文部分(如需要则添加):使用文本编辑器打开framework-res\res\values\strings.xml,在最后添加所要用的字符串
        ....
        <string name="reboot_recovery">Recovery</string>
       </resources>


简体中文部分:使用文本编辑器打开framework-res\res\values-zh-rCN\strings.xml,在最后添加所要用的字符串
        ....
        <string name="reboot_recovery">恢复模式</string>
       </resources>
2.3、加入所需的图片
本方法将用到一张图片,显示在所加入的菜单上。
因为i88的分辨率为800×480,所以我将两张图片放入framework-res_apk\res\drawable-hdpi之中
图片的名字为(可自定义,注意上下一致即可)
ic_power_recovery.png(此处用到的图片分辨率为:48×48)

2.4、为所加入的字符及图片指定资源ID(提供两种方式,任选一种即可。个人推荐第一种)
自动指定方式:完成上述的修改后,CMD执行命令
>java -jar apktool.jar b framework-res framework-res_mod.apk
>java -jar apktool.jar d -s framework-res_mod.apk framework-res_mod
复制framework-res_mod\res\values\public.xml,用其来替换framework-res\res\values\public.xml
对应记下ID1、ID2、
    <public type="string" name="reboot_recovery" id="ID1" />
           <public type="drawable" name="ic_power_recovery" id="ID2" />


手动指定方式:
使用文本编辑器打开D:\PowerMenu\framework-res\res\values\public.xml
搜索<public type="string",找到string段对应的最后一个id号(请确定是最后一个),此处记为String_ID
搜索<public type="drawable",找到drawable段对应的最后一个id号(请确定是最后一个),此处记为Drawable_ID
在文件后添加两行
    <public type="string" name="reboot_recovery" id="String_ID+1" />
        <public type="drawable" name="ic_power_bootloader" id="Drawable_ID+1" />
   


根据第一种方法,在这里我获得的对应ID如下
    <public type="string" name="reboot_recovery" id="0x010806b6" />
        <public type="drawable" name="ic_power_recovery" id="0x010404f8" />


2.5、打包并完成对framework-res.apk的修改
CMD下执行命令
> java -jar apktool.jar b framework-res framework-res_done.apk



使用winra或7z等压缩工具,从得到的framework-res_done.apk文件中提取出resources.arsc
将resources.arsc替换framework-res.apk中的同名文件,并将ic_power_recovery.png添加到framework-res.apk中的对应位置
res\drawable-hdpi\ic_power_recovery.png
至此,对framework-res.apk的修改就完成了。保存好修改完毕的framework-res.apk。

代码修改部分

用WinRAR或者7z之类的压缩工具打开android.policy.jar,从中把classes.dex提取出来。
然后在CMD下执行命令:
> java -jar baksmali.jar classes.dex -o android.policy_dex

打开android.policy_dex\com\android\internal\policy\impl\文件夹,找到GlobalActions$打头的几个文件,记住最后一个的编号。
比如我这里看到的以GlobalActions$打头的文件的最后一个是GlobalActions$9.smali。
因为之后我们会创建一个文件,以GlobalActions$开头。
按本例的情况,会是GlobalActions$10.smali(重启进入recovery的代码)
使用文本编辑器打开android.policy_dex\com\android\internal\policy\impl\GlobalActions.smali
搜索:.method private createDialog()。这个函数是用来创建电源菜单的,既然我们是要添加菜单项,那么自然是要对这个函数进行修改。
不保证其他ROM也是一样的,这个大家在了解添加方法后,自己观察下就可以判断的,我找到的是:
.method private createDialog()Landroid/app/AlertDialog;

我发现4.0的下面的代码根本没办法直接看出哪 个是关机的代码,哪 个是重启的代码,不过我们可以用逆向追踪的方法。从创建电源菜单的代码中一定可以找到一些资源ID,复制这个ID到framework-res\res\values-zh-rCN\public.xml中搜索,很快就可以看到这个ID是做什么的(如 0x10404f2这个是定义的重启字符串,搜索前先要在前面加个0,就是0x010404f2,public.xml中的ID前面的0在这里被省略了)。这里基本就可以确定GlobalActions$3这个就是调用的重启方法了。

本例中的情况见下:
iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems: Ljava/util/ArrayList;

    new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$2;

    const v2, 0x1080030

    const v3, 0x104013c

    invoke-direct {v1, p0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$2;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V

    invoke-virtual {v0, v1}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z

    .line 234

#以上为关机代码
    iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems: Ljava/util/ArrayList;

    new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$3;

    const v2, 0x10802f0

    const v3, 0x10404f2

    invoke-direct {v1, p0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$3;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V

    invoke-virtual {v0, v1}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z

  .line 252
#此为重启代码

不管是正常重启,还是重启到recovery,均是进行重启,只是重启时的参数不一样,重启到Recovery代码就可以参考正常重启部分的了。
new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$3;(注意这个,这个是正常重启用到的执行代码)
我们把重启的代码复制一份插入到上面重启代码的下面,也就是  .line 252这行的下面,GlobalActions$3.smali重命名为GlobalActions$10.smal。
插入的代码如下:
iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems: Ljava/util/ArrayList;

    new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$10;

    const v2, 0x10806b6

    const v3, 0x10404f8

    invoke-direct {v1, p0, v2, v3}, Lcom/android/internal/policy/impl/GlobalActions$10;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V

    invoke-virtual {v0, v1}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z

对文件GlobalActions.smali的修改到这里就结束了


复制一份android.policy_dex\com\android\internal\policy\impl\GlobalActions$3.smali,重命名为GlobalActions$10.smali
打开GlobalActions$10.smali进行修改
全部GlobalActions$3都修改为GlobalActions$10.smali
const-string v1, "null"修改为const-string v1, "recovery"
因为我的只有两个参数,如果你的有三个参数还要修改一下,红色标记部分为修改部份,可以直接删除不要这个参数,保留的话要先在strings.xml中定义。
Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;-><init>(II)V     II表示两个参数
.parameter "x0"
.parameter "x1"
.parameter "x2"(比正常重启项少一个参数,该参数是每项下方的那个提示文字,这个我的没有)
invoke-direct {p0, p2, p3, p4}, 
修改好保存退出,添加重启到recovery的执行代码文件就完成了。

保存上面所做的修改,开始进行打包
CMD下执行命令:
> java -jar smali.jar android.policy_dex -o classes.dex


然后WinRAR或者7z之类的压缩工具打开android.policy.jar,使用修改得到classes.dex替换原文件。
OK,到这里,对android.policy.jar的修改也完成了。

最后把修改好的两个文件替换到手机看看效果吧,怎么换我就不说了
伸手党看这里I88修改后得到的成品,仅供参考:   android.policy.zip

【ROM修改教程】添加高级电源重启菜单(安卓4.0.4官方ROM)的更多相关文章

  1. Windows下Nexus 5的Android 5.0以上版本官方ROM的刷机教程

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52334452 折腾Android逆向的时候,经常需要给Nexus 5刷机.最近给Nex ...

  2. 将Sublime Text 添加到鼠标右键菜单的教程方法

    安装notepad++软件,在菜单右键自动会添加“edit with notepad++"的选项,那么怎么将Sublime Text 添加到鼠标右键菜单呢?下面是我的操作过程,希望有帮助! ...

  3. cygwin添加到有右键菜单

    cygwin添加到有右键菜单 前提 为了在windows中使用cygwin编译指定文件代码更为方便,所以动心思琢磨把cygwin添加到右键菜单,百度了一下,发现很多这样的教程,但是有问题,比如添加了但 ...

  4. MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

    稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...

  5. C# 操作 Word 修改word的高级属性中的自定义属性2

    word的类库使用的是word2007版本的类库,类库信息见下面图片,折腾了半天,终于找到入口,网上 很多说的添加或者修改word的高级属性中的自定义属性都是错误的,感觉都是在copy网上的代码,自己 ...

  6. Android Rom修改

    最近项目里要实现修改开机动画 屏蔽系统桌面等一些涉及到修改底层的功能 一开始研究了一番 心想着看来这是要定制系统 做rom开发了 所以就牛逼哄哄的跑去下源码 研究rom开发 后来发现这将是一个庞大的工 ...

  7. 关联A850刷机包 高级电源 时间中心 优化 ROOT 动力 美化 简化

    ROM简介 1.合并app以及framewok框架apk 2.破解安卓核心验证 3.加入busybox指令集 4.加入Root权限 5.时间居中显示.通知图标不会重叠 6.加入网速显示 7.加入%1精 ...

  8. bootstrap学习笔记之为导航条添加标题、二级菜单及状态 http://www.imooc.com/code/3120

    为导航条添加标题.二级菜单及状态 加入导航条标题 在Web页面制作中,常常在菜单前面都会有一个标题(文字字号比其它文字稍大一些),其实在Bootstrap框架也为大家做了这方面考虑,其通过" ...

  9. XamarinSQLite教程添加列

    XamarinSQLite教程添加列 如果开发者想要在现有的表中添加列,并不需要删除重新创建数据表,只需要修改数据表.操作步骤如下. (1)右击需要添加列的表,单击Add column…(beta)命 ...

随机推荐

  1. [Vim]vim使用笔记--分屏操作

    我们经常要打开多个文件,不同的窗口操作多个文件,分屏就很好用了. 1 命令模式下: :new,新建文件并分屏, 快捷键,Ctrl+W,然后马上按n键 :spilt 水平分屏,将当前屏分为两个,水平的. ...

  2. 自制DbHelper实现自动化数据库交互

    之前一直对apache的DbUtils很好奇,也很佩服其中的设计上的智慧.于是就自己模拟实现了一个更加简便的小框架.我们只需要在配置文件中写上数据库层面的连接信息,就可以随心所欲的实现自己的需求了. ...

  3. static,this,private关键字用法

    1:成员变量和局部变量的区别(理解) (1)在类中的位置不同 成员变量:类中方法外 局部变量:方法定义中或者方法声明上 (2)在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 (3)生命周期不同 ...

  4. 集合框架之Set接口

    一个不包含重复元素的 collection.更确切地讲,set 不包含满足e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素. 在所有构造方法以及 add.equa ...

  5. C控制台实现模拟平抛运动算法

    平抛运动这个相信读了高中物理都知道这个概念了,详细的我就不说了,不明白的看看百度: 平抛运动 接下来看看用控制台实现的平抛运动算法: #include <stdio.h> #include ...

  6. linux crontab定时任务详解

    1.  为当前用户创建cron服务: crontab  -e 例如 文件内容如下(每隔1分钟执行sql脚本): */1 * * * * mysql -h127.0.0.1 -uroot -proot ...

  7. ORA-28001: the password has expired 详解 不用重启项目

    大早上正式库提示: Oracle提示错误消息ORA-28001: the password has expired 解决办法: 1.利用SYSDBA权限登陆: 2.查看账户信息:select user ...

  8. 在Android中使用AlarmManager

    AlarmManager是Android中的一种系统级别的提醒服务,它会为我们在特定的时刻广播一个指定的Intent.而使用Intent的时候,我们还需要它执行一个动作,如startActivity, ...

  9. Android异常:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original

    Android异常:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that cr ...

  10. Linux的资源管理器

    说是资源管理器,其实就是使用命令来对Linux运行系统的参数的查看.下面就一起看一看怎么像在windows下查看资源管理器吧. 1.查看进程(额,自然是电脑上正在运行的进程咯) ps aux 其中a ...