mirror of
https://github.com/feicong/rom-course.git
synced 2025-08-29 02:35:20 +00:00
第二章调整部分格式
This commit is contained in:
parent
60f943a5bf
commit
7b18ea3bc6
@ -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`命令查看当前系统版本号。
|
||||
|
||||

|
||||
|
||||
由于是系统自带的,所以安装起来非常方便,可以直接在控制面版->程序->启动或关闭Window功能中开启支持即可,如下图
|
||||
由于是系统自带的,所以安装起来非常方便,可以直接在控制面版->程序->启动或关闭`Window`功能中开启支持即可,如下图
|
||||
|
||||

|
||||
|
||||
或者是采用命令的方式开启虚拟机平台和Linux子系统,使用管理员权限启动` `。
|
||||
或者是采用命令的方式开启虚拟机平台和`Linux`子系统,使用管理员权限启动。
|
||||
|
||||

|
||||
|
||||
@ -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版本,如下图。
|
||||
|
||||

|
||||
|
||||
成功获取`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`创建虚拟机,选择指定镜像
|
||||
|
||||

|
||||
|
||||
@ -84,35 +84,33 @@ wsl --import ubuntu22 E:\wsl2\ubuntu22_wsl E:\wsl2\ubuntu22.tar
|
||||
|
||||

|
||||
|
||||
4、选择虚拟机保存位置,这里不要保存在C盘,记得磁盘要有至少300G的空间
|
||||
4、选择虚拟机保存位置,这里不要保存在`C`盘,记得磁盘要有至少`300G`的空间
|
||||
|
||||

|
||||
|
||||
5、虚拟硬件CPU核心根据你的电脑配置进行调整,尽量多分点给虚拟机。
|
||||
5、虚拟硬件`CPU`核心根据你的电脑配置进行调整,尽量多分点给虚拟机。
|
||||
|
||||

|
||||
|
||||
6、虚拟内存分配,至少保证16G以上的内存,否则可能会碰到内存不足编译失败的情况。
|
||||
6、虚拟内存分配,至少保证`16G`以上的内存,否则可能会碰到内存不足编译失败的情况。
|
||||
|
||||

|
||||
|
||||
7、虚拟硬盘分配,这里至少分配500G的空间,考虑到性能,我选择的是单文件吗,这里如果选择立即分配所有磁盘空间,能提高一定的性能。如果你的电脑配置不是很高,建议你选择立即分配。
|
||||
7、虚拟硬盘分配,这里至少分配`500G`的空间,考虑到性能,我选择的是单文件吗,这里如果选择立即分配所有磁盘空间,能提高一定的性能。如果你的电脑配置不是很高,建议你选择立即分配。
|
||||
|
||||

|
||||
|
||||
虚拟机开机后,将默认进入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`版本,支持哪些设备。
|
||||
|
||||

|
||||
|
||||
这么多版本,需要选一个最适合的版本,选择策略如下:
|
||||
|
||||
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`,如下图。
|
||||
|
||||

|
||||
|
||||
|
||||
#### 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
|
||||
|
||||

|
||||
|
||||
第一个文件`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
|
||||
|
||||

|
||||
|
||||
(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`文件,内容如下。
|
||||
|
||||
```
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
@ -725,7 +724,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
|
||||
</manifest>
|
||||
```
|
||||
|
||||
可以看到内部其实导入了一个default.xml文件。查看这个配置文件。
|
||||
可以看到内部其实导入了一个`default.xml`文件。查看这个配置文件。
|
||||
|
||||
```
|
||||
<manifest>
|
||||
@ -765,16 +764,16 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
|
||||
</manifest>
|
||||
```
|
||||
|
||||
这个文件的内容实际上是一份`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`仓库中存放的路径。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user