1. 简介
叮咚 Recovery 是基于 Android 的编译体系编译出来的,整个叮咚 Recovery 源码工程可直接编译,只需要机器具备 Android 编译环境即可,无需放在整个 Android 源码工程中编译。
注意切换到 mtk 分支。编译完成后在 out/patch_device/u819/
目录下生成对应的 recovery.img
。
2. 适配步骤
首先要有 Linux 和 Java 环境,我的是 Ubuntu 13.10 64位,Java 要安装 6u23 版本,不然编译过程中 Java 版本不匹配是会报错的。
叮咚 Recovery 本质是先编译一个参考机型,然后进行拼包后打包,生成新机型的 img 文件。机型适配的具体实现在 patch_device
目录下实现,已集成参考例子。针对不同机型的 recovery 的区别是依靠一个叫 device.conf
和 init.conf
的两个文件来实现差异化的。这个文件可以在 patch_device/{device}/device.conf
里面找到。
基于以上,移植第三方机型就更为简单了,可按照以下步骤进行操作:
-
找到目标机型官方 recovery 或者它的第三方 recovery,将其拷贝到
patch_device
目录中。 -
解包官方 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 不用; -
复制相似机型的
device.conf
,init.conf
到机型目录的根目录下,参考其他机型。 -
修改相关文件,详见 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
中, 写法请参考现有机型。