资源描述
MIUI ROM 定制教程
MIUI ROM 定制教程.......................................................................................................................1
序言...................................................................................................................................................2
第一章 搭建开发环境..................................................................................................................... 3
1. 操作系统..............................................................................................................................3
2. 安装 Android SDK.............................................................................................................. 3
2.1 安装 JDK....................................................................................................................3
2.2 下载 Android SDK 包................................................................................................3
2.3 安装............................................................................................................................ 4
2.4 adb............................................................................................................................... 4
3. patchrom 项目...................................................................................................................... 5
第二章 认识 Android 手机..............................................................................................................6
1. bootloader..............................................................................................................................6
2. 正常启动..............................................................................................................................7
3. System 分区..........................................................................................................................8
4. Zygote(app_process)...........................................................................................................10
5. data 和 cache 分区.............................................................................................................. 10
6. 小结....................................................................................................................................10
第三章 寻找合适的原厂 ROM..................................................................................................... 11
1. 熟悉移植的机型................................................................................................................ 11
1.1 逛论坛刷机.............................................................................................................. 11
1.2 合适的原厂 ROM.................................................................................................... 11
1.3 adb logcat.......................................................................................................................... 12
2. 修改 boot.img.................................................................................................................... 12
3. deodex................................................................................................................................. 14
第四章 反编译............................................................................................................................... 14
1. 反编译................................................................................................................................15
2. AndroidManifest.xml..........................................................................................................15
3. 资源....................................................................................................................................16
4. smali....................................................................................................................................18
第五章 移植 MIUI Framework......................................................................................................20
1. 为什么使用代码插桩........................................................................................................20
2. 移植规范............................................................................................................................20
2.1 android.......................................................................................................................20
2.2 miui............................................................................................................................21
2.3 i9100.......................................................................................................................... 21
3. 移植资源............................................................................................................................22
4. 修改 smali.......................................................................................................................... 22
4.1 比较差异.................................................................................................................. 22
4.2 直接替换.................................................................................................................. 23
4.3 线性代码.................................................................................................................. 23
4.4 条件判断.................................................................................................................. 23
4.5 逻辑推理.................................................................................................................. 25
5. 建议....................................................................................................................................26
第六章 移植 MIUI APP.................................................................................................................27
1. MIUI APP 一览.................................................................................................................. 27
2. 一个遗憾:打电话程序....................................................................................................27
3. 一个遗憾引发的问题........................................................................................................28
4. 系统通知栏........................................................................................................................28
5. 其它程序............................................................................................................................29
第七章 制作刷机包....................................................................................................................... 29
1. 刷机包结构........................................................................................................................29
2. updater-srcript 例解............................................................................................................ 30
3. 制作刷机包........................................................................................................................35
序言
为了帮助广大的 MIUI 发烧友将 MIUI ROM 移植到自己所喜爱的机型上,MIUI 开发组
创建并开源了 patchrom 项目,同时发布此配套教程。该教程主要探讨的是如何在原厂 ROM
的基础上定制出自己的 MIUI ROM(原厂 ROM 指的是由手机生厂商发布的官方 ROM,具
有最好的稳定性),这也是我们项目名称的由来(对已有的 ROM 作修改,类似于对软件打
patch 的过程,因此称作 patchrom)。虽然本教程着重于如何定制 MIUI ROM,但是其中涉及
到的技术和概念是通用的,适用于任何 ROM 的定制。
要完全掌握此教程,你需要有 Linux 操作系统的使用经验,了解 Java 语言,有一定的
Android 编程经验最好。如果只是要修改资源(比如汉化等 ),基本上不需要有任何编程知
识。
本教程分成六个章节:
第一章:搭建开发环境,简要的介绍如何准备必要的开发环境。
第二章:认识 Android 手机,从 ROM 开发者的角度来看 Android 手机系统的结构。
第三章:寻找合适的原厂 ROM,patchrom 项目是基于原厂 ROM 进行修改的,这一章
会介绍一些准则来判断什么是合适的 ROM。
第四章:反编译,介绍 apktool 工具和反编译的基础知识。
第五章:移植 MIUI Framework,讲述如何移植 MIUI 框架层的代码。
第六章:移植 MIUI App,讲述如何移植 MIUI 的应用程序。
第七章:制作 ZIP 刷机包,讲述如何制作一个 ZIP 刷机包。
patchrom 项目网址:
你可以访问该网站下载到 patchrom 的所有代码,包括本教程。
第一章 搭建开发环境
“工欲善其事,必先利其器”。在开始定制 MIUI ROM 之前,我们需要搭建好必要的开
发环境。
本教程的主旨是如何基于原厂 ROM 修改。我们所涉及的修改理论上说是不需要源码的,
对源码开发感兴趣的可以参照 。对于 ROM 开发者来说,我们建议
你下载一份 google 发布的 android 源代码,这不是必需的,但是对于理解排查 ROM 适配中
的一些错误有很大帮助。
1. 操作系统
定制 MIUI ROM 所涉及的技术本身对操作系统没有特殊要求,Windows,Linux 和 Mac
系统都可以。但是 patchrom 项目是基于 Linux 开发的,确切的说,是基于 Ubuntu 开发的,
我们推荐使用 Ubuntu10 以上的版本。
2. 安装 Android SDK
本节简要介绍如何在 Ubuntu 系统上安装 Android SDK。Windows 和 Mac 用户请参照
2.1 安装 JDK
首先需要安装 Java 开发工具包,本文中统一约定$表示 Terminal 中的命令提示符,其后
的文字表示输入的命令。
$ sudo add-apt-repository "deb lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
2.2 下载 Android SDK 包
从以下地址下载 Android SDK 包
解压到你的 home 目录下,假定解压后的目录为/home/patcher/android-sdk-linux。
接下来编辑 home 目录下的.bashrc 文件,修改 PATH 环境变量:
export PATH=~/android-sdk-linux/platform-tools:~/android-sdk-linux/tools:$PATH。
运行命令. .bashrc 来使对 PATH 环境变量的修改生效。
$ . ~/.bashrc
2.3 安装
运行命令 android 来启动 Android SDK Manager
$ android
启动结果如下图所示:
选中 Android SDK Tools 和 Android SDK Platform-tools,然后点击安装,接下来跟随应
用程序的说明进行安装。这一步完成后,我们所需要的 Android SDK 也安装完毕了。
注:在 网页中,大家会看到需要安装 Eclipse,
定制 MIUI ROM 不需要安装 Eclipse,这个是开发 Android 程序所需要的,但是强烈建议你
有 Android 程序开发基础。
2.4 adb
Android SDK 中对我们最重要的工具是 adb(android debug bridge)。在移植 MIUI ROM 过
程中,最常用的命令是 adb logcat,该命令会打印出详细的调试信息,帮助我们定位错误。
为了验证 adb 是否工作,同时也是验证上述的步骤是否成功,打开手机中的系统设置,
选择应用程序—开发,确保选中“USB 调试”,然后用 USB 线连接你的手机,在 Ubuntu Shell
下运行命令 adb devices,如果显示和下面的信息类似,恭喜你,adb 可以识别你的手机了。
List of devices attached
304D1955996BE28E
device
注意:
(1) 在 Windows 下,必须安装手机相应的驱动才能成功识别手机。
(2) 在 Ubuntu 下,有可能会提示“no such permissions”,这个时候有两种办法,第一种是以
root 的身份运行 adb。第二种办法:
a)
b)
运行 lsusb 命令,对于我的三星手机,输出如下:
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 098: ID 04e8:685e Samsung Electronics Co., Ltd
。。。
找到手机对应的那一行,记录下 04e8:685e,这个分别表示该设备的 vendorId 和
productId。如果不确定手机对应的是哪一行,可以在连上手机前后运行 lsusb,找
到区别的那一行。
在/etc/udev/rules.d 目录下新建一个文件 99-android.rules。编辑如下:
SUBSYSTEMS=="usb",
ATTRS{idVendor}="04e8",
ATTRS{idProduct}="685e",
MODE="0666", OWNER="登录用户名"
c)
重启 usb 服务,sudo restart udev,重连手机。
3. patchrom 项目
下面介绍 patchrom 的目录结构以及各目录的作用。
�
android: 该目录下有 2 个子目录:system 和 src。其中 src 目录和将要介绍的 miui/src 目
录是一对一的关系。android/src 是 google 发布的 android 源码,miui/src 是 miui 在 google
源码基础上所做的修改。为了节省空间,在这两个目录,我们只放 miui 修改过的文件,
要下载完整的 android 源码,请参照
system 目录下存放的是由 google 发布的 android 源码编译而成的三个 jar 包:
framework.jar, android.policy.jar 和 services.jar。这些 jar 包的作用在之后的章节会详细阐
述。
�
�
�
�
build: 该目录是一些与编译相关的脚本。
tools: 该目录存放一些工具程序和脚本,在定制 ROM 和编译过程中需要使用这些程序。
miui: 该目录下有 2 个子目录:system 和 src。system 目录下存放的是由 miui 源代码编
译后的部分文件,这些文件是我们定制 MIUI ROM 所需要用到的所有文件。之后的章
节会详细阐述。
i9100: 针对每一个要定制的机型,创建一个单独的目录。该目录存放的是和三星 i9100
相关的一些修改和文件。之后的章节会以 i9100 为例详细阐述。
接 下 来 我 们 开 始 编 译 生 成 i9100 的 定 制 MIUI ROM , 假 定 当 前 目 录 为
/home/patcher/patchrom 目录,
$ . build/envsetup.sh
$ cd i9100
$ make zipfile
以上命令运行完毕后,在 i9100 目录下会生成一个 .build 子目录,该子目录下的
MIUI_9100.zip 文件即是我们发布的 i9100 刷机包。
第二章 认识 Android 手机
写这篇文章时想起我的第一部 Android 手机 HTC Hero。买回来后,同事告诉我可以去
刷机玩玩。刷机,怎么刷?同事说,你个土人,刷机都不知道,很多刷机论坛的,你去逛逛,
挺简单的。我去逛了逛机锋论坛(那时还不知道 MIUI),打开一看,什么 recovery, radio, root
各种词汇扑面而来,oh my lady gaga,这么复杂。但是为了不被鄙视,而且闲着也是闲着,
还是刷着玩玩吧。后来就结识 MIUI 来到了小米。
在这纷纷扰扰的 Android 世界里,如何找到那条刷机大道呢,或许它只是个传说,我们
只是一直在探索。让我们从零开始来看一看,看能发现点什么。
1. bootloader
当我们拿到一款手机,第一件事应该就是按下电源键开机,那么从开机到进入到桌面程
序这中间发生了些什么呢,我们从下面这张简化了的手机结构图开始:
注意:该结构图并不反映手机的实际分区顺序和位置,只是一个逻辑结构图。
大家可以简单的把手机的 ROM 存储类比为我们电脑上的硬盘,这个硬盘被分成了几个
分区:bootloader 分区,boot 分区,system 分区等等。后面我们会逐渐介绍各个分区的用途。
所谓的刷机我们可以简单的理解成把软件安装在手机的某些分区中,类似于我们在电脑上安
装 Windows 系统。
当按下电源键手机上电启动后,首先从 bootloader 分区中一个固定的地址开始执行指令,
bootloader 分区分成两个部分,分别叫做 primary bootloader 和 secondary stage bootloader。
Primary bootloader 主要执行硬件检测,确保硬件能正常工作后将 secondary stage bootloader
拷贝到内存(RAM)开始执行。Secondary stage bootloader 会进行一些硬件初始化工作,获取
内存大小信息等,然后根据用户的按键进入到某种启动模式。比如说大家所熟知的通过电源
键和其它一些按键的组合,可以进入到 recovery,fastboot 或者选择启动模式的启动界面等。
我们在论坛上看到的 bootloader 通常指的就是 secondary stage bootloader。不过我们不需要关
心太多的细节,可以简单的理解为 bootloader 就是一段启动代码,根据用户按键有选择的进
入某种启动模式。
fastboot 模式:fastboot 是 android 定义的一种简单的刷机协议,用户可以通过 fastboot
命令行工具来进行刷机。比如说 fastboot flash boot boot.img 这个命令就是把 boot.img 的内容
刷写到 boot 分区中。一般的手机厂商不直接提供 fastboot 模式刷机,而是为了显示他们的牛
B 之处,总是会提供自己专有的刷机工具和刷机方法。比如说三星的 Odin,摩托的 RSD,
华为的粉屏等等。但是其本质实际上是相同的,都是将软件直接 flash 到各个分区中。
recovery 模式:当进入 recovery 模式时,secondary stage bootloader 从 recovery 分区开始
启动,recovery 分区是一个独立的 Linux 系统,当 recovery 分区上的 Linux 内核启动完毕后,
开始执行第一个程序 init(init 程序是 Linux 系统所有程序的老祖宗)。init 会启动一个叫做
recovery 的程序(recovery 模式的名称也由此而来)。通过 recovery 程序,用户可以执行清除
数据,安装刷机包等操作。一般的手机厂商都提供一个简单的 recovery 程序,而大名鼎鼎的
CWM Recovery 就是一个加入了很多增强功能的 recovery 程序,要想用上 CWM Recovery 前
提是 recovery 分区可以被刷写。大家在论坛上看到的解锁 bootloader,通常指的就是解锁
recovery 或 fastboot,允许刷写 recovery 分区,这样大家就可以用上喜爱的 CWM Recovery
了。
手机除了普通的 CPU 芯片以外,还有 MODEM 处理器芯片。该芯片的功能就是实现手
机必需的通信功能,大家通常所的刷 RADIO 就是刷写 modem 分区。
2. 正常启动
当我们只是按下电源键开机时,会进入正常启动模式。 Secondary stage bootloader 会从
boot 分区开始启动。Boot 分区的格式是固定的,首先是一个头部,然后是 Linux 内核,最
后是用作根文件系统的 ramdisk。
当 Linux 内核启动完毕后,就开始执行根文件系统中的 init 程序,init 程序会读取启动
脚本文件(init.rc 和 init.xxxx.rc)。启动脚本文件的格式大家可以在网上找到很多参考资料,
这里就不写了,而且我们在原厂 ROM 上移植 MIUI 的原则是不修改 boot 分区,因为有一些
机型无法修改 boot 分区。
根文件系统中有一个重要的配置文件,叫 default.prop,该文件的内容一般为:
#
# ADDITIONAL_DEFAULT_PROPERTIES
#
ro.secure=1
ro.allow.mock.location=1
ro.debuggable=0
persist.service.adb.enable=1。
文件中的每一行对某个属性赋值,在后续的文章中我们还会谈到属性。这里面大家需要
注意的两个属性:ro.secure 和 ro.debuggable。如果 ro.secure=0 则允许我们运行 adb root 命令。
通常大家说得内核 ROOT 指的就是 ro.secure=0。而一般所说的 ROOT 权限指的是手机上有
一个名为授权管理的程序(Superuser.apk)可以授予程序 root 用户的权限。
init 程序读取启动脚本,执行脚本中指定的动作和命令,脚本中的一部分是运行 system
分区的程序,下一节我们就来看看 system 分区的结构。
3. System 分区
在讲 system 分区之前,我们先来看下面这张 Android 的软件系统架构图。
从上到下依次为:
�
�
�
�
核心应用层:这一层就是大家平常所接触的各种各样的系统自带应用,比如联系人,电
话,音乐等。应用层往下就是开发人员所接触的。
框架层:这一层是 Android 系统的核心,它提供了整个 Android 系统运作的机制,像窗
口管理,程序安装包管理,开发人员所接触的 Activity, Service, broadcast 等等。
JNI 层:JNI 层是 Java 程序和底层操作系统通信的一个机制,它使得 Java 代码可以调用
C/C++代码来访问底层操作系统的 API。
Dalvik 虚拟机:Android 开发使用 Java 语言,应用程序的 Java 代码会被编译成 dalvik
虚拟机字节码,这些字节码由 dalvik 虚拟机解释执行。
�
�
�
�
本地库:本地库一般是由 C/C++语言所开发,直接编译成相应 CPU 的机器码,这其中
包含标准 C 库,用以绘制图形的 skia 库,浏览器核心引擎 webkit 等。
HAL:硬件抽象层,为了和各个厂家的不同硬件工作,Android 定义了一套硬件接口,
比如说为了使用相机,厂家的相机驱动必须提供的接口方法。这样使得上层的代码可以
独立于不同的硬件运行。
厂家适配层:本来 Android 定义的 HAL 层是直接和厂家提供的设备驱动打交道的,但
是目前厂家不想开源 HAL 部分的代码,因此很多厂家都提供了一个我称之为厂家适配
层的代码,
展开阅读全文