一步步教你如何源码编译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路径会和他们保持一

致,一个可能的输出是

[email protected]:/ # 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 目录

[email protected]:/ # 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命令查看这两个值:

[email protected]:/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

时间: 2024-10-13 18:01:14

一步步教你如何源码编译Recovery的相关文章

Linux程序包管理之yum仓库、源码编译安装

CentOS:yum,dnf URL:ftp://172.16.0.1/pub yum是C/S架构,是rpm的前端工具,依赖于rpm存在的: 1.本地要有yun程序: 2.本地要有配置文件(配置远程服务器yum仓库或本地服务器yum仓库): 3.要有存在的文件服务器(程序包仓库即yum仓库).(也可以在本地配置服务器yum仓库): yum支持的服务器有两种:一种是ftp服务器,第二种是http服务器: yum工作简述: yum是客户端,也认为是自我独立管理的组件,需要联系远程的仓库,从仓库中下载

【Linux探索之旅】第四部分第五课:源码编译,安装便利

内容简介 1.第四部分第五课:源码编译,安装便利 2.第四部分第六课:DNS和域名,一探究竟 源码编译,安装便利 这一课相对轻松,毕竟刚跨年(2015-2016)么,新年怎么能让大家一个头两个大呢~ 小编怎么可能这么坏呢?小编是这样的人吗?(是啊 -_-#). 之前的课程([Linux探索之旅]第二部分第七课:软件安装,如虎添翼)中,我们已经了解过Ubuntu这个Linux的发行版下安装软件是何等方便,用apt-get这个工具可以轻松搞定.这种方式可以让我们下载并安装大部分的软件. 其他Linu

Android源码编译过程

http://my.oschina.net/zhoulc/blog/170698 http://jingyan.baidu.com/article/c85b7a641200e0003bac95a3.html 注意: 1,不要使用64位ubuntu 2,务必分配4g或者以上的swap空间 系统定制基本流程:获取源码 --> 修改源码(包括修改和裁剪)--> 编译修改后的源码 --> 得到目标系统文件 --> 移植系统 --> 测试成功 --> 完成 一,源码下载 谷歌搜索

linux源码编译安装OpenCV

为了尽可能保证OpenCV的特性,使用OpenCV源码编译安装在linux上.先从安装其依赖项开始,以ubuntu 14.04.X为例讲解在Linux上源码编译安装OpenCV,其他linux版本可以类比安装.此文针对,有一点Linux常识(会使用终端)的读者. 源代码准备 如果不想在安装过程中,一步步的下载.编译.安装,可以先一次性下载完需要用到的源代码. X264: ftp://ftp.videolan.org/pub/videolan/x264/snapshots/ FFMPEG: htt

源码编译MYSQL遇到的几个小问题

闲来无聊,顺手练习一下好久没碰过的MYSQL,于是决定源码编译安装MYSQL-5.7.11,练习不打紧,出了好多问题,于是乎赶紧在这里总结一下: 先下载的编译器:cmake-2.8.12.2-4.el6.x86_64.rpm   MYSQL源码包:mysql-boost-5.7.11.tar.gz 接下来进行配置,编译,安装三部曲:(区别是我把数据目录单独放在了另外一张虚拟硬盘上-DMYSQL_DATADIR=/mydata/data   -DMYSQL_UNIX_DATA=/mydata/da

马哥linux学习笔记:源码编译安装

由于rpm包在作者制作封装的时候已经把程序的一些特性固定了,如果我们根据自己的需求,需要运用程序的一些没有普适性相关特性,就需要下载程序的源码手动编译安装了,这里只是简单的介绍一下C代码的程序包编译安装方法. 为了能更直观的看到源码编译安装的过程,我演示一下在centos7.2环境中编译安装httpd2.2: 首先,编译的前提是得有称手的工具及环境了,编译c源代码就需要用到开发工具,make,gcc了,环境就需要开发库跟头文件了,如果系统中没有这些,就需要yum安装了. 这里我运行yum gro

烂泥:mysql5.0数据库源码编译安装

本文首发于烂泥行天下. 本次实验的mysql.OS相关信息如下: Mysql:5.0.96 OS:centos 32 bit 最近公司要上新的业务,指明数据库使用的是mysql5.0版本.如果是使用rpm包安装的话,那就很简单了.直接使用yum安装即可,命令如下: yum –y install mysql mysql-server Yum方式安装完毕后,直接启动mysql数据库服务即可.如下图: 这样基本上就可以了. 但是这样安装mysql数据库,没有进行定制.比如mysql数据库的数据文件存储

ubuntu 源码编译安装最新的vim 8.0

为什么要源码编译安装VIM? 因为我要安装ycm,ycm要求vim版本为8.0 教程步骤: 1, 核对系统版本 2, 删除系统自带的vim 3, 编译安装vim 4, 检验vim的安装 1,核对系统版本 [email protected]:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: tr

详解LAMP源码编译安装

实战:LAMP源码编译安装 家住海边喜欢浪:zhang789.blog.51cto.com 目录 详解LAMP源码编译安装 LAMP简介 一.准备工作 二.编译安装 Apache 三.编译安装 MySQL 四.编译安装 PHP 测试LAMP搭建开源数据web管理程序phpMyadmin 详解LAMP源码编译安装 LAMP简介 LAMP是当下非常流行的一套Web架构,我们可以在GNU/Linux下通过其他人打包的程序包来进行安装; 但是在生产环境中,很多时候都需要我们自己定制安装AMP,编译安装L