第二章调整部分格式

This commit is contained in:
dqzg12300 2023-05-03 22:07:29 +08:00
parent 60f943a5bf
commit 7b18ea3bc6

View File

@ -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、WSLWindows Subsystem for Linux、Vmware虚拟机QEMU、HyperV虚拟机平台等等。
由于在`Windows`中缺少了各种底层编译器与开发库的支持,一般情况下,开发人员不会直接在`Windows`环境中编译,而是选择在`Windows`中创建一个`Linux`的虚拟环境,然后在虚拟环境中安装编译所需要用到的底层依赖。在`Windows`系统上部署`Ubuntu`虚拟环境有多种可选方案,例如`Docker、WSLWindows 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 sideloadTODO这里待补充
1. `adb sideload`
首先进入fastbootd
首先进入`fastbootd`
```
adb reboot bootloader
@ -593,13 +589,16 @@ fastboot reboot fastboot
![image-20230108190631803](.\images\image-20230108190631803.png)
TODO这里待补充
2、twrpTODO这里待补充
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. remotegit仓库的地址以及名称。
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`仓库中存放的路径。