调整措辞,去掉我们

This commit is contained in:
feiocng 2023-03-06 13:15:42 +08:00
parent e6b9d6afc2
commit 1ac75a2d59

View File

@ -6,7 +6,7 @@
尽管Android源码结构非常庞大但对于初学者并不需要完整的吃透所有代码。重点的是掌握系统代码分析的思路阅读理解工程的整体结构了解Android系统框架的运行原理结合思考与实践达到自定义定制的目标。 尽管Android源码结构非常庞大但对于初学者并不需要完整的吃透所有代码。重点的是掌握系统代码分析的思路阅读理解工程的整体结构了解Android系统框架的运行原理结合思考与实践达到自定义定制的目标。
学习的流程需要循序渐进,有的放矢,以免迷失在纷繁复杂的代码海洋中。通常,第一步需要了解如何将整个系统项目成功编译并刷机。这一章将详细讲解在各种不同的环境下,我们应该如何编译Android源码并将其刷入手机中。 学习的流程需要循序渐进有的放矢以免迷失在纷繁复杂的代码海洋中。通常第一步需要了解如何将整个系统项目成功编译并刷机。这一章将详细讲解在各种不同的环境下应该如何编译Android源码并将其刷入手机中。
## 2.2 环境准备 ## 2.2 环境准备
@ -45,12 +45,12 @@ Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 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) ![image-20230102184626538](.\images\image-20230102184626538.png)
成功获取`Ubuntu`系统后从应用中启动系统即开始正式安装。安装过程只需要设置好用户名与密码即可。完成后会进行一个shell环境供用户输入。 成功获取`Ubuntu`系统后从应用中启动系统即开始正式安装。安装过程只需要设置好用户名与密码即可。完成后会进行一个shell环境供用户输入。
需要注意的是应用商店默认会将WSL安装在C盘中我们编译系统会占用相当大的空间,如果你的系统盘空间不够,需要做一个迁移操作,将子系统迁移到其他硬盘中。操作方法是:桌面任意位置右键选择终端,在打开的终端环境中自毁长城下面的命令,查询当前的子系统名称。 需要注意的是应用商店默认会将WSL安装在C盘中而编译系统会占用相当大的空间如果你的系统盘空间不够需要做一个迁移操作将子系统迁移到其他硬盘中。操作方法是桌面任意位置右键选择终端在打开的终端环境中自毁长城下面的命令查询当前的子系统名称。
``` ```
wsl -l -v wsl -l -v
@ -274,7 +274,7 @@ Lunch menu... pick a combo:
Which would you like? [aosp_arm-eng] Which would you like? [aosp_arm-eng]
// 选择版本可以填写直接填写aosp_blueline-userdebug或者是填写编号4 // 选择版本可以填写直接填写aosp_blueline-userdebug或者是填写编号4
// 同样我们可以省略成一句直接lunch 4或者是lunch aosp_blueline-userdebug // 同样可以省略成一句直接lunch 4或者是lunch aosp_blueline-userdebug
4 4
// 和上面一样。直接使用当前cpu的核心数作为编译的并发线程 // 和上面一样。直接使用当前cpu的核心数作为编译的并发线程
@ -464,13 +464,13 @@ make bootimage
### 2.6 刷机 ### 2.6 刷机
大多数情况下非技术的Android爱好者通常会使用傻瓜式一键刷机工具例如刷机大师、刷机精灵、奇兔等等。这种刷机方式就是属于软刷软件刷机除此之外还有我们第一章中简单介绍到的线刷和卡刷。不论刷机的方式是什么他们最终的原理都是相同的都是对刷机包进行处理然后将ROM文件写入对应的分区替换掉原始文件。下面我们将简单介绍如何进行线刷和卡刷。 大多数情况下非技术的Android爱好者通常会使用傻瓜式一键刷机工具例如刷机大师、刷机精灵、奇兔等等。这种刷机方式就是属于软刷软件刷机除此之外还有第一章中简单介绍到的线刷和卡刷。不论刷机的方式是什么他们最终的原理都是相同的都是对刷机包进行处理然后将ROM文件写入对应的分区替换掉原始文件。下面将简单介绍如何进行线刷和卡刷。
### 2.6.1 线刷 ### 2.6.1 线刷
通过上面编译中的步骤,在目录`aosp12_out/target/product/blueline/`中能看到若干个后缀为`img`的镜像文件。我的输出路径`aosp12_out`是由于我手动指定了输出目录,如果你没有设置,那么默认是在`aosp12/out/target/product/blueline/`目录下。最后的目录`blueline`是对应编译的版本,如果你是其他版本,就在对应的目录下查看。 通过上面编译中的步骤,在目录`aosp12_out/target/product/blueline/`中能看到若干个后缀为`img`的镜像文件。我的输出路径`aosp12_out`是由于我手动指定了输出目录,如果你没有设置,那么默认是在`aosp12/out/target/product/blueline/`目录下。最后的目录`blueline`是对应编译的版本,如果你是其他版本,就在对应的目录下查看。
首先我们要进入刷机模式,然后环境变量设置编译结果的路径,然后使用命令完整刷机即可。详细流程如下 首先进入刷机模式,然后设置环境变量编译结果的路径`ANDROID_PRODUCT_OUT`,然后使用命令完整刷机即可。详细流程如下
``` ```
// 进入刷机模式 // 进入刷机模式
@ -489,7 +489,7 @@ fastboot devices
fastboot flashall -w fastboot flashall -w
``` ```
等待刷机结束即可刷机结束后会自动进入Android系统。如果我们只想刷单个分区镜像,也是可以的。流程如下 等待刷机结束即可刷机结束后会自动进入Android系统。如果只想刷单个分区镜像也是可以的。流程如下
``` ```
// 进入刷机模式 // 进入刷机模式
@ -511,7 +511,7 @@ fastboot: error: The partition you are trying to flash is dynamic, and should be
And try again. If you are intentionally trying to overwrite a fixed partition, use --force. And try again. If you are intentionally trying to overwrite a fixed partition, use --force.
// 这种情况我们按照他的提示操作即可执行下面的命令后发现进入了fastbootd模式 // 这种情况按照它的提示操作即可执行下面的命令后发现进入了fastbootd模式
fastboot reboot fastboot fastboot reboot fastboot
// 重新刷入系统 // 重新刷入系统
@ -529,7 +529,7 @@ fastboot reboot
### 2.6.2 卡刷 ### 2.6.2 卡刷
我们前面编译出来的是线刷包,如果我们需要卡刷包,就需要使用下面的方式进行编译 前面步骤编译出来的是系统线刷包,如果需要卡刷包,就需要使用下面的方式进行编译
``` ```
// 下面是简单的编译卡刷包 // 下面是简单的编译卡刷包
@ -539,7 +539,7 @@ lunch aosp_blueline-userdebug
make otapackage make otapackage
``` ```
编译完成后,我们可以在前面线刷包的路径下看到卡刷包文件,我这里的文件名是`aosp_blueline-ota-eng.king.zip`。除了上面的方式,我们还可以完整编译卡刷包,编译方式如下 编译完成后,可以在前面线刷包的路径下看到卡刷包文件,我这里的文件名是`aosp_blueline-ota-eng.king.zip`。除了上面的方式,还可以完整编译卡刷包,编译方式如下
``` ```
//下面是完整编译卡刷包 //下面是完整编译卡刷包
@ -577,7 +577,7 @@ fastboot reboot fastboot
### 2.8 源码的开发环境搭建 ### 2.8 源码的开发环境搭建
Android系统是一个非常庞大的项目所以我们需要采用合适的编辑器或者是`ide`来修改代码,如果你的改动不多,那么我们简单的使用`VsCode`导入工作区即可开始修改代码。但是`VsCode`的智能提示和跳转较为简陋,所以如果想要更加友好的开发体验,我们可以选择将源码导入`Android Studio`中编辑java部分代码导入`Clion`中编辑`native`部分代码。下面简单介绍如何将源码导入Android Studio。 Android系统是一个非常庞大的项目所以需要采用合适的编辑器或者是`ide`来修改代码,如果你的改动不多,那么简单的使用`vscode`导入工作区即可开始修改代码。但是`vscode`的智能提示和跳转较为简陋,所以如果想要更加友好的开发体验,可以选择将源码导入`Android Studio`中编辑java部分代码导入`Clion`中编辑`native`部分代码。下面简单介绍如何将源码导入Android Studio。
``` ```
cd ~/aosp12 cd ~/aosp12
@ -635,7 +635,7 @@ make -j$(nproc --all)
// 查看clion目录下面生成了大量的CMakeLists.txt // 查看clion目录下面生成了大量的CMakeLists.txt
tree out/development/ide/clion/ tree out/development/ide/clion/
// 在clion目录下创建一个CMakeLists.txt来合并导入我们需要使用的各个模块 // 在clion目录下创建一个CMakeLists.txt来合并导入需要使用的各个模块
touch out/development/ide/clion/CMakeLists.txt touch out/development/ide/clion/CMakeLists.txt
// 配置CMakeLists.txt导入模块 // 配置CMakeLists.txt导入模块
@ -678,13 +678,13 @@ add_subdirectory(system/core/lmkd/liblmkd_utils-arm64-android)
add_subdirectory(system/core/lmkd/lmkd-arm64-android) add_subdirectory(system/core/lmkd/lmkd-arm64-android)
``` ```
配置好cmake文件后使用clion打开项目选择刚刚配置好的`CMakeLists.txt`文件的目录`out/development/ide/clion/`。导入成功后,我们需要修改工程的根目录,`Tools->Cmake->Change Project Root`,然后选择源码根目录即可。 配置好cmake文件后使用clion打开项目选择刚刚配置好的`CMakeLists.txt`文件的目录`out/development/ide/clion/`。导入成功后,需要修改工程的根目录,`Tools->Cmake->Change Project Root`,然后选择源码根目录即可。
## 2.9 gitlab+repo管理源码 ## 2.9 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"?> <?xml version="1.0" encoding="UTF-8"?>
@ -703,7 +703,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
</manifest> </manifest>
``` ```
可以看到只是导入了default.xml文件。接着我们查看这个配置文件。 可以看到只是导入了default.xml文件。查看这个配置文件。
``` ```
<manifest> <manifest>
@ -757,13 +757,13 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
6、copyfile同步代码时要复制的文件和目录 6、copyfile同步代码时要复制的文件和目录
7、include导入另外一个清单文件比如我们觉得一个清单看起来太复杂,可以根据目录分类存放 7、include导入另外一个清单文件比如觉得一个清单看起来太复杂可以根据目录分类存放
8、linkfile定义对应的文件或目录的软连接 8、linkfile定义对应的文件或目录的软连接
在配置文件中我们可以看到有大量的project元素在这里我们先记下一个信息在project元素中的path指的是项目拉取到本地之后存放的路径而name才是指在git仓库中存放的路径。 在配置文件中,可以看到有大量的project元素在这里先记录下一个信息在project元素中的path指的是项目拉取到本地之后存放的路径而name才是指在git仓库中存放的路径。
清楚了使用repo同步代码的原理以及git清单中元素的作用后我们就可以开始搭建自己的Android源码远程仓库了。由于项目较大所以我们可以在本地搭建一个gitlab服务然后将项目上传至gitlab中进行管理如下是搭建gitlab服务的步骤。 清楚了使用repo同步代码的原理以及git清单中元素的作用后就可以开始搭建自己的Android源码远程仓库了。由于项目较大可以在本地搭建一个gitlab服务然后将项目上传至gitlab中进行管理如下是搭建gitlab服务的步骤。
``` ```
// 安装gitlab服务的依赖 // 安装gitlab服务的依赖
@ -797,7 +797,7 @@ sudo gitlab-ctl start
Your account has been blocked. Please contact your GitLab administrator if you think this is an error. Your account has been blocked. Please contact your GitLab administrator if you think this is an error.
``` ```
这是因为注册的账号需要审批激活后才能使用。我们回到终端上通过下面的命令激活账号 这是因为注册的账号需要审批激活后才能使用。回到终端上通过下面的命令激活账号
``` ```
// 进入gitlab的控制台 // 进入gitlab的控制台
@ -816,9 +816,9 @@ exit
到这里gitlab服务准备就绪登录账号后就可以创建aosp的子模块仓库了。 到这里gitlab服务准备就绪登录账号后就可以创建aosp的子模块仓库了。
根据前面repo的介绍我们知道了源码一共是三个部分git-repo.git的工具仓库、manifests.git的子模块清单仓库、aosp源码子模块仓库。接下来我们将代码同步的流程分割为下面几个步骤。 根据前面repo的介绍我们知道了源码一共是三个部分git-repo.git的工具仓库、manifests.git的子模块清单仓库、aosp源码子模块仓库。接下来将代码同步的流程分割为下面几个步骤。
1、参考.repo/manifests/default.xml配置修改为我们自己的gitlab地址并创建一个manifests.git仓库。 1、参考.repo/manifests/default.xml配置修改为自己的gitlab地址并创建一个manifests.git仓库。
2、使用脚本批量创建子模块仓库 2、使用脚本批量创建子模块仓库
@ -826,11 +826,11 @@ exit
4、使用自己的gitlab地址同步代码测试 4、使用自己的gitlab地址同步代码测试
由于我们一会需要创建大量的子模块仓库,所以我们不可能在web页面上手动一个个的创建所以下面我们使用命令来创建一个manifests.git仓库。而命令创建仓库我们需要gitlab账号的Access Token。我们可以通过在web中登录账号点击右上角的用户图标选择Preferences来到用户设置页面然后进入Access Tokens栏目填写token名称以及勾选权限最后点击生成我生成的token为`27zctxyWZP9Txksenkxb`。流程见下图。 一会需要创建大量的子模块仓库所以不可能在web页面上手动一个个的创建下面使用命令来创建一个manifests.git仓库。而命令创建仓库需要gitlab账号的Access Token。可以通过在web中登录账号点击右上角的用户图标选择Preferences来到用户设置页面然后进入Access Tokens栏目填写token名称以及勾选权限最后点击生成我生成的token为`27zctxyWZP9Txksenkxb`。流程见下图。
![image-20230216211544482](.\images\image-20230216211544482.png) ![image-20230216211544482](.\images\image-20230216211544482.png)
首选我们需要在gitlab中手动创建一个根目录的group我这里创建了一个android12_r3的组所有的子模块仓库都将在这个分组下。在gitlab页面中点击左上角Groups->your Groups。然后点击New group创建分组。成功创建后记录下这个分组的id比如我的根目录组id是6. 首选在gitlab中手动创建一个根目录的group我这里创建了一个android12_r3的组所有的子模块仓库都将在这个分组下。在gitlab页面中点击左上角Groups->your Groups。然后点击New group创建分组。成功创建后记录下这个分组的id比如我的根目录组id是6.
然后就可以使用curl命令通过token访问gitlab的api创建一个空白的仓库 然后就可以使用curl命令通过token访问gitlab的api创建一个空白的仓库
@ -856,7 +856,7 @@ vim default.xml
//修改内容如下 //修改内容如下
<manifest> <manifest>
// 修改name为orgin修改review为我们自己的服务器地址 // 修改name为orgin修改review为自己的服务器地址
<remote name="origin" <remote name="origin"
fetch=".." fetch=".."
review="http://192.168.2.189/" /> review="http://192.168.2.189/" />
@ -877,7 +877,7 @@ git add . && git commit -m "init"
git push git push
``` ```
准备好清单文件后,接下来就需要准备所有子模块仓库了。首先我们得知道一共有哪些子模块需要上传而这个通过default.xml中的project元素很容易得到。我们可以编写一个python脚本来匹配出所有project中的path属性然后创建group和仓库。下面贴上一份网上找到读取default.xml自动创建所有仓库。 准备好清单文件后,接下来就需要准备所有子模块仓库了。首先得知道一共有哪些子模块需要上传而这个通过default.xml中的project元素很容易得到。可以编写一个python脚本来匹配出所有project中的path属性然后创建group和仓库。下面贴上一份网上找到读取default.xml自动创建所有仓库。
```python ```python
#!/usr/bin/python3 #!/usr/bin/python3
@ -1007,14 +1007,14 @@ if __name__ == '__main__':
``` ```
子模块仓库建立完成,最后我们还需要将代码上传到对应的仓库中。同样参考网上找的上传代码修改一部分细节这里一定要注意default.xml中project元素的属性path的是本地路径而name才是指的git仓库的路径代码如下 子模块仓库建立完成,最后还需要将代码上传到对应的仓库中。同样参考网上找的上传代码修改一部分细节这里一定要注意default.xml中project元素的属性path的是本地路径而name才是指的git仓库的路径代码如下
```python ```python
#!/usr/bin/python3 #!/usr/bin/python3
import os import os
import re,time import re,time
# 代码放在我们之前准备好的清单仓库中然后指定default.xml路径 # 代码放在之前准备好的清单仓库中然后指定default.xml路径
MANIFEST_XML = "./manifests/default.xml" MANIFEST_XML = "./manifests/default.xml"
ROOT = os.getcwd() ROOT = os.getcwd()
LOG_FILE_PATH = os.path.join(ROOT, "push.log") LOG_FILE_PATH = os.path.join(ROOT, "push.log")
@ -1116,7 +1116,7 @@ if __name__ == '__main__':
``` ```
上传过程较慢等待所有仓库上传完成最后将git-repo工具子模块上传到我们的仓库。首先在gitlab中创建一个分组android-tools。然后在分组中手动创建一个仓库git-repo。然后从github下载一份git-repo的工具源码传到我们的gitlab。过程如下。 上传过程较慢等待所有仓库上传完成最后将git-repo工具子模块上传到仓库。首先在gitlab中创建一个分组android-tools。然后在分组中手动创建一个仓库git-repo。然后从github下载一份git-repo的工具源码传到gitlab。过程如下。
``` ```
// 从github下载git-repo源码并上传到gitlab仓库 // 从github下载git-repo源码并上传到gitlab仓库
@ -1133,13 +1133,13 @@ cp ./repo ~/bin/
PATH=~/bin:$PATH PATH=~/bin:$PATH
``` ```
终于一切准备就绪,那么开始拉取我们自己的代码吧。 终于一切准备就绪,那么开始拉取代码吧。
``` ```
// 创建存放源码的目录 // 创建存放源码的目录
mkdir myandroid12 && cd myandroid12 mkdir myandroid12 && cd myandroid12
// 指定使用我们自己的仓库,使用我们自己的git-repo // 指定使用自己的git-repo
repo init -u git@192.168.2.189:android12_r3/manifest.git --repo-url=git@192.168.2.189:android-tools/git-repo.git --no-repo-verify repo init -u git@192.168.2.189:android12_r3/manifest.git --repo-url=git@192.168.2.189:android-tools/git-repo.git --no-repo-verify
// 出现了下面的错误 // 出现了下面的错误
@ -1147,7 +1147,7 @@ repo: error: unable to resolve "stable"
fatal: double check your --repo-rev setting. fatal: double check your --repo-rev setting.
fatal: cloning the git-repo repository failed, will remove '.repo/repo' fatal: cloning the git-repo repository failed, will remove '.repo/repo'
// 然后我们修改使用master分支再重新执行上面的repo init命令 // 修改使用master分支再重新执行上面的repo init命令
export REPO_REV=refs/heads/master export REPO_REV=refs/heads/master
repo init -u git@192.168.2.189:android12_r3/manifest.git --repo-url=git@192.168.2.189:android-tools/git-repo.git --no-repo-verify repo init -u git@192.168.2.189:android12_r3/manifest.git --repo-url=git@192.168.2.189:android-tools/git-repo.git --no-repo-verify
@ -1211,9 +1211,9 @@ device/mediatek/wembley-sepolicy: sleeping 4.0 seconds before retrying
<project name="device/mediatek/wembley-sepolicy" path="device/mediatek/wembley-sepolicy" groups="device"/> <project name="device/mediatek/wembley-sepolicy" path="device/mediatek/wembley-sepolicy" groups="device"/>
``` ```
然后看了创建仓库和批量提交代码的逻辑就明白了是的name和path的顺序反了导致正则表达式未能成功匹配到这个仓库所以我们调整一下name和path的顺序即可。 然后看了创建仓库和批量提交代码的逻辑就明白了是的name和path的顺序反了导致正则表达式未能成功匹配到这个仓库调整一下name和path的顺序即可。
成功拉取完成后,如果在编译时碰到找不到文件的问题,这是由于有些子模块仓库下的子目录中有`.gitignore`文件,将一些应该提交的文件给过滤掉了。回到我们同步代码的目录中找到指定的git仓库使用下面的方式重新提交一下。然后回到我们同步下来的代码处重新拉取更新的代码。 成功拉取完成后,如果在编译时碰到找不到文件的问题,这是由于有些子模块仓库下的子目录中有`.gitignore`文件将一些应该提交的文件给过滤掉了。回到同步代码的目录中找到指定的git仓库使用下面的方式重新提交一下。回到同步下来的代码处重新拉取更新的代码。
``` ```
// 进入缺少文件的子模块仓库目录 // 进入缺少文件的子模块仓库目录
@ -1229,7 +1229,7 @@ repo sync -j8
## 2.10 小结 ## 2.10 小结
在这一章里主要讲述了如何从零开始搭建一个编译Android源码的环境以及如何选择编译的版本和完整的编译Android源码并使用自己编译的内核然后将这个我们编译好的镜像尝试多种方式刷入测试手机中。为了后续开发和阅览代码的便利又讲述了如何使用Android Studio和Clion导入源码。最后为了便于长期维护和持续性的开发我们又搭建了gitlab+repo管理Android源码。终于将一切准备就绪了。 在这一章里主要讲述了如何从零开始搭建一个编译Android源码的环境以及如何选择编译的版本和完整的编译Android源码并使用自己编译的内核然后将编译好的镜像尝试多种方式刷入测试手机中。为了后续开发和阅览代码的便利又讲述了如何使用Android Studio和Clion导入源码。最后为了便于长期维护和持续性的开发又搭建了gitlab+repo管理Android源码。终于将一切准备就绪了。
TODO 你看看这里是不是小结写的有点简单。看着应该怎么丰富一下。 TODO 你看看这里是不是小结写的有点简单。看着应该怎么丰富一下。