2024年1月4日发(作者:闵幻玉)
CyanogenMOD移植教程
转自秋叶随风Ivan;乐蛙论坛等。
第一章:环境的搭建
一.系统选择和安装
建议使用 ubuntu LTS 10.04 X64
新手朋友推荐Deepin Linux 基于ubuntu定制的,适合新手使用
/download
系统安装教程,以下方法通用于UBUNTU官方版本
U盘安装://Unetbootin
光盘安装://光盘安装
搭建android编译环境:
英文好的请猛击这里:WIKI:/?title=Building_from
_source
1.安装JDK
因为ANDROID大部分东西是java写的,所以首先我们需要安装JDK
打开终端按照如下命令输入或者直接复制粘贴:
编译android 2.3 或者更新的版本请使用 jdk 6
$ sudo add-apt-repository "deb /
lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk如果你需要编译的是2.2以下的版本请使用JDK 5,因为现在大家都是使用 Gingerbread 以上的系统,这里就不介绍jdk5如何安装的了,如果有需要请 度娘 或者
2.安装各种依赖包
64位环境:依然是终端中输入
$ sudo apt-get install git-core gnupg flex bison gperf
build-essential
zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs
x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev
libgl1-mesa-dev g++-multilib mingw32 tofrodos
python-markdown
libxml2-utils xsltproc
如果这些依赖包依然不能解决你的问题,请参考如下:
/wiki/HTC_Hero_(CDMA):_Compile_CyanogenMod_(Linux)
/source/
3.下载代码
打开终端:
在个人目录下面使用的是android 代替我的工程,用cm7代替 CM7的源码 用CM9代替 CM9的源码
如果要更新下载CM7的源码
请输入:
mkdir -p ~/bin
mkdir -p ~/android/cm7
个人目录下的 bin目录是为了保存repo 等更新脚本的
依然再终端输入:
curl
/dl/googlesource/git-repo/repo >
~/bin/repochmod a+x ~/bin/repo
可以把 ~/bin/repo 加入到环境变量里面
终端输入 sudo gedit /etc/environment
在PATH=“” 加入 PATH="/home/ivanhuang/bin:"
ivanhuang为个人目录的名称,也就是计算机登录名
更改结束之后 终端输入 source /etc/environment
就能直接在终端中使用repo 命令了。
然后下一步 开始同步代码:
依然是打开终端输入
cd android/cm7
repo init -u git:///CyanogenMod/ -b
gingerbreadrepo sync -j16
这个是更新CM7的源码 Gingerbread分支的
如果要更新CM9的源码
请输入
mkdir -p android/cm9
repo init -u git:///CyanogenMod/
-b ics
repo sync -j16
Ubuntu 中安装配置JDK
首先从SUN网站下载JDK
然后在shell中执行:
代码:
sudo chmod +x
修改bin文件权限,使其可执行。
然后执行
代码:
将会出现字幕,持续按回车键,直到屏幕出现需要输入yes/no,此时输入yes/y 回车,将会把JDK解压到文件夹,得到jdk1.6.0_17.此时JDK安装完毕。下面进行配置。
执行
代码:
sudo gedit /etc/environment
在environment中修改如下信息:
PATH="........:/home/cy/jdk1.6.0_17/bin"
CLASSPATH=".:/home/cy/jdk1.6.0_17/lib"
JAVA_HOME="/home/cy/jdk1.6.0_17"
由于ubuntu中有默认jdk还需要执行如下工作
执行
代码:
sudo update-alternatives --install /usr/bin/java java
/home/cy/jdk1.6.0_17/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac
/home/cy/jdk1.6.0_17/bin/javac 300
通过这一步将,安装的JDK加入java选单
然后执行。
代码:
sudo update-alternatives --config java
通过这一步设置系统默认的JDK
然后在shell中执行
代码:
java -version
此时显示的系统中的java就是刚刚安装的java
第二章:android源码总体结构
– Makefile (全局的Makefile文件)
– bionic (Bionic含义为仿生,这里面是一些基础的C库源代码)
– bootloader (引导加载器)
build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
– build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
– cts (Android兼容性测试套件标准)
– libcore (核心库相关)
Dalvik虚拟机 针对嵌入式设备优化的Java
Java虚拟机)
– dalvik ( Dalvik虚拟机,针对嵌入式设备优化的Java虚拟机)
– development (创建应用程序所需要的模板和工具)
qcom,
– device (与具体设备相关的一些编译脚本和库,如htc,qcom,samsung等)
– external (Android使用的一些外部的开源框架和库)
(应用程序的框架层,SDK
SDK的接口基本都是在这里实现的)
– frameworks (应用程序的框架层,SDK的接口基本都是在这里实现的)
– hardware (与硬件相关的库)
Linux2.6
– kernel (Linux2.6的内核源代码)
– ndk (本地开发套件--C语言开发套件)
--C
Android的各种应用程序)
– packages (Android的各种应用程序)
– prebuilt (Android在各种平台下编译的预置脚本)
– sdk (SDK及模拟器)
Android的底层的一些库)
– system (Android的底层的一些库)
`– vendor (厂商私有的代码)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
packages/
|– apps (各种应用程序,如联系人、浏览器等)
|– experimental (一些实验性的项目,如错误报告)
|– inputmethods (输入法相关)
|– providers (各种数据源实现,如联系人数据、媒体库等信息)
|– wallpapers (各种壁纸程序)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Android Framework功能介绍
:提供高层的程序模型和基本的运行环境。
t :包含对各种设备上的数据进行访问和发布。
se :通过内容提供者浏览和操作数据库。
cs :底层图形库,包含画布、点、矩形等,可以将其直接绘制到屏幕上。
on :定位和相关服务的类。
:提供一些类管理多种音频、视频的媒体接口。
:提供帮助网络访问的类,超过通常的 .* 接口。
:提供了系统服务、消息传输和 IPC 机制。
:提供 OpenGL 的工具。
er :提供访问 Android 内容提供者的类。
ony :提供与拨打电话相关的 API 交互。
:提供基础的用户界面接口框架。
:涉及工具性的方法,例如时间日期的操作。
:默认浏览器操作接口。
:包含各种 UI 元素(大部分是可见的)在应用程序的布局中使用
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/
|– t
|–
|– core (各种以mk为结尾的文件,它门是编译所需要的Makefile)
|–
|– libs
|– target (包含board和product两个目录,为目标所需要文件)
|– tools (编译过程中主机所需要的工具,一些需要经过编译生成)
其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用。
第三章:如何编译一个支持你设备的recovery
前面已经介绍过CyanogenMod是什么东西,以及环境搭建,android源码的大概框架。地址:/u/1697247850 ,所以这里就不再介绍。
首先要确定你的设备,是否支持刷第三方recovery,或者是否支持fastboot模式,或者是否解锁bootloader,如果你的设备上述都不支持,那么你的机器可能就不能移植第三方系统。如果这样请跳过本文。当你确定你的设备有支持上述所讲的,那么恭喜你,你的设备可以移植第三方系统。
接下来开始干活了,工欲善其事,必先利其器。制作支持你手持设备的recovery。这里以 中兴n760为例子介绍如何编译 支持中兴n760的recovery.
如果你已经下载了cm源码,请往下看,如果你没有下载源码,请按照前面发的教程下载源码.首先在device目录下面建立一个zte目录,这个目录是厂商的名字,例如中兴就是zte 我就建立zte,华为的话 我就建立huawei,然后在zte 目录下面 建立一个目录为
roamer 这个名字如何得到呢,在手机rom里面
system/ 目录下面 搜索 你会发现
= roamer 所以我把设备名称定为 roamer 目
录都新建好了之后,我们来看一下 目录树
system
|-------device
|-------zte
|----roamer
这个就是目录结构,我们在roamer目录下面,新建
recovery_ui.c 这个文件里面是 手机 各按键对应的 按键值,这样写入之后 才能正确选择按键
连接地址到 kernel
让编译工具连接到device_
手持设备 机器CPU GPU 型号参数配置
device_ 信息添加,私有库 xml文件
init文件拷贝 按机器设备device来写 roamer是N760的设备型号
kernel 官方提取,提取 提取可以使用国外高手制作的厨房软件
手机分区表
可有可无
从官方rom提取,比如 n760 里面提取的
文件 这个也是需要这些文件的.
首先我们写 文件
# 这一句的意思的 根目录就是 roamer 目录
看文件名
PRODUCT_MAKEFILES :=
$(LOCAL_DIR)/device_
设备的配置文件
USE_CAMERA_STUB := true
# inherit from the proprietary version
-include vendor/zte/roamer/
TARGET_NO_BOOTLOADER := true
TARGET_BOARD_PLATFORM := unknown
TARGET_CPU_ABI := armeabi
TARGET_BOOTLOADER_BOARD_NAME := roamer //此处一版为device
# 此处为打包 的信息,可以通过厨房 查看到 ,我模糊的记得用厨房解压的时候的选项应该是 打开厨房,选择0 高级,然后选择 20 ,再选择 S 就能看到下面这三个信息了
# dev: size erasesize name
# mtd0: 00600000 00020000 "recovery"
# mtd1: 00400000 00020000 "boot"
# mtd2: 00180000 00020000 "splash"
# mtd3: 00080000 00020000 "misc"
# mtd4: 03980000 00020000 "cache"
# mtd5: 0dc00000 00020000 "system"
# mtd6: 0a280000 00020000 "userdata"
# mtd7: 00100000 00020000 "oem"
# mtd8: 00180000 00020000 "persist"
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00500000
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00600000
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x0dc00000
BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x0a280000
BOARD_FLASH_BLOCK_SIZE := 131072
# 内核路径
TARGET_PREBUILT_KERNEL := device/zte/roamer/kernel
# 一般情况下,手机没有实体返回键,建议选择这一项,有的手机触摸返回键在recovery下面不能使用的,比如小米手机。
BOARD_HAS_NO_SELECT_BUTTON := true# 编译recovery 指定 keymap 文件,看参数 名称就知道了,不懂的可以google翻译
device_ 这个是编译recovery的时候我写的,有些东西可以不要,以后编译rom的时候需要删除重写的
#语言配置文件
$(call
$(SRC_TARGET_DIR)/product/languages_)
# The gps config appropriate for this device gps配置文件
$(call inherit-product, device/common/gps/gps_as_)
# vendor 私有库配置文件
$(call inherit-product-if-exists, vendor/zte/roamer/)
#有些你需要对应用 或者 framework 进行初始化设定值的地方
DEVICE_PACKAGE_OVERLAYS += device/zte/roamer/overlay
#kernel路径选择
ifeq ($(TARGET_PREBUILT_KERNEL),)
LOCAL_KERNEL := device/zte/roamer/kernel
else
LOCAL_KERNEL := $(TARGET_PREBUILT_KERNEL)
endif
inherit-product,
PRODUCT_COPY_FILES +=
$(LOCAL_KERNEL):kernel
$(call inherit-product, build/target/product/)
PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0
PRODUCT_NAME := full_roamer
PRODUCT_DEVICE := roamer
官方提取 自己想个办法,我用厨房提取的
全部写好之后 在源码根目录 用终端输入 . build/
然后输入lunch 选择你的设备
然后输入 make recoveryimage 就可以编译了
编译结束之后,到out/target/product/roamer目录下面可以发现
这个文件
使用fastboot 工具到fastboot 模式下面刷写,刷写命令为
fastboot flash recovery
教程到此结束,有关如何进入fastboot模式 recovery模式,还有fastboot工具使用,请google 或者 baidu
谢谢
2024年1月4日发(作者:闵幻玉)
CyanogenMOD移植教程
转自秋叶随风Ivan;乐蛙论坛等。
第一章:环境的搭建
一.系统选择和安装
建议使用 ubuntu LTS 10.04 X64
新手朋友推荐Deepin Linux 基于ubuntu定制的,适合新手使用
/download
系统安装教程,以下方法通用于UBUNTU官方版本
U盘安装://Unetbootin
光盘安装://光盘安装
搭建android编译环境:
英文好的请猛击这里:WIKI:/?title=Building_from
_source
1.安装JDK
因为ANDROID大部分东西是java写的,所以首先我们需要安装JDK
打开终端按照如下命令输入或者直接复制粘贴:
编译android 2.3 或者更新的版本请使用 jdk 6
$ sudo add-apt-repository "deb /
lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk如果你需要编译的是2.2以下的版本请使用JDK 5,因为现在大家都是使用 Gingerbread 以上的系统,这里就不介绍jdk5如何安装的了,如果有需要请 度娘 或者
2.安装各种依赖包
64位环境:依然是终端中输入
$ sudo apt-get install git-core gnupg flex bison gperf
build-essential
zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs
x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev
libgl1-mesa-dev g++-multilib mingw32 tofrodos
python-markdown
libxml2-utils xsltproc
如果这些依赖包依然不能解决你的问题,请参考如下:
/wiki/HTC_Hero_(CDMA):_Compile_CyanogenMod_(Linux)
/source/
3.下载代码
打开终端:
在个人目录下面使用的是android 代替我的工程,用cm7代替 CM7的源码 用CM9代替 CM9的源码
如果要更新下载CM7的源码
请输入:
mkdir -p ~/bin
mkdir -p ~/android/cm7
个人目录下的 bin目录是为了保存repo 等更新脚本的
依然再终端输入:
curl
/dl/googlesource/git-repo/repo >
~/bin/repochmod a+x ~/bin/repo
可以把 ~/bin/repo 加入到环境变量里面
终端输入 sudo gedit /etc/environment
在PATH=“” 加入 PATH="/home/ivanhuang/bin:"
ivanhuang为个人目录的名称,也就是计算机登录名
更改结束之后 终端输入 source /etc/environment
就能直接在终端中使用repo 命令了。
然后下一步 开始同步代码:
依然是打开终端输入
cd android/cm7
repo init -u git:///CyanogenMod/ -b
gingerbreadrepo sync -j16
这个是更新CM7的源码 Gingerbread分支的
如果要更新CM9的源码
请输入
mkdir -p android/cm9
repo init -u git:///CyanogenMod/
-b ics
repo sync -j16
Ubuntu 中安装配置JDK
首先从SUN网站下载JDK
然后在shell中执行:
代码:
sudo chmod +x
修改bin文件权限,使其可执行。
然后执行
代码:
将会出现字幕,持续按回车键,直到屏幕出现需要输入yes/no,此时输入yes/y 回车,将会把JDK解压到文件夹,得到jdk1.6.0_17.此时JDK安装完毕。下面进行配置。
执行
代码:
sudo gedit /etc/environment
在environment中修改如下信息:
PATH="........:/home/cy/jdk1.6.0_17/bin"
CLASSPATH=".:/home/cy/jdk1.6.0_17/lib"
JAVA_HOME="/home/cy/jdk1.6.0_17"
由于ubuntu中有默认jdk还需要执行如下工作
执行
代码:
sudo update-alternatives --install /usr/bin/java java
/home/cy/jdk1.6.0_17/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac
/home/cy/jdk1.6.0_17/bin/javac 300
通过这一步将,安装的JDK加入java选单
然后执行。
代码:
sudo update-alternatives --config java
通过这一步设置系统默认的JDK
然后在shell中执行
代码:
java -version
此时显示的系统中的java就是刚刚安装的java
第二章:android源码总体结构
– Makefile (全局的Makefile文件)
– bionic (Bionic含义为仿生,这里面是一些基础的C库源代码)
– bootloader (引导加载器)
build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
– build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
– cts (Android兼容性测试套件标准)
– libcore (核心库相关)
Dalvik虚拟机 针对嵌入式设备优化的Java
Java虚拟机)
– dalvik ( Dalvik虚拟机,针对嵌入式设备优化的Java虚拟机)
– development (创建应用程序所需要的模板和工具)
qcom,
– device (与具体设备相关的一些编译脚本和库,如htc,qcom,samsung等)
– external (Android使用的一些外部的开源框架和库)
(应用程序的框架层,SDK
SDK的接口基本都是在这里实现的)
– frameworks (应用程序的框架层,SDK的接口基本都是在这里实现的)
– hardware (与硬件相关的库)
Linux2.6
– kernel (Linux2.6的内核源代码)
– ndk (本地开发套件--C语言开发套件)
--C
Android的各种应用程序)
– packages (Android的各种应用程序)
– prebuilt (Android在各种平台下编译的预置脚本)
– sdk (SDK及模拟器)
Android的底层的一些库)
– system (Android的底层的一些库)
`– vendor (厂商私有的代码)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
packages/
|– apps (各种应用程序,如联系人、浏览器等)
|– experimental (一些实验性的项目,如错误报告)
|– inputmethods (输入法相关)
|– providers (各种数据源实现,如联系人数据、媒体库等信息)
|– wallpapers (各种壁纸程序)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Android Framework功能介绍
:提供高层的程序模型和基本的运行环境。
t :包含对各种设备上的数据进行访问和发布。
se :通过内容提供者浏览和操作数据库。
cs :底层图形库,包含画布、点、矩形等,可以将其直接绘制到屏幕上。
on :定位和相关服务的类。
:提供一些类管理多种音频、视频的媒体接口。
:提供帮助网络访问的类,超过通常的 .* 接口。
:提供了系统服务、消息传输和 IPC 机制。
:提供 OpenGL 的工具。
er :提供访问 Android 内容提供者的类。
ony :提供与拨打电话相关的 API 交互。
:提供基础的用户界面接口框架。
:涉及工具性的方法,例如时间日期的操作。
:默认浏览器操作接口。
:包含各种 UI 元素(大部分是可见的)在应用程序的布局中使用
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/
|– t
|–
|– core (各种以mk为结尾的文件,它门是编译所需要的Makefile)
|–
|– libs
|– target (包含board和product两个目录,为目标所需要文件)
|– tools (编译过程中主机所需要的工具,一些需要经过编译生成)
其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用。
第三章:如何编译一个支持你设备的recovery
前面已经介绍过CyanogenMod是什么东西,以及环境搭建,android源码的大概框架。地址:/u/1697247850 ,所以这里就不再介绍。
首先要确定你的设备,是否支持刷第三方recovery,或者是否支持fastboot模式,或者是否解锁bootloader,如果你的设备上述都不支持,那么你的机器可能就不能移植第三方系统。如果这样请跳过本文。当你确定你的设备有支持上述所讲的,那么恭喜你,你的设备可以移植第三方系统。
接下来开始干活了,工欲善其事,必先利其器。制作支持你手持设备的recovery。这里以 中兴n760为例子介绍如何编译 支持中兴n760的recovery.
如果你已经下载了cm源码,请往下看,如果你没有下载源码,请按照前面发的教程下载源码.首先在device目录下面建立一个zte目录,这个目录是厂商的名字,例如中兴就是zte 我就建立zte,华为的话 我就建立huawei,然后在zte 目录下面 建立一个目录为
roamer 这个名字如何得到呢,在手机rom里面
system/ 目录下面 搜索 你会发现
= roamer 所以我把设备名称定为 roamer 目
录都新建好了之后,我们来看一下 目录树
system
|-------device
|-------zte
|----roamer
这个就是目录结构,我们在roamer目录下面,新建
recovery_ui.c 这个文件里面是 手机 各按键对应的 按键值,这样写入之后 才能正确选择按键
连接地址到 kernel
让编译工具连接到device_
手持设备 机器CPU GPU 型号参数配置
device_ 信息添加,私有库 xml文件
init文件拷贝 按机器设备device来写 roamer是N760的设备型号
kernel 官方提取,提取 提取可以使用国外高手制作的厨房软件
手机分区表
可有可无
从官方rom提取,比如 n760 里面提取的
文件 这个也是需要这些文件的.
首先我们写 文件
# 这一句的意思的 根目录就是 roamer 目录
看文件名
PRODUCT_MAKEFILES :=
$(LOCAL_DIR)/device_
设备的配置文件
USE_CAMERA_STUB := true
# inherit from the proprietary version
-include vendor/zte/roamer/
TARGET_NO_BOOTLOADER := true
TARGET_BOARD_PLATFORM := unknown
TARGET_CPU_ABI := armeabi
TARGET_BOOTLOADER_BOARD_NAME := roamer //此处一版为device
# 此处为打包 的信息,可以通过厨房 查看到 ,我模糊的记得用厨房解压的时候的选项应该是 打开厨房,选择0 高级,然后选择 20 ,再选择 S 就能看到下面这三个信息了
# dev: size erasesize name
# mtd0: 00600000 00020000 "recovery"
# mtd1: 00400000 00020000 "boot"
# mtd2: 00180000 00020000 "splash"
# mtd3: 00080000 00020000 "misc"
# mtd4: 03980000 00020000 "cache"
# mtd5: 0dc00000 00020000 "system"
# mtd6: 0a280000 00020000 "userdata"
# mtd7: 00100000 00020000 "oem"
# mtd8: 00180000 00020000 "persist"
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00500000
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00600000
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x0dc00000
BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x0a280000
BOARD_FLASH_BLOCK_SIZE := 131072
# 内核路径
TARGET_PREBUILT_KERNEL := device/zte/roamer/kernel
# 一般情况下,手机没有实体返回键,建议选择这一项,有的手机触摸返回键在recovery下面不能使用的,比如小米手机。
BOARD_HAS_NO_SELECT_BUTTON := true# 编译recovery 指定 keymap 文件,看参数 名称就知道了,不懂的可以google翻译
device_ 这个是编译recovery的时候我写的,有些东西可以不要,以后编译rom的时候需要删除重写的
#语言配置文件
$(call
$(SRC_TARGET_DIR)/product/languages_)
# The gps config appropriate for this device gps配置文件
$(call inherit-product, device/common/gps/gps_as_)
# vendor 私有库配置文件
$(call inherit-product-if-exists, vendor/zte/roamer/)
#有些你需要对应用 或者 framework 进行初始化设定值的地方
DEVICE_PACKAGE_OVERLAYS += device/zte/roamer/overlay
#kernel路径选择
ifeq ($(TARGET_PREBUILT_KERNEL),)
LOCAL_KERNEL := device/zte/roamer/kernel
else
LOCAL_KERNEL := $(TARGET_PREBUILT_KERNEL)
endif
inherit-product,
PRODUCT_COPY_FILES +=
$(LOCAL_KERNEL):kernel
$(call inherit-product, build/target/product/)
PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0
PRODUCT_NAME := full_roamer
PRODUCT_DEVICE := roamer
官方提取 自己想个办法,我用厨房提取的
全部写好之后 在源码根目录 用终端输入 . build/
然后输入lunch 选择你的设备
然后输入 make recoveryimage 就可以编译了
编译结束之后,到out/target/product/roamer目录下面可以发现
这个文件
使用fastboot 工具到fastboot 模式下面刷写,刷写命令为
fastboot flash recovery
教程到此结束,有关如何进入fastboot模式 recovery模式,还有fastboot工具使用,请google 或者 baidu
谢谢