从零开始反编译修改Rom-精简、调整布局、添加设置项、美化

来源:互联网 发布:科鲁兹方向机在线编程 编辑:程序博客网 时间:2024/06/05 17:42

小弟不才,花了一个下午写了一篇又长又臭的入门级教程,希望可以给有心学习的人一些帮助。
======准备篇======
修改环境:Linux或Windows操作系统,安装有Java-JDK并配置好环境变量。
最新的JDK7可以在这里下载到。
http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html
修改工具:
apktool工具包,这里有一个windows下的版本  apktool.zip

,其中包括
    aapt工具:即Android Asset Packaging Tool , 在Android SDK的platform-tools目录下可以找到。
         该工具可以查看, 创建, 更新apk程序包,可将资源文件编译成二进制文件。
         如果你在反编译或回编译时遇到了各种奇奇怪怪的问题,请尝试更新这个文件,去SDK里找。
         Windows和Linux下的aapt是不同的,前者是aapt.exe,后者是一个Linux下的可执行二进制文件。
    apktool.jar主程序:反编译的关键所在,目前已经更新到v1.43,不知为何2011年12月8日之后未见再次更新。
         你可以在这个网址关注最新版本 http://code.google.com/p/android-apktool/
    apktool命令脚本:调用aapt和apktool工具,提供命令行支持
         Windows下它是一个.abt脚本文件,Linux下是一个可执行脚本文件,二者均可再次编辑。
高级文本编辑工具:要求支持语法高亮和行号显示,如Windows下的NotePad2,NotePad++以及Linux下的vi和emacs等。
压缩软件:个人比较钟爱7Zip,不推荐WinRAR
修改文件:zip卡刷Rom包一个
-提取其中 system/framework 目录下的 
---框架资源文件framework-res.apk
---厂商定制框架资源文件,名称不定,依厂商不同而有所差异,请依照具体情况行事。
   如华为官方Android 2.3的Rom里是framework-res-hwext.apk
   不是所有Rom都有这个文件,一般之存在于各官方Rom中。
-提取其中 system/app 目录下的
---通讯录及拨号程序 Contacts.apk
---设置程序 Settings.apk
---状态栏及下拉通知栏程序 SystemUI.apk
......
准备工作:
-解压apktool工具目录,转到该目录:
Windows下建议解压到C盘的 “User/当前用户名” 目录下,这样进入cmd命令行窗口时,直接输入
cd apktool 即可进入工作目录
Linux下解压到任何用户可读写的目录均可,亦使用 cd /XX/XX/XX 的命令切换工作目录
Android系统框架的图片、布局等资源储存在框架资源文件内,其他程序会或多或少地从其中引用资源文件。
所以我们在反编译大多数的程序时,均需先安装框架资源文件,这样才能顺利反编译,否则会引用出错。
-安装资源框架文件(必须要做,很重要):
命令行切换进入apktool目录后先分别输入下列命令并回车
apktool if framework-res.apk
apktool if 厂商定制框架资源文件名(如华为是framework-res-hwext.apk)
资源框架文件就此安装好了。
-反编译和回编译apk程序,将要修改的程序xxx.apk放到apktool目录下来
---反编译:apktool d xxx.apk
   d代表decompile,即反编译,执行完后工作目录下出现apk同名的文件夹
---回编译:apktool b xxx
   b代表build,编译,xxx指的是回编译的文件夹的名称
-反编译前后的apk目录一般结构解析
---反编译前
   META-INF 目录:签名文件所在目录,由软件作者发布时签名。如果你安装有软件作者发布的原版程序,那么
                 再安装反编译修改后重新签名的程序时,系统会提示签名不一致以警示你此程序是修改过的。
   res 目录:图片、布局、动画效果等资源文件所在目录,drawable开头的字目录是图片等资源文件,layout是
            布局,anim是动画效果,color是颜色......
   AndroidMainfest.xml 文件:程序描述配置文件,定义了程序版本、程序包名、是否显示桌面图标等,一般不动它。
   classes.dex 文件:java代码编译而成的可以在Dalvik虚拟机上执行的二进制文件,apk程序的核心代码所在。
   resources.arsc 文件:包含res文件夹下资源文件索引以及语言资源,是它们编译对齐后的二进制文件。
                       apk程序读取图片等资源时先查找这个文件,根据里面的索引去相应目录下读取。
                       所有的语言支持均编译在此文件内部,汉化时的主要对象就是此文件。
以上是apk程序包的一般结构,具有普遍代表性,有些程序还有assets、lib、raw等目录。
lib目录里一般是程序引用的不开源的库文件,后缀(即扩展名)是.so,目的是版权保护、防止反编译破解。
如音乐播放类和视频播放类程序通常会有一些解码相关的库文件。
有的程序由于提供跨平台支持,lib目录下还会有armeabi、armeabi-v7a、x86、mips等目录与各平台相对应。
这样带库文件的程序如果要内置到Rom中,需要提取其中对应你设备平台的lib库文件放入system/lib目录下。
======实践篇======
为了简化篇幅,安装框架资源文件和反编译以及修改好后回编译的步骤均省去不写。
一、精简(以framework-res.apk为例)
反编译framework-res.apk后,目录下出现同名文件夹,进入res目录:
-删除values-xx的各目录各目录可以精简语言,但请务必保留values和values-zh目录
   values目录是默认语言(通常是英语)所在目录,而且里面还有其他一些相当重要的文件,绝对不能删除!
   values-zh开头的,如values-zh-rCN是简体中文语言所在目录,values-zh-rTW和values-zh-rHK是繁中
   如果把这些个文件夹删了,那么我想你一定会觉得自己在那一瞬间有点介于1和3之间,不过还好有回收站。
   其他一些,如de德语、es西班牙语、fr法语、it意大利语、ja日语、ko韩语、pt葡萄牙语、ru俄语、vi越南语
   请按需保留或删除,其实语言文件也不占很大空间,精简程度很有限。
   附一个“三言两语汉化教程”:以简中为例,新建一个values-zh-rCN目录,从values目录下拷贝strings.xml文件
   放入其中,把相应的地方翻译成中文即可。其他一些细节知识此处不说了。
-删除drawable开头的目录可以精简图片,它们往往是一个apk体积巨大的重要原因。
   但是这里也有几个文件夹不能随便动,首先drawable文件夹是图片等资源的默认目录,请保留吧。
   然后你需要知道你所修改的程序要用在什么dpi的机子上,dpi可以简单理解为像素密度、屏幕的细腻程度。
   目前的dpi分级主要有ldpi(120ppi左右)、mdpi(160ppi左右)、hdpi(240ppi以下)、xdpi(320ppi左右),
   4寸及以下480*800分辨率的屏幕属于hdpi,多数手机属于此列;320*480分辨率的手机或1024*768分辨率的平板通常
   属于mdpi分类;而我们常说的视网膜屏幕则属于xdpi分类了。
   如果你只考虑为某特定机型精简程序,那么可以只保留名称中带相应dpi字样的目录。
   另外,带port字样的目录里的为竖屏特有的资源,带land字样的为横屏有关的资源文件夹。
-除了直接删除某些用不到的资源,还有其他方法,比如删除同名文件、压缩图片资源等。
   假如你只考虑为hdpi的机型做修改,反编译后drawable目录下有一张360*480分辨率的默认壁纸,而drawable-hdpi
   目录下也有个同名的800*960分辨率的壁纸文件,这时你就可以删除drawable下那一张,因为在目标机上根本用不到。
   有的Rom里的图片资源太过高质,你可以使用图片编辑软件在不影响视觉效果的情况下稍作压缩。
-下面讲一个重点,也是很多人反编译修改apk遇到的一个难点,这个难点就是回编译。
   多数情况下我们修改完后使用“apktool b xxx”命令并不能保证可以顺利地回编译。
   常见的错误是.../res/values/public.xml:数字 error: Public symbol.../xxxx declared here is not defined
   这跳debug信息告诉我们/res/values/public.xml文件中第“数字”行出错,里面指定的对象在res目录下不存在。
   这是精简或图片资源引用错误引起的,比如某张图片在其他dpi里定义了,在当前保留的dpi里却用不到,当我们把它删除
   后,并没有删除它在public.xml文件中的定义,程序回编译的时候按照public.xml去找它却已经找不到了,于是就报错了。
   解决的方法就是打开public.xml文件,删除相应的行,这个地方需要比较细心和有耐心。
二、调整布局(以SystemUI.apk为例)
Android程序中的图片、按钮、文字等的布局控制均在layout字样的目录下,layout是默认布局,带port是竖屏布局、land是
横屏布局,同理带hdpi字样的是高ppi屏幕时的布局......我们改动时根据实际需要进行。
比如我要修改CM7的状态栏,在状态栏最左边添加运营商,我改怎么做呢?
首先反编译SystemUI.apk是不用说了。
打开 res/layout/status_bar.xml 文件,这是状态栏的全局布局文件,找到“com.android.systemui.statusbar.XXX”,在
第一次出现该字段的那句前面添加类似的句子,将“XXX”改成“CarrierLabel”,再调整其他的布局参数调试至满意即可。
只要懂点英语,应该就能根据XXX的意思知道它代表什么,如Clock代表状态栏的时钟,意味着你也可以调整时钟的位置。
另外,关于状态栏和下拉通知栏的文字颜色什么的也在布局文件里修改,颜色的定义通常是类似“#ff000000”的十六进制数值,
前两位表示透明度,后六位为颜色,限于篇幅,更详细的就只能请你自己百度了。
关于Android的五大布局FrameLayout、LinearLayout、RelativeLayout、TableLayout、AbsoluteLayout,我不会很深入地
讲,因为我也是个半吊子,只要大家搜索一下“android 布局”关键字,相关的文档、帖子都讲得比我详细、比我好。
三、添加设置项(必然以Settings.apk为例)
背景需求:假如我现在想在设置菜单里增加一项“虚拟按键背景灯控制”的功能,以便可以很方便地打开或关闭手机上
         Home、菜单、返回等虚拟按键的背光。那么我该怎么做呢?
分析:很遗憾的是我没有Java基础,无法直接往Settings.apk反编译出来的代码里添加这项功能,更何况直接用apktool反编
     译出来的是smail代码,可读性很差,更别说修改并添加功能了,怎么办?
     看来只能使用第三方软件,然后把它链接到设置菜单了。
     用过CM系列Rom的朋友应该知道app目录下有个CMParts.apk,它没有桌面图标,唯一入口在设置菜单里,即“CM设置”选项。
     现在我找到一个小巧实用的第三方程序BacklightOff.apk,它安装后会生成有桌面图标,通过点击图标进入程序。
     但我现在想把它集成进系统,不生成桌面图标,而是在设置菜单的“显示”子菜单页中添加程序入口
方法:
---首先,反编译BacklightOff.apk,打开AndroidManifest.xml,第二行显示package="com.neuron.BacklightOff",
     说明它的包名是 com.neuron.BacklightOff,先记下。
     找到“android.intent.category.LAUNCHER”,说明此程序有桌面图标,将“LAUNCHER”改成“DEFAULT”即可去掉图标
     接下来我们需要找出这个程序的 MainActivity 是什么,以便待会儿在设置菜单中添加链接。
     幸运的是这个程序很简单,从AndroidManifest.xml文件中taskAffinity=".BacklightOff"就可以看出来。
---第二步,反编译Settings.apk,首先打开 res/values 目录下的 strings.xml添加适当的字符串及其翻译。
     比如我们在最后一行添加(当然,严格地来说是在倒数第二行,因为需加在</resources>行之前)
       <string name="backlight_title">键盘背光</string>
        <string name="backlight_summary">打开/关闭 键盘背光</string>
     第一个是菜单标题,第二个是标题下的注释性文字,加“_title”和“_summary”是命名规范,便于区分,放在最后是为了
     便于修改。你也可以随意命名和放置,前提是待会在加入链接的地方名称要保持一致。英文的我就不写上来献丑了。
---接下来,打开 res/xml 目录,找到“显示”字菜单的配置文件display_settings.xml 并打开,在适当的位置添加
    <PreferenceScreen android:title="@string/backlight_title" android:key="backlight" android:summary="@string/backlight_summary">
        <intent android:targetPackage="com.neuron.BacklightOff" android:action="android.intent.action.MAIN" android:targetClass="com.neuron.BacklightOff.BacklightOff" />
    </PreferenceScreen>
    添加时可以参考手机的设置界面以及该文件中的内容以确定添加位置。
    这里添加的菜单类型是“PreferenceScreen”,它的标题是“backlight_title”对应的内容注释是“backlight_summary”对
    应的内容指向的程序包为“com.neuron.BacklightOff”指向的Activity是“com.neuron.BacklightOff.BacklightOff”
    在主设置界面添加带图标的菜单项时则使用“com.android.settings.IconPreferenceScreen”选项,其他参数类似,区别在
    于需要在drawable-hpdi(依具体情况而定)文件夹里添加图片文件,并使用settings:icon="@drawable/xxx"来指定图片。
---最后,回编译BacklightOff.apk和Settings.apk即可。
四、美化(以Contacts.apk为例)
美化看似简单,其实是最考验眼力和想象力的工作,需要大量收集素材,学会用PS等软件,是相当累人的工作。
当你把drawable文件夹打开,里面全是零零碎碎的图片,没有经验的话根本不知道哪张图片是管哪里的
当经验积累起来,知道各图片的用处时,你还得有丰富的想象力,想象你修改了某张图片或某处布局之后会是什么效果
美化工作还需要有相对比较大众化的审美观,以及广阔的胸怀(因为不管你怎么努力,总有些人会说“丑死了”之类的话...)。
当然,做美化也得乐于去倾听和收集机友们中肯的意见和建议,因为很多时候他们很有创意。
哦,还有很重要的一点就是要做好近视度数大幅增加的心理准备...~_~  (保护视力,眼***操,现在开始...)
不好意思,写了一下午,有点烦了,发了点牢骚...各位请略过。
---美化做的主要是修改和替换,只改图片的话请不要反编译!请直接修改
   用压缩软件把apk以压缩包方式打开(暂时不要关闭),把带drawable字样的文件夹拖出来(即复制出来)放到工作目录。
   然后进这些目录,把xml文件都删掉,只留下图片,然后想怎么改就怎么改,改完后把这些图片选中,拖回到apk的相应目录里。
   需要注意的是:xxx.9.png格式的图片不要轻易地修改,因为这种格式很特殊,需要用专用工具修改,PhotoShop都搞不定它。   这里上传一个专用修改工具给有需要的朋友  9.png处理.zip (745.5 KB, 下载次数: 14) 2012-11-2 19:33 上传


---如果美化涉及到改布局,例如改颜色,那么请反编译修改,不反编译的话,xml文件打开就是一对乱码
---我现在想修改拨号数字按钮,经验告诉我,拨号按钮的图片资源在Contacts.apk的res/drawable-hdpi-finger目录下,它们是
   btn_dial_normal.9.png    拨号按钮
   btn_dial_pressed.9.png   拨号按钮按下时
   btn_dial_selected.9.png  拨号按钮选中时
   由于我有.9.png的修改工具,而且已经改好了素材,于是,我直接把改好的文件分别改成这三个名字。
   用7Zip打开Contacts.apk,继续打开它的res/drawable-hdpi-finger目录,然后把图片拖进去直接替换了。
======总结篇======
1.折腾Android手机,电脑上安装JDK是非常有必要的。
2.apktool的aapt程序尽量保持更新。
3.电脑上安装一个高级文本编辑工具是很有帮助的。
4.反编译之前必须安装资源框架文件,如有厂商定制的框架资源文件,也需一并安装
5.请注意Linux系统是大小写敏感的,使用apktool工具时一定要注意把命令行写对,多使用“Tab”键。
6.往Rom添加带lib库文件的apk时需要提取与目标机型平台对应的库文件加入到system/lib目录。
  已提取库文件的apk可以用压缩软件打开并删除其中的lib目录,只要system/lib下有需要的库文件,仍可正常运行。
7.精简apk时务必注意区分dpi,不要过度精简。
8.回编译程序出错时请仔细、耐心阅读出错提示,实在不会解决的可以复制关键字进行搜索,或者询问有经验的人
9.调整布局时需要细心,有想象力。
10.添加设置项时要学会类比分析。
   细心看xml下的文件,结合values下的array.xml、bool.xml、integers.xml、strings.xml会有很大收获的
11.汉化不求人,自己动手,丰衣足食,还可以提高英语水平,一举多得。
12.美化需要很多时间和精力的投入,如果能趁机学好PhotoShop,亦不失为一种收获。

写了一下午,暂时没配任何图片,不过只要有心人细心看,无图也是有真相滴。。。

原创粉丝点击