准备工作:
电脑上安装好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. YYModel V1.0.4源码解析

    YYKit出现了很长时间了,一直想要详细解析一下它的源码,都是各种缘由推迟了. 最近稍微闲了一点,决定先从最简单的YYModel开始吧. 首先,我也先去搜索了一下YYModel相关的文章,解析主要AP ...

  2. JAVA面向对象-----抽象类

    1抽象类 为什么使用抽象类 1:定义Dog类 有颜色属性和叫的方法 2:定义Bird类 有颜色属性和叫的方法 3:定义其父类Animal 1:颜色的属性可以使用默认初始化值. 2:叫的方法在父类中如何 ...

  3. P2P系统,一致性哈希和DHT

    数据网格产品经常会使用P2P进行通信,借此机会系统地学习一下P2P网络和其资源搜索策略. 1 P2P网络架构 谈到P2P就涉及到一个概念:Overlay Network(覆盖网络).所谓覆盖网络是应用 ...

  4. UNIX网络编程——名字与地址转换(gethostbyname,gethostbyaddr,getservbyname,getservbyport,getaddrinfo,getnameinfo函数)

    名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IPv4地址之间进行转换.getservbyname和getservbyport在服务器名字和端口号之 ...

  5. Dynamics CRM 电子邮件服务器配置文件Advanced配置中关闭SSL

    在新建电子邮件服务器配置文件时Advanced中的Use SSL for Incoming/Outgoing Connection默认都是启用的而且无法编辑,启用SSL当然是为了安全的考虑,但当客户的 ...

  6. J2EE学习从菜鸟变大鸟之八 企业级项目开发的思考

    什么是企业级项目开发 "企业级项目".企业级项目开发,Java也是企业级项目开发,这个我们到处说.听,每天被我们挂在嘴边,可是到底什么项目才算是"企业级"?自己 ...

  7. Linux:ssh_config快速访问服务器

    在当前用户的根目录下: cd ~/.ssh vi config 编辑config内容为下面: ForwardAgent yes Host 1 Hostname 192.168.1.1 User roo ...

  8. cocos2dx 3.3 + QT5.3制作游戏编辑器

    欢迎转载,但请注明本blog地址,谢谢_(:зゝ∠)_ http://www.cnblogs.com/marisa/p/4141862.html 主要参考: http://blog.csdn.net/ ...

  9. Uva - 1593 - Alignment of Code

    直接用<iomanip>的格式输出,setw设置输出宽度,setiosflags(ios::left)进行左对齐. AC代码: #include <iostream> #inc ...

  10. Linux信号实践(4) --可靠信号

    Sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct si ...