一步步教你如何源码编译Recovery
*1 准备Ubuntu作为您的操作系统,笔者的版本是12.04_amd64。
*2 准备 Android 源码的编译环境,主要是安装一些编译用到的lib库,以及同步源码的一些工具
,如GIT,CURL,REPO等。[source.android.com]
*3 在确保环境已准备妥当之后,接下来开始下载 Android 源码,此文以cm 10.1 源码为例。
1).创建一个用于存放源码的目录,如:android/system
mkdir –p android/system
2).切换到该目录
cd android/system
3).初始化cm-10.1的分支
repo init -u git://github.com/CyanogenMod/android.git -b cm-10.1
4).同步源码
repo sync –j30
*4 适配你的Vendor
1).前提条件
* 已root;
* 有boot.img或者recovery.img
2).手动建立Vendor文件夹:device/ZTE/N881F,规则
为“device/device_manufacturer_name/device_name”,这里 “device_manufacturer_name”
指的是你要编译的设备的厂商(如ZTE,HTC,MOTO等),“device_name” 指的是你的设备名称
mkdir –p device/ZTE/HTC
3).获取boot.img
adb连接手机状态下,输入
adb shell
进入shell模式,保证手机已root,输入 su,转入root权限,输入
cat /proc/mtd
查看有recovery(和/或)boot路径,如果存在,分别执行
dd if=/your_boot_partition of=/your_sdcard_if_exists/boot.img
dd if=/your_recovery_partition of=/your_sdcard_if_exists/recovery.img
your_boot_partition 是mtd文件中记载的boot的路径,your_sdcard_if_exists 是你的sdcard路
径,recovery同理,完成后退出shell,在终端或命令行下执行
adb pull /your_sdcard_if_exists/boot.img d:\boot.img
adb pull /your_sdcard_if_exists/recovery.img d:\recovery.img
这样就获取了boot.img和recovery.img文件
如果cat /proc/mtd 提示 No such file or directory,请在adb shell的root权限下执行
mount
在输出中查找 system,userdata,cache的路径,通常情况下,boot,recovery路径会和他们保持一
致,一个可能的输出是
root@stanley:/ # mount
mount
rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/mmcblk0p12 /system ext4 ro,relatime,user_xattr,acl,barrier=1,data=ordered
0 0
/dev/block/mmcblk0p15 /data ext4
rw,nosuid,nodev,noatime,user_xattr,acl,barrier=1,data=ordered,noauto_da_alloc 0 0
/dev/block/mmcblk0p13 /cache ext4
rw,nosuid,nodev,noatime,user_xattr,acl,barrier=1,data=ordered,noauto_da_alloc 0 0
/dev/block/mmcblk0p3 /rca ext4 ro,noatime,user_xattr,acl,barrier=1,data=ordered 0 0
/dev/block/mmcblk0p18 /rfs ext4 rw,noatime,user_xattr,acl,barrier=1,data=ordered 0 0
/dev/block/mmcblk0p19 /devlog ext4
rw,nosuid,nodev,relatime,user_xattr,acl,barrier=1,data=ordered 0 0
tmpfs /data/secure/data tmpfs rw,relatime,mode=755,gid=1000 0 0
htcfs /data/htcfs fuse.htcfs
rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other 0 0
DxDrmServerIpc /data/DxDrm/fuse fuse.DxDrmServerIpc
rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other 0 0
/dev/block/vold/179:14 /mnt/sdcard vfat
rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow
_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=
remount-ro,discard 0 0
/dev/block/vold/179:14 /mnt/secure/asec vfat
rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow
_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,er
rors=remount-ro,discard 0 0
tmpfs /mnt/sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0
分析内容发现,没有boot,没有Recovery分区。。。不急,咱们找规律。
/dev/block/mmcblk0p13,/dev/block/mmcblk0p15,/dev/block/mmcblk0p12。。。这样是不是
boot和recovery分区路径为/dev/block/boot和/dev/block/recovery?
此时查看 /dev/block 目录
root@stanley:/ # ls /dev/block
ls /dev/block
boot
cache
cdrom
cid
...
recovery
...
真有,那么 boot 和 recovery 即是我们要寻找的文件,接下来,同样使用 dd 命令导出它们到
sdcard,再使用adb pull命令导出到本地磁盘
4).生成vendor
source build/envsetup.sh
make -j4 otatools
build/tools/device/mkvendor.sh device_manufacturer_name device_name
/your/path/to/the/boot.img
实际命令如下:
source build/envsetup.sh
make -j4 otatools
build/tools/device/mkvendor.sh HTC boot.img
上述命令假设你的boot.img存放于源码目录下。
5).提取recovery.fstab。经过第4)步骤后,会生成一份默认的recovery.fstab到你的HTC目录下
,这时我们需要获取一份属于你机器的挂载点,这时候有两种办法:
* 直接查看手机里的“/cache/recovery/last_log”,如果该文件存在,则查找如下内容:
recovery filesystem table
=========================
如果有上述内容,那就将它拷贝粘贴至recovery.fstab。
* 解包recovery.img,解压后的etc目录下有此文件,直接拷过来用。文件内容:
mount point fstype device [device2]
/boot emmc /dev/block/mmcblk0p8
/cache ext4 /dev/block/mmcblk0p15
/data ext4 /dev/block/mmcblk0p13
/misc emmc /dev/block/mmcblk0p17
/recovery mtd /dev/block/mmcblk0p16
/sdcard vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1
/system ext4 /dev/block/mmcblk0p12
/sdcard2 vfat /dev/block/mmcblk0p20
6).准备 recovery.rc
import /init.recovery.${ro.hardware}.rc
on early-init
start ueventd
on init
export PATH /sbin
export ANDROID_ROOT /system
export ANDROID_DATA /data
export EXTERNAL_STORAGE /sdcard
symlink /system/etc /etc
mkdir /boot
mkdir /recovery
mkdir /sdcard
mkdir /internal_sd
mkdir /external_sd
mkdir /sd-ext
mkdir /datadata
mkdir /emmc
mkdir /system
mkdir /data
mkdir /cache
mount /tmp /tmp tmpfs
chown root shell /tmp
chmod 0775 /tmp
write /sys/class/android_usb/android0/enable 0
#可能会修改的地方
write /sys/class/android_usb/android0/idVendor 19d2
write /sys/class/android_usb/android0/idProduct 1361
write /sys/class/android_usb/android0/functions mass_storage,adb
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}
on boot
ifup lo
hostname localhost
domainname localdomain
class_start default
service ueventd /sbin/ueventd
critical
service recovery /sbin/recovery
service adbd /sbin/adbd recovery
disabled
# Always start adbd on userdebug and eng builds
on property:ro.debuggable=1
write /sys/class/android_usb/android0/enable 1
start adbd
setprop service.adb.root 1
# Restart adbd so it can run as root
on property:service.adb.root=1
write /sys/class/android_usb/android0/enable 0
restart adbd
write /sys/class/android_usb/android0/enable 1
7).修改 recovery.rc
这个文件基本上是通用的,可能需要修改的地方单独指出来了,如果recovery编译完后“US、B大容量”不
能正常挂载,则可去手机里去看
看“/sys/class/android_usb/android0/idVendor”和“/sys/class/android_usb/android0/idP
roduct”这两个文件的内容,然后依次填入上述可修改处的值(如 idVendor 19d2,把“19d2“
换成“/sys/class/android_usb/android0/idVendor”对应的值即可)。
在Ubuntu下还可以用lsusb命令查看这两个值:
focus@ubuntu:/media/linux/jellybeanplus/system$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID 064e:d20c Suyin Corp.
Bus 002 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 003 Device 013: ID 19d2:1361 ZTE WCDMA Technologies MSM
最后一行的19d2和1361即为idVendor和idProduct。
8).重写按键对应的c文件 recovery_ui.c
9).提取设备的根文件系统的rc或sh文件,如init.usb.rc。(仅在根文件系统的目录下有这些文
件的情况下成立,如无则忽略)
10).查看内核基址,ramdisk文件的offset偏移量等
11).提取system.prop
adb pull /system/build.prop
从手机里pull过来build.prop后,拷贝到HTC目录,打开文件,将文件内容拷贝至system.prop,
然后将build.prop文件删除。
*5 开始编译
1).设置源码环境变量
gedit ~/.bashrc
添加如下环境变量:
# Android environment
export TARGET_ARCH=arm
export ANDROID_SDK_TOOLS=<YOUR_ANDROID_SDK_DIR>/tools
export ANDROID_TOOLCHAIN=<YOUR_SOURCE_CODE_DIR>/prebuilt/linux-
x86/toolchain/arm-eabi-4.4.3/bin
export PATH=${ANDROID_SDK_TOOLS}:${ANDROID_TOOLCHAIN}:$PATH
# Java environment
JAVA_HOME=<YOUR_JAVA_SDK_DIR>
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
执行命令使环境变量生效:
source ~/.bashrc
2).编译你的Vendor
cd <源码目录>
source build/envsetup.sh
lunch cm_HTC-eng
make -j4 recoveryimage
一步步教你如何源码编译Recovery的更多相关文章
- mpusher 源码编译 for windows X64
mpusher 源码编译 for windows X64 对于java我是小白,通过一步步的摸索,将经验总结下来,给更多码友提供入门的帮助.一个人的摸索是很困难的,本教程感谢 [MPush开源消息推送 ...
- linux源码编译安装OpenCV
为了尽可能保证OpenCV的特性,使用OpenCV源码编译安装在linux上.先从安装其依赖项开始,以ubuntu 14.04.X为例讲解在Linux上源码编译安装OpenCV,其他linux版本可以 ...
- Android 5.0源码编译问题
如果是自己通过repo和git直接从google官网上download的源码,请忽略这个问题,但是由于google在国内被限制登录,通过这一种方法不是每个人都能download下来源码,通常的做法就是 ...
- Android stdio Apktool源码编译
Android Apktool源码编译 标签(空格分隔): Android Apktool 源码编译 需求 习惯NetBeans调试smali需要用Apktool反编译apk,需要用-d的参数才能生成 ...
- SSH/SSL 源码编译安装简易操作说明
环境:CentOS 6.7 安全加固需求,由于某盟扫描系统主机有SSL系列漏洞,客户要求必须修复: 解决方案:将SSH/SSL升级到最新版本,删除SSL旧版本(实测不删除旧版本某盟扫描无法通过). 当 ...
- Hadoop源码编译过程
一. 为什么要编译Hadoop源码 Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通 ...
- World Wind .NET源码编译问题处理
World Wind .NET源码编译问题处理 下载了World_Wind_1.4.0_Source源码(http://worldwindcentral.com/wiki/NASA_World_W ...
- 源码编译安装 MySQL 5.5.x 实践
1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. # wget ht ...
- Linux 安装node.js ---- 源码编译的方式
一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-release 2.检查 gcc.gcc-c++ 是否安装过 命令: rpm -q gcc rp ...
随机推荐
- POJ1657 Distance on chessboard
Distance on Chessboard Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25623 Accepted ...
- openstack debugs
- uva 10714 Ants(贪心)
题目连接:10714 - Ants 题目大意:一根棍子上有n只蚂蚁, 这些蚂蚁开始可以任意朝着一个方向移动一直走,向左或是向右,并且移动速度是相同的,但是一旦蚂蚁碰到迎面走来的另一只蚂蚁,那么这两只蚂 ...
- HTML标准事件(包含HTML5)
参考菜鸟教程链接:http://www.runoob.com/tags/ref-eventattributes.html
- Quartz中时间表达式的设置-----corn表达式
Quartz中时间表达式的设置-----corn表达式 时间格式: <!-- s m h d m w(?) y(?) -->, 分别相应: 秒>分>小时>日>月 ...
- [iOS] App引导页的简单实现 (Swift 2)
转载请注明出处:http://www.jianshu.com/p/024dd2d6e6e6# 已更新至 Xcode7.2.Swift2.1 在第一次打开App或者App更新后通常用引导页来展示产品特性 ...
- emacs快捷键学习(一)--Linux最强大的编辑器
emacs是一个非常强大的编辑器.经常使用的快捷键总结例如以下: 退出emacs:ctrl+x ctrl+c 移动到下一屏:ctrl+v 移动到上一屏:alt+v 将光标所在行移动到屏幕中间:ctrl ...
- MVC实现类似QQ的网页聊天功能-ajax(下)
此篇文章主要是对MVC实现类似QQ的网页聊天功能(上)的部分代码的解释. 首先说一下显示框的滚动条置底的问题: 结构很简单一个大的div(高度一定.overflow:auto)包含着两个小的div第一 ...
- linux生成随机密码
通常情况下大家生成密码都好困惑,一来复杂程度不够会不安全,复杂程度够了又不能手动随便敲击键盘打出一同字符(但通常情况下这些字符是有规律的), 使用1password 或者 keepass 这种软件生成 ...
- Android常见开源解决方案
原文:http://m.pstatp.com/group/6348269082899497218/?iid=6036708044&app=news_article&tt_from=mo ...