1. 简介

叮咚 Recovery 是基于 Android 的编译体系编译出来的,整个叮咚 Recovery 源码工程可直接编译,只需要机器具备 Android 编译环境即可,无需放在整个 Android 源码工程中编译。

Github源码地址

注意切换到 mtk 分支。编译完成后在 out/patch_device/u819/ 目录下生成对应的 recovery.img

2. 适配步骤

首先要有 Linux 和 Java 环境,我的是 Ubuntu 13.10 64位,Java 要安装 6u23 版本,不然编译过程中 Java 版本不匹配是会报错的。

叮咚 Recovery 本质是先编译一个参考机型,然后进行拼包后打包,生成新机型的 img 文件。机型适配的具体实现在 patch_device 目录下实现,已集成参考例子。针对不同机型的 recovery 的区别是依靠一个叫 device.confinit.conf 的两个文件来实现差异化的。这个文件可以在 patch_device/{device}/device.conf 里面找到。

基于以上,移植第三方机型就更为简单了,可按照以下步骤进行操作:

  1. 找到目标机型官方 recovery 或者它的第三方 recovery,将其拷贝到 patch_device 目录中。

  2. 解包官方 recovery.img。在源码根目录下先执行:

    source build/envsetup.sh

    cd 进 patch_device 中,执行命令 unpack_bootimg + 你的recovery.img + 你要命名的机型目录。如下:

    unpack_bootimg u819-recovery.img u819

    另外MT6577使用的 recovery bin 要使用高通平台的,将 recovery bin 放在 patch_device/mt6577_rec 目录下,这里 U819 不用;

  3. 复制相似机型的 device.confinit.conf 到机型目录的根目录下,参考其他机型。

  4. 修改相关文件,详见 3。

3. 文件修改

3.1 修改 recovery.fstab

3.1.1 sdcard命名规则

外置sd卡 – sdcard 内置sd卡 – sdcard2

如下:

/sdcard vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1
/sdcard2 vfat /dev/block/xxxxxxxxxx # 不同机型,不同的分区设备
/sdcard2 datamedia null # 使用 /data/media 作为模拟内置 SD 卡的机型
/sdcard2 datashare null # 使用 /data/share 作为模拟内置 SD 卡的机型

init.rc 中需要增加一行 mkdir /sdcard2 ,参考修改 init.rc 一节

3.1.2 增加 lun 文件路径

增加 lun 文件路径,主要用于 U 盘挂载模式功能使用。

特别说明:模拟内置卡不支持 U 盘模式,如使用 /data/media 和使用 /data/share 作模拟内置卡路径的机型。普通分区的内置卡和外置卡可支持 U 盘模式,需指定 lun 文件路径。如果是手机不支持外置 SD 卡,并且只有模拟的内置 SD 卡,则不需要写入该字符,如 Galaxy Nexus lun 字段跟在分区后备参数后面,如下:

/sdcard2 vfat /dev/block/mmcblk0p8 lun=/sys/class/android_usb/f_mass_storage/lun1/file
/sdcard vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1 lun=/sys/class/android_usb/f_mass_storage/lun/file
/sd-ext ext4 /dev/block/mmcblk1p2

打开 U 盘模式的功能,还需要在 init.rc 作相应修改,详见「修改 init.rc」一节。

lun 文件请在手机开机时使用 adb shell 查看具体路径后修改。

3.1.3 修改 boot 和 recovery 等分区设备,具体参照官方 recovery.fstab

boot emmc /dev/bootimg
/misc emmc /dev/misc
/recovery emmc /dev/recovery
/system ext4 /dev/block/mmcblk0p5
/cache ext4 /dev/block/mmcblk0p6
/data ext4 /dev/block/mmcblk0p7

3.2 修改 init.rc

3.2.1 修改 init.rc(recovery.img 的,请勿与 boot.img 中的 init.rc 混淆)

……
mkdir /sdcard
mkdir/sdcard2 # 增加内置卡的挂载目录
……
on boot
ifup lo
hostname localhost
domainname localdomain
class_start default # 注意该行如果是main要改成default
……
service recovery/sbin/recovery
service adbd /sbin/adbdrecovery
disabled
……
# 蓝色数值根据 boot.img 获取的值进行修改
# on property:ro.debuggable=1
# write/sys/class/android_usb/android0/enable 0
# write/sys/class/android_usb/android0/idVendor 04e8
# write/sys/class/android_usb/android0/idProduct 6860
# write/sys/class/android_usb/android0/functions adb
# write /sys/class/android_usb/android0/enable1
# write/sys/class/android_usb/android0/iManufacturer $ro.product.manufacturer
# write/sys/class/android_usb/android0/iProduct $ro.product.model
# write/sys/class/android_usb/android0/iSerial $ro.serialno
# start adbd

# adb shell 是否默为 Root 权限
setprop service.adb.root 1

# Restart adbd so it can run as root
onproperty:service.adb.root=1
write/sys/class/android_usb/android0/enable 0
restart adbd
write/sys/class/android_usb/android0/enable 1

# U 盘模式打开或关闭时的驱动配置
onproperty:sys.storage.ums_enabled=1
setprop sys.usb.config mass_storage,adb
write/sys/class/android_usb/android0/enable 0
write/sys/class/android_usb/android0/idVendor 04e8
write/sys/class/android_usb/android0/idProduct 6860
write/sys/class/android_usb/android0/functions $sys.usb.config
write/sys/class/android_usb/android0/enable 1
start adbd
setprop sys.usb.state $sys.usb.config

onproperty:sys.storage.ums_enabled=0
setprop sys.usb.config adb
write /sys/class/android_usb/android0/enable0
write/sys/class/android_usb/android0/idVendor 04e8
write/sys/class/android_usb/android0/idProduct 6860
write/sys/class/android_usb/android0/functions $sys.usb.config
write /sys/class/android_usb/android0/enable$service.adb.root
start adbd
setprop sys.usb.state $sys.usb.config

3.2.2 获取手机 pid & vid

从官方 boot.img 中获取 Pid & Vid(idVendor & idProduct)。找到只有 mass_storage,adb 与 adb 这两项, 记录其 pid vid 值,为下一步个性 init.rc 使用。

MTK 机型在 init.usb.rc 中查找就 OK 了;

3.3 修改init.conf

修改 init.conf 文件如下(不需要的配置的请删除或者注释):

ini_set("internal_sdcard", "1"); # 是否支持内置 sd 卡, 模拟内置卡也需置效,不支持 – 0,支持 - 1
ini_set("external_sdcard", "1"); # 是否支持外置 sd 卡,不支持 – 0, 支持 – 1
ini_set("force_colorspace", "bgra"); # 强制更改 LCD 色彩模式。适配时,首先不设置此值,当默认显示
# 失败时,才进行强制更改。可以是 bgra,rgba,abgr,rgb565 等,自行组合尝试。
ini_set("battery_path","/sys/class/power_supply/Battery/capacity"); # 指定电池容量文件路径,一般可不配置,只有默认读数错误时,需手动配置。

3.4 修改device.conf

修改 device.conf 文件如下(不需要的配置的请删除或者注释):

ini_set("rec_device", "中兴U819"); # 首页显示的设备名称
ini_set("rec_version", "1.1.0"); # 首页显示的版本号
ini_set("rec_author", "上官馨翎"); # 首页显示的作者
ini_set("virtualkeys_enable", "1"); # 是否显示虚拟键
ini_set("reboot_cmd", "recovery_done"); # 一些机型的重启命令比较特殊,如 I739 在此配置,一般不配置该项

3.5 删除文件

删除官方 recovery 解压出来后的 res 下的 image 图片(如果有关机充电相关的图片请勿删除)

4. 编译

在源码根目录执行,如下命令:

./dingdongRec_make.sh 机型名 –p 平台名 –t 屏幕类型(hdpi|xhdpi|xxhdpi)

目前支持的明确支持的平台有 mt6577、mt6589、mt6592,其他 CPU 平台可以先试着用其中相近的,之前试过很多可以用。

例如中兴 U819 的用下面的命令:

./dingdongRec_make.sh u819 -p mt6589 -t hdpi

另 480p – hdpi, 720p – xhdpi 1080p - xxhdpi

即可完成编译,生成 recovery.img。重新编译一遍可以用

./dingdongRec_make.sh clean;
./dingdongRec_make.sh 机型名

补充说明:

如要使用 ./dingdongRec_make.sh all 编译出所有机型, 请将需要编译的机型名字,写在 patch_device/devices.list 中, 写法请参考现有机型。