diff --git a/chapter-02/README.md b/chapter-02/README.md index e2a27d4..f88e2a3 100644 --- a/chapter-02/README.md +++ b/chapter-02/README.md @@ -1,36 +1,36 @@ # 第二章 系统开发环境与工具 -​ 经过第一章的学习,对AOSP定制进行简略的介绍后,相信此时,系统定制开发这个领域,在读者的心中会有大致的了解。简单来说,所谓的系统定制,相当于在一款成熟的产品上进行二次开发。和常见的软件项目的二次开发的学习步骤类似,不会有太大的出入,细节的区别就在于,Android源码相比其他软件项目要更加庞大复杂,修改编译以及测试系统所花费的时间周期更长。 +​ 经过第一章的学习,对`AOSP`定制进行简略的介绍后,相信此时,系统定制开发这个领域,在读者的心中会有大致的了解。简单来说,所谓的系统定制,相当于在一款成熟的产品上进行二次开发。和常见的软件项目的二次开发的学习步骤类似,不会有太大的出入,细节的区别就在于,`Android`源码相比其他软件项目要更加庞大复杂,修改编译以及测试系统所花费的时间周期更长。 -​ 尽管Android源码结构非常庞大,但对于初学者,并不需要完整的吃透所有代码。重点的是,掌握系统代码分析的思路,阅读理解工程的整体结构,了解Android系统框架的运行原理,结合思考与实践,达到自定义定制的目标。 +​ 尽管`Android`源码结构非常庞大,但对于初学者,并不需要完整的吃透所有代码。重点的是,掌握系统代码分析的思路,阅读理解工程的整体结构,了解`Android`系统框架的运行原理,结合思考与实践,达到自定义定制的目标。 -​ 学习的流程需要循序渐进,有的放矢,以免迷失在纷繁复杂的代码海洋中。通常,第一步需要了解如何将整个系统项目成功编译并刷机。这一章将详细讲解在各种不同的环境下,应该如何编译Android源码,并将其刷入手机中。 +​ 学习的流程需要循序渐进,有的放矢,以免迷失在纷繁复杂的代码海洋中。通常,第一步需要了解如何将整个系统项目成功编译并刷机。这一章将详细讲解在各种不同的环境下,应该如何编译`Android`源码,并将其刷入手机中。 ## 2.1 环境准备 -安卓系统在版本10之前,是支持macOS系统上编译AOSP代码的。在新版本系统的演进过程中,安卓官方已经放弃在macOS系统平台上做AOSP开发的支持,官方开发指导环境采用了Linux上比较流行的Ubuntu发行版本。 +​ 安卓系统在版本`10`之前,是支持`macOS`系统上编译`AOSP`代码的。在新版本系统的演进过程中,安卓官方已经放弃在`macOS`系统平台上做`AOSP`开发的支持,官方开发指导环境采用了`Linux`上比较流行的`Ubuntu`发行版本。 -在实际的开发过程中,可以使用Windows系统下的WSL2或Docker来构建一个Ubuntu系统运行环境,同样可以完成AOSP编译与开发工作。 +在实际的开发过程中,可以使用`Windows`系统下的`WSL2`或`Docker`来构建一个`Ubuntu`系统运行环境,同样可以完成`AOSP`编译与开发工作。 -这一节将会介绍在Windows系统与Linux系统上,如何完成环境准备工作。 +这一节将会介绍在`Windows`系统与`Linux`系统上,如何完成环境准备工作。 ### 2.1.1 Windows -​ 由于在Windows中缺少了各种底层编译器与开发库的支持,一般情况下,开发人员不会直接在Windows环境中编译,而是选择在Windows中创建一个Linux的虚拟环境,然后在虚拟环境中安装编译所需要用到的底层依赖。在Windows系统上部署Ubuntu虚拟环境有多种可选方案,例如Docker、WSL(Windows Subsystem for Linux)、Vmware虚拟机,QEMU、HyperV虚拟机平台等等。 +​ 由于在`Windows`中缺少了各种底层编译器与开发库的支持,一般情况下,开发人员不会直接在`Windows`环境中编译,而是选择在`Windows`中创建一个`Linux`的虚拟环境,然后在虚拟环境中安装编译所需要用到的底层依赖。在`Windows`系统上部署`Ubuntu`虚拟环境有多种可选方案,例如`Docker、WSL(Windows Subsystem for Linux)、Vmware`虚拟机,`QEMU、HyperV`虚拟机平台等等。 -​ 几种方案经过编译对比测试,发现Docker在Windows系统上的体验并不怎么好,主要体现在编译这类大型项目时,需要较大的磁盘存储空间,选择外挂磁盘映射时,编译时IO性能较弱,而选择创建虚拟磁盘时,对宿主机的开机耗时明显变高。这里不太建议在Windows下采用Docker来编译源码。 +​ 几种方案经过编译对比测试,发现`Docker`在`Windows`系统上的体验并不怎么好,主要体现在编译这类大型项目时,需要较大的磁盘存储空间,选择外挂磁盘映射时,编译时`IO`性能较弱,而选择创建虚拟磁盘时,对宿主机的开机耗时明显变高。这里不太建议在`Windows`下采用`Docker`来编译源码。 -​ WSL是Windows下内置的Linux子系统,最新的版本号为2,通常将其称为WSL2。它是一个非常轻量化的Linux系统,让那些想在Windows中编译与运行Linux程序的开发人员爱不释手。安装好WSL2后,只要在终端中输入一个`wsl`命令就可以启动环境。使用起来的感觉就好似直接使用命令行一样。并且编译性能相比`Vmware`这类虚拟机要更加高效。在我的笔记本环境中,WSL2完整编译的耗时为130分钟,而`Vmware`虚拟机的耗时是170分钟,这是因为WSL2采用直通计算机硬件,IO性能有着较为显著的提升。 +​ `WSL`是`Windows`下内置的`Linux`子系统,最新的版本号为`2`,通常将其称为`WSL2`。它是一个非常轻量化的`Linux`系统,让那些想在`Windows`中编译与运行`Linux`程序的开发人员爱不释手。安装好`WSL2`后,只要在终端中输入一个`wsl`命令就可以启动环境。使用起来的感觉就好似直接使用命令行一样。并且编译性能相比`Vmware`这类虚拟机要更加高效。编译测试后得到记录,`WSL2`完整编译的耗时为130分钟,而`Vmware`虚拟机的耗时是170分钟,这是因为`WSL2`采用直通计算机硬件,`IO`性能有着较为显著的提升。 -​ 如果你的系统上Windows10,那么你需要先查询当前系统版本,必须是18917或更高的版本才支持WSL2。在cmd命令行中输入`winver`命令查看当前系统版本号。 +​ 如果你的系统上`Windows10`,那么你需要先查询当前系统版本,必须是18917或更高的版本才支持`WSL2`。在`cmd`命令行中输入`winver`命令查看当前系统版本号。 ![image-20230102183339463](.\images\image-20230102183339463.png) -​ 由于是系统自带的,所以安装起来非常方便,可以直接在控制面版->程序->启动或关闭Window功能中开启支持即可,如下图 +​ 由于是系统自带的,所以安装起来非常方便,可以直接在控制面版->程序->启动或关闭`Window`功能中开启支持即可,如下图 ![img](.\images\69ba546fd55c4fea8ef9b5d55a9bd354.png) -​ 或者是采用命令的方式开启虚拟机平台和Linux子系统,使用管理员权限启动` `。 +​ 或者是采用命令的方式开启虚拟机平台和`Linux`子系统,使用管理员权限启动。 ![image-20230102183708998](.\images\image-20230102183708998.png) @@ -43,12 +43,12 @@ Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux ``` -​ 启动完成这些特性后,重新启动计算机,然后,就可以开始安装一个`Ubuntu`系统了。打开Microsoft Store应用商店搜索`Ubuntu`系统,然后选择自己需要的版本即可,例如我安装的是22.04版本,如下图。 +​ 启动完成这些特性后,重新启动计算机,然后,就可以开始安装一个`Ubuntu`系统了。打开`Microsoft Store`应用商店搜索`Ubuntu`系统,然后选择自己需要的版本即可,例如我安装的是22.04版本,如下图。 ![image-20230102184626538](.\images\image-20230102184626538.png) -​ 成功获取`Ubuntu`系统后,从应用中启动系统即开始正式安装。安装过程只需要设置好用户名与密码即可。完成后会进行一个shell环境供用户输入。 -​ 需要注意的是,应用商店默认会将WSL安装在C盘中,而编译系统会占用相当大的空间,如果你的系统盘空间不够,需要做一个迁移操作,将子系统迁移到其他硬盘中。操作方法是:桌面任意位置右键选择终端,在打开的终端环境中自毁长城下面的命令,查询当前的子系统名称。 +​ 成功获取`Ubuntu`系统后,从应用中启动系统即开始正式安装。安装过程只需要设置好用户名与密码即可。完成后会进行一个`shell`环境供用户输入。 +​ 需要注意的是,应用商店默认会将`WSL`安装在`C`盘中,而编译系统会占用相当大的空间,如果你的系统盘空间不够,需要做一个迁移操作,将子系统迁移到其他硬盘中。操作方法是:桌面任意位置右键选择终端,在打开的终端环境中自毁长城下面的命令,查询当前的子系统名称。 ``` wsl -l -v @@ -68,15 +68,15 @@ wsl --unregister ubuntu22 wsl --import ubuntu22 E:\wsl2\ubuntu22_wsl E:\wsl2\ubuntu22.tar ``` -​ 现在,再次执行`wsl`命令,即可进入子系统的shell环境。 +​ 现在,再次执行`wsl`命令,即可进入子系统的`shell`环境。 -​ 使用WSL2主要是在于轻量级和更优的高性能,一般都是命令模式的Linux,图形界面的程序可以通过安装一些依赖来解决,但这不是WSL2的强项。使用WSL2搭建开发环境时,使用远程开发模式不失为一种优雅的技术方案,典型的有使用`vscode`配合wsl插件,可以快速的远程访问WSL2环境上的代码与程序,另外,WSL2安装ssh服务后,`vscode`配合使用remote ssh插件也可以进行开发环境的搭建。 +​ 使用`WSL2`主要是在于轻量级和更优的高性能,一般都是命令模式的`Linux`,图形界面的程序可以通过安装一些依赖来解决,但这不是`WSL2`的强项。使用`WSL2`搭建开发环境时,使用远程开发模式不失为一种优雅的技术方案,典型的有使用`vscode`配合`wsl`插件,可以快速的远程访问`WSL2`环境上的代码与程序,另外,`WSL2`安装`ssh`服务后,`vscode`配合使用`remote ssh`插件也可以进行开发环境的搭建。 -​ 如果需要完整的Linux系统环境,使用`VMware`虚拟机会更加的合适。步骤也非常简单,流程如下。 +​ 如果需要完整的`Linux`系统环境,使用`VMware`虚拟机会更加的合适。步骤也非常简单,流程如下。 -​ 1、下载并安装`VMware`虚拟机,然后下载Ubuntu22.04系统ISO镜像文件。 +​ 1、下载并安装`VMware`虚拟机,然后下载`Ubuntu22.04`系统`ISO`镜像文件。 -​ 2、VWware创建虚拟机,选择指定镜像 +​ 2、`VWware`创建虚拟机,选择指定镜像 ![image-20230102194041709](.\images\image-20230102194041709.png) @@ -84,35 +84,33 @@ wsl --import ubuntu22 E:\wsl2\ubuntu22_wsl E:\wsl2\ubuntu22.tar ![image-20230102194243774](.\images\image-20230102194243774.png) -4、选择虚拟机保存位置,这里不要保存在C盘,记得磁盘要有至少300G的空间 +4、选择虚拟机保存位置,这里不要保存在`C`盘,记得磁盘要有至少`300G`的空间 ![image-20230102194331141](.\images\image-20230102194331141.png) -5、虚拟硬件CPU核心根据你的电脑配置进行调整,尽量多分点给虚拟机。 +5、虚拟硬件`CPU`核心根据你的电脑配置进行调整,尽量多分点给虚拟机。 ![image-20230102194543812](.\images\image-20230102194543812.png) -6、虚拟内存分配,至少保证16G以上的内存,否则可能会碰到内存不足编译失败的情况。 +6、虚拟内存分配,至少保证`16G`以上的内存,否则可能会碰到内存不足编译失败的情况。 ![image-20230102194722427](.\images\image-20230102194722427.png) -7、虚拟硬盘分配,这里至少分配500G的空间,考虑到性能,我选择的是单文件吗,这里如果选择立即分配所有磁盘空间,能提高一定的性能。如果你的电脑配置不是很高,建议你选择立即分配。 +7、虚拟硬盘分配,这里至少分配`500G`的空间,考虑到性能,我选择的是单文件吗,这里如果选择立即分配所有磁盘空间,能提高一定的性能。如果你的电脑配置不是很高,建议你选择立即分配。 ![image-20230102194952517](.\images\image-20230102194952517.png) -​ 虚拟机开机后,将默认进入Ubuntu安装界面,按照提示进行选择语言,区域等待安装完成即可。 +​ 虚拟机开机后,将默认进入`Ubuntu`安装界面,按照提示进行选择语言,区域等待安装完成即可。 ### 2.1.2 Linux -​ Linux系统的选择非常多,本书中选择最新的Ubuntu 22.04 LTS稳定版。这里假定读者已经在自己的硬件上安装好了系统环境(安装方法与Vmware安装系统的操作流程类似)。 +​ `Linux`系统的选择非常多,本书中选择最新的`Ubuntu 22.04 LTS`稳定版。这里假定读者已经在自己的硬件上安装好了系统环境(安装方法与`Vmware`安装系统的操作流程类似)。 首先,安装必备的开发工具。 -1、Android Studio下载并安装,下载地址:`https://developer.android.google.cn/studio/` - -2、Clion下载并安装,下载地址:`https://www.jetbrains.com/zh-cn/clion/` - -3、vscode下载并安装,下载地址:`https://code.visualstudio.com/` +1. `Android Studio`下载并安装,下载地址:`https://developer.android.google.cn/studio/` +2. `Clion`下载并安装,下载地址:`https://www.jetbrains.com/zh-cn/clion/` +3. `vscode`下载并安装,下载地址:`https://code.visualstudio.com/` ​ 然后,执行下面的命令配置好`python`与`pip`。 @@ -133,37 +131,35 @@ pip install pytest ``` -到这里,Ubuntu系统上的AOSP编译开发环境就补步准备好了。 +​ 到这里,`Ubuntu`系统上的`AOSP`编译开发环境就初步准备好了。 ### 2.2 源码拉取与同步 -​ 在开始拉取代码前,首选需要了解自己需要编译的AOSP分支版本,可以参考官网对版本的说明链接。https://source.android.com/docs/setup/about/build-numbers?hl=zh-cn +​ 在开始拉取代码前,首选需要了解自己需要编译的`AOSP`分支版本,可以参考官网对版本的说明链接。https://source.android.com/docs/setup/about/build-numbers?hl=zh-cn #### 2.2.1 分支选择策略 -​ 根据需求,比如想要在Android10的基础上进行二次开发,那么就找到对应的版本描述,根据下图,可以看到各个版本号关联的代码分支,Android版本,支持哪些设备。 +​ 根据需求,比如想要在`Android10`的基础上进行二次开发,那么就找到对应的版本描述,根据下图,可以看到各个版本号关联的代码分支,`Android`版本,支持哪些设备。 ![image-20230103220519836](.\images\image-20230103220519836.png) ​ 这么多版本,需要选一个最适合的版本,选择策略如下: -1、优先选择与你的测试机兼容的版本。 +1. 优先选择与你的测试机兼容的版本。 +2. 除了支持你的这个设备外,还支持更多设备的版本。 +3. 满足上面两个条件的最高分支版本,即优先最新的代码分支。 -2、除了支持你的这个设备外,还支持更多设备的版本。 - -3、满足上面两个条件的最高分支版本,即优先最新的代码分支。 - -如果选择使用虚拟机,那么选择支持版本最多的分支即可。这里我的测试设备是pixel 3,所以选择了版本`SP1A.210812.016.A1`,对应的分支代码是`android-12.0.0_r3`,如下图。 +如果选择使用虚拟机,那么选择支持版本最多的分支即可。这里我的测试设备是`pixel 3`,所以选择了版本`SP1A.210812.016.A1`,对应的分支代码是`android-12.0.0_r3`,如下图。 ![image-20230103220838404](.\images\image-20230103220838404.png) #### 2.2.2 repo配置 -​ AOSP官方使用`repo`管理项目。`repo`是一个以`git`为基础包装的代码版本管理工具,内部是由`python`脚本构成的,对`git`命令进行包装,方便管理大型的项目。 +​ `AOSP`官方使用`repo`管理项目。`repo`是一个以`git`为基础包装的代码版本管理工具,内部是由`python`脚本构成的,对`git`命令进行包装,方便管理大型的项目。 -​ repo配置前,需要先安装与配置好`git`。执行如下命令: +​ `repo`配置前,需要先安装与配置好`git`。执行如下命令: ``` // 安装git @@ -174,7 +170,7 @@ git config --global user.email "xxxx@qq.com" git config --global user.name "xxxx" ``` -​ 接着,下载配置repo。执行: +​ 接着,下载配置`repo`。执行: ``` // 创建bin目录,并加入PATH @@ -211,7 +207,7 @@ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-12.0 repo sync -c -j8 ``` -​ 同步代码使用`repo sync -c -j8`的命令,其中,`-c`表示只同步当前分支代码,可以提高同步速度,而`-j`是设置同步使用的线程数,这里我使用了8个线程,并不是线程越多速度越快,而是根据cpu的核心数,使用最合理的线程数才能达到最佳的并发效果。 +​ 同步代码使用`repo sync -c -j8`的命令,其中,`-c`表示只同步当前分支代码,可以提高同步速度,而`-j`是设置同步使用的线程数,这里我使用了8个线程,并不是线程越多速度越快,而是根据`cpu`的核心数,使用最合理的线程数才能达到最佳的并发效果。 ``` // 查看可用cpu数量,我的环境显示为16 @@ -244,7 +240,7 @@ sudo apt-get install -y git-core gnupg flex bison build-essential \ #### 2.3.2 系统编译 -​ 注意:编译AOSP需要大量的磁盘空间,通常300G的空间足够存放代码与编译输出的结果。如果你希望将输出的结果存放在其它目录。这一点通过设置`OUT_DIR`环境变量来调整编译结果的输出目录。如下所示, +​ 注意:编译`AOSP`需要大量的磁盘空间,通常`300G`的空间足够存放代码与编译输出的结果。如果你希望将输出的结果存放在其它目录。这一点通过设置`OUT_DIR`环境变量来调整编译结果的输出目录。如下所示, ``` vim ./build/envsetup.sh @@ -256,11 +252,11 @@ export OUT_DIR=~/android_src/aosp12_out ![image-20230103232052738](.\images\image-20230103232052738.png) -​ 第一个文件`Vendor`是用来存储厂商特定的文件,比如设备驱动程序。Android驱动会根据提供的这些设备驱动来正确的加载硬件。这个文件通常由设备厂商提供。如果你成功编译Android后,输出目录缺少vendor.img文件,那么你就需要检查下是否忘记导入对应型号的设备驱动了。 +​ 第一个文件`Vendor`是用来存储厂商特定的文件,比如设备驱动程序。`Android`驱动会根据提供的这些设备驱动来正确的加载硬件。这个文件通常由设备厂商提供。如果你成功编译`Android`后,输出目录缺少`vendor.img`文件,那么你就需要检查下是否忘记导入对应型号的设备驱动了。 -​ 第二个文件是高通提供的相关设备驱动程序,比如GPS,摄像头,传感器等设备的闭源二进制文件。 +​ 第二个文件是高通提供的相关设备驱动程序,比如`GPS`,摄像头,传感器等设备的闭源二进制文件。 -​ 点击`Link`下载,然后将下载的文件拷贝到Android源码根目录下。然后解压,并导出相关驱动文件。 +​ 点击`Link`下载,然后将下载的文件拷贝到`Android`源码根目录下。然后解压,并导出相关驱动文件。 ``` // 解压驱动文件 @@ -307,9 +303,9 @@ make -j$(nproc --all) ​ 同一个代号的编译有三种编译版本选择。分别如下: -1、`aosp_blueline-user` 为用户版本,一般是默认的编译版本。主要用于发布版本,这种版本编译的环境会默认开启大多数的安全机制,比如`ro.secure`值为1,`ro.debuggable`值为0,,需要自行用第三方工具获取root权限。厂商设备出厂时,设备通常会编译为user版本。 +1、`aosp_blueline-user` 为用户版本,一般是默认的编译版本。主要用于发布版本,这种版本编译的环境会默认开启大多数的安全机制,比如`ro.secure`值为1,`ro.debuggable`值为0,,需要自行用第三方工具获取`root`权限。厂商设备出厂时,设备通常会编译为user版本。 -2、`aosp_blueline-userdebug` 为用户调试版本,通常用于测试和调试Android系统,会启动一些调试工具,例如默认开启`adb`调试,`ro.debuggable`值为1,系统自带root权限等。 +2、`aosp_blueline-userdebug` 为用户调试版本,通常用于测试和调试`Android`系统,会启动一些调试工具,例如默认开启`adb`调试,`ro.debuggable`值为1,系统自带`root`权限等。 3、`aosp_blueline-eng` 为工程版本,同样也是用于测试和调试的环境,但是系统限制比`userdebug`要更加少,会禁用一些安全机制,比如签名验证,关闭一些编译优化等。 @@ -426,7 +422,7 @@ Common goals are: ### 2.5 内核编译 -​ 系统编译完成后,可以在编译的镜像结果中看到文件`boot.img`,这个文件是内核镜像文件。但是这个内核默认采用Android源码树中预编译好的内核文件,并不使用编译出来的,如果想要为编译的系统纳入自编译的内核,需要拉取对应分支的内核代码参与编译,并将编译结果放入Android源码树中的指定路径,最后再重新编译打包Android镜像。这样,生成的系统刷入手机后,使用的内核就是自编译的版本了。 +​ 系统编译完成后,可以在编译的镜像结果中看到文件`boot.img`,这个文件是内核镜像文件。但是这个内核默认采用`Android`源码树中预编译好的内核文件,并不使用编译出来的,如果想要为编译的系统纳入自编译的内核,需要拉取对应分支的内核代码参与编译,并将编译结果放入`Android`源码树中的指定路径,最后再重新编译打包`Android`镜像。这样,生成的系统刷入手机后,使用的内核就是自编译的版本了。 ​ 首先,找到对应当前手机的内核分支,官网提供了详细的说明文档。https://source.android.com/docs/setup/build/building-kernels。根据下图可以看到,对应`Pixel 3`测试机分支是`android-msm-crosshatch-4.9-android12`。 @@ -456,13 +452,13 @@ build/build.sh ls /root/android_src/android-kernel/out/android-msm-pixel-4.9/dist |grep Image ``` -​ 编译成功后,还需要指定Android源码编译时使用这个内核文件。只需要设置环境变量`TARGET_PREBUILT_KERNEL`,指定内核文件的完整路径即可。方式如下。 +​ 编译成功后,还需要指定`Android`源码编译时使用这个内核文件。只需要设置环境变量`TARGET_PREBUILT_KERNEL`,指定内核文件的完整路径即可。方式如下。 ``` export TARGET_PREBUILT_KERNEL=/root/android_src/android-kernel/out/android-msm-pixel-4.9/dist/Image.lz4 ``` -为了以后方便,可以将路径相关的环境变量,写在envsetup.sh这个初始化导入环境命令的脚本中。如下所示: +为了以后方便,可以将路径相关的环境变量,写在`envsetup.sh`这个初始化导入环境命令的脚本中。如下所示: ``` vim ./build/envsetup.sh @@ -486,7 +482,7 @@ make bootimage ### 2.6 刷机 -​ 大多数情况下,Android系统的玩机爱好者,通常会使用傻瓜式的一键刷机工具,例如刷机大师、刷机精灵、奇兔等工具来刷机。这种刷机方式属于软刷(软件刷机);除此之外,还有第一章中介绍到的线刷和卡刷。不论刷机的方式是什么,他们最终都是对刷机包进行处理,然后将ROM文件写入对应的分区,替换掉原始文件。下面,将介绍如何进行线刷和卡刷。 +​ 大多数情况下,`Android`系统的玩机爱好者,通常会使用傻瓜式的一键刷机工具,例如刷机大师、刷机精灵、奇兔等工具来刷机。这种刷机方式属于软刷(软件刷机);除此之外,还有第一章中介绍到的线刷和卡刷。不论刷机的方式是什么,他们最终都是对刷机包进行处理,然后将`ROM`文件写入对应的分区,替换掉原始文件。下面,将介绍如何进行线刷和卡刷。 #### 2.6.1 线刷 @@ -511,7 +507,7 @@ fastboot devices fastboot flashall -w ``` -​ 等待刷机结束即可,刷机结束后会自动进入Android系统。如果只想刷单个分区镜像,流程如下。 +​ 等待刷机结束即可,刷机结束后会自动进入`Android`系统。如果只想刷单个分区镜像,流程如下。 ``` // 进入刷机模式 @@ -561,7 +557,7 @@ lunch aosp_blueline-userdebug make otapackage ``` -​ 编译完成后,可以在前面线刷包的同样路径下,看到zip格式的卡刷包文件,这里的文件名是`aosp_blueline-ota-eng.king.zip`。除了上面的方式,还可以执行`make dist`命令完整编译卡刷包,具体的编译方式如下。 +​ 编译完成后,可以在前面线刷包的同样路径下,看到`zip`格式的卡刷包文件,这里的文件名是`aosp_blueline-ota-eng.king.zip`。除了上面的方式,还可以执行`make dist`命令完整编译卡刷包,具体的编译方式如下。 ``` //下面是完整编译卡刷包 @@ -574,11 +570,11 @@ make dist DIST_DIR=dist_output ​ 编译完成后,在目录`dist_output`中看到卡刷包结果。 -​ 接下来是如何刷入卡刷包,有两种刷入方式,一种是使用`adb sideload`命令刷入,另一种方式是使用第三方的Recovery工具TWRP刷入。下面演示两种不同方式的刷机流程。 +​ 接下来是如何刷入卡刷包,有两种刷入方式,一种是使用`adb sideload`命令刷入,另一种方式是使用第三方的`Recovery`工具`TWRP`刷入。下面演示两种不同方式的刷机流程。 -​ 1、adb sideload(TODO:这里待补充) +1. `adb sideload` -首先进入fastbootd +首先进入`fastbootd` ``` adb reboot bootloader @@ -593,13 +589,16 @@ fastboot reboot fastboot ![image-20230108190631803](.\images\image-20230108190631803.png) +(TODO:这里待补充) -​ 2、twrp(TODO:这里待补充) +2. `twrp` + +(TODO:这里待补充) ### 2.7 源码的开发环境搭建 -​ Android系统是一个非常庞大的工程,需要采用合适的编辑器或IDE来阅读与修改代码。如果改动不多,使用`vscode`导入工作区即可开始修改代码。`vscode`的智能提示和跳转相对IDE较为简陋,如果想要更加友好的开发体验,可以选择将源码导入`Android Studio`中编辑java部分代码,导入`Clion`中编辑`native`部分代码。下面介绍如何将源码导入`Android Studio`。 +​ `Android`系统是一个非常庞大的工程,需要采用合适的编辑器或`IDE`来阅读与修改代码。如果改动不多,使用`vscode`导入工作区即可开始修改代码。`vscode`的智能提示和跳转相对`IDE`较为简陋,如果想要更加友好的开发体验,可以选择将源码导入`Android Studio`中编辑`java`部分代码,导入`Clion`中编辑`native`部分代码。下面介绍如何将源码导入`Android Studio`。 ``` cd ~/aosp12 @@ -704,9 +703,9 @@ add_subdirectory(system/core/lmkd/lmkd-arm64-android) ## 2.8 gitlab配合repo管理源码 -​ 将源码导入idea中后,已经可以正常的开始修改源码了。在日常的项目开中,需要考虑到源码的管理,便于随时能够查看自己的修改,切换不同的分支进行开发。这样一个巨大的项目,一个月后,再想要查找当时修改的逻辑,就非常困难了。如果你是个人开发,并且修改的逻辑不是特别复杂,或者是刚开始学习,那么可以选择跳过这个部分内容。 +​ 将源码导入`idea`中后,已经可以正常的开始修改源码了。在日常的项目开中,需要考虑到源码的管理,便于随时能够查看自己的修改,切换不同的分支进行开发。这样一个巨大的项目,一个月后,再想要查找当时修改的逻辑,就非常困难了。如果你是个人开发,并且修改的逻辑不是特别复杂,或者是刚开始学习,那么可以选择跳过这个部分内容。 -​ 首先,需要对`repo`进行一定的了解,在前文中,有简单的介绍到,`repo`是`python`脚本实现的,是对`git`命令的封装,用来管理大型项目关联多个子项目的。重新回顾一下下载Android代码的过程。前文中,使用`repo`进行初始化指定分支,在完成初始化后,会在当前目录生成一个.repo的目录,查看目录中的manifest.xml文件,内容如下。 +​ 首先,需要对`repo`进行一定的了解,在前文中,有简单的介绍到,`repo`是`python`脚本实现的,是对`git`命令的封装,用来管理大型项目关联多个子项目的。重新回顾一下下载`Android`代码的过程。前文中,使用`repo`进行初始化指定分支,在完成初始化后,会在当前目录生成一个`.repo`的目录,查看目录中的`manifest.xml`文件,内容如下。 ``` @@ -725,7 +724,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md ``` -可以看到内部其实导入了一个default.xml文件。查看这个配置文件。 +可以看到内部其实导入了一个`default.xml`文件。查看这个配置文件。 ``` @@ -765,16 +764,16 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md ``` -​ 这个文件的内容实际上是一份`git`仓库清单,`repo init`初始化的过程就是下载`git`仓库清单文件,以及下载`repo`工具的仓库也就是git-repo项目,使用国内网络进行初始化时的速度非常慢的主要原因,在于git-repo项目较大且必须通过外网访问,很多读者使用国内源进行`repo init`前还需要通过设置环境变量`REPO_URL`修改git-repo的拉取地址。而`repo sync`步骤就是就是将清单文件中对应的子模块全部拉取下来。而default.xml中的元素主要为以下几种。 +​ 这个文件的内容实际上是一份`git`仓库清单,`repo init`初始化的过程就是下载`git`仓库清单文件,以及下载`repo`工具的仓库也就是`git-repo`项目,使用国内网络进行初始化时的速度非常慢的主要原因,在于`git-repo`项目较大且必须通过外网访问,很多读者使用国内源进行`repo init`前还需要通过设置环境变量`REPO_URL`修改`git-repo`的拉取地址。而`repo sync`步骤就是就是将清单文件中对应的子模块全部拉取下来。`default.xml`中的元素主要为以下几种。 -1. manifest:根元素,所有元素都要定义再根元素中。 -2. remote:git仓库的地址以及名称。 -3. default:仓库默认的属性,比如路径、分支、远程仓库名称。 -4. project:子模块仓库的名称、路径、默认分支等信息。 -5. remove-project:需要从清单中删除的仓库。 -6. copyfile:同步代码时,要复制的文件和目录。 -7. include:导入另外一个清单文件,比如觉得一个清单看起来太复杂,可以根据目录分类存放。 -​8. linkfile:定义对应的文件或目录的软连接。 +1. `manifest`:根元素,所有元素都要定义再根元素中。 +2. `remote`:`git`仓库的地址以及名称。 +3. `default`:仓库默认的属性,比如路径、分支、远程仓库名称。 +4. `project`:子模块仓库的名称、路径、默认分支等信息。 +5. `remove-project`:需要从清单中删除的仓库。 +6. `copyfile`:同步代码时,要复制的文件和目录。 +7. `include`:导入另外一个清单文件,比如觉得一个清单看起来太复杂,可以根据目录分类存放。 +8. `linkfile`:定义对应的文件或目录的软连接。 ​ 在配置文件中,有大量的`project`元素,在这里先记住以下信息,`project`元素中的`path`指的是项目拉取到本地之后存放的路径,`name`才是指在`git`仓库中存放的路径。