第二章优化,第三章内容增加

This commit is contained in:
dqzg12300 2023-02-19 20:11:35 +08:00
parent d3ae77fbb5
commit 2b1c9a7e0d
4 changed files with 137 additions and 16 deletions

View File

@ -635,7 +635,7 @@ add_subdirectory(frameworks/native)
配置好cmake文件后使用clion打开项目选择刚刚配置好的`CMakeLists.txt`文件的目录`out/development/ide/clion/`。导入成功后,我们需要修改工程的根目录,`Tools->Cmake->Change Project Root`,然后选择源码根目录即可。
## 2.9 git管理
## 2.9 gitlab+repo管理源码
虽然我们将源码导入idea中后已经可以正常的开始修改源码了。但是由于这是一个庞大的项目所以我们需要考虑到源码的管理便于我们随时能够查看自己的修改和切换不同的分支进行开发。否则这样一个巨大的项目一个月后再想要找齐当时修改的逻辑就非常困难了。如果你是个人开发并且修改的逻辑不是特别复杂或者是刚开始学习那么可以选择跳过这个部分直接修改源码即可。
@ -962,7 +962,7 @@ if __name__ == '__main__':
~~~
子模块仓库建立完成,最后我们还需要将代码上传到对应的仓库中。同样参考网上找的上传代码,修改一部分细节,代码如下
子模块仓库建立完成,最后我们还需要将代码上传到对应的仓库中。同样参考网上找的上传代码,修改一部分细节,这里一定要注意default.xml中project元素的属性path的是本地路径而name才是指的git仓库的路径代码如下
~~~python
#!/usr/bin/python3
@ -993,7 +993,7 @@ def parse_repo_manifest():
s = MANIFEST_XML_PATH_NAME_RE.search(this_temp_line)
if s is not None:
manifest_xml_project_paths.append(s.group("path"))
manifest_xml_project_paths.append({"path":s.group("path"),"name":s.group("name")})
print("manifest_xml_project_paths=" + str(manifest_xml_project_paths))
print("manifest_xml_project_paths len=" + str(len(manifest_xml_project_paths)))
@ -1002,8 +1002,8 @@ def parse_repo_manifest():
def push_source_code_by_folder(str_writer):
# 遍历所有路径
for path in manifest_xml_project_paths:
print("path=" + path)
abs_path = SOURCE_CODE_ROOT + path
print("path=" + path["path"])
abs_path = SOURCE_CODE_ROOT + path["path"]
# 路径存在则进行上传
if os.path.exists(abs_path):
# change current work dir
@ -1030,7 +1030,7 @@ def push_source_code_by_folder(str_writer):
git_init_cmd = "git init"
cmd_list.append(git_init_cmd)
git_remote_cmd = "git remote add origin " + REMOTE + path + ".git"
git_remote_cmd = "git remote add origin " + REMOTE + path["name"] + ".git"
cmd_list.append(git_remote_cmd)
git_add_dot_cmd = "git add ."
@ -1111,7 +1111,64 @@ repo init -u git@192.168.2.189:android12_r3/manifest.git --repo-url=git@192.168.
repo sync -j8
~~~
到这里就完成了gitlab源码管理android源码开发了。最后如何使用git提交和查看历史记录我就不在这里叙述了。
在同步的过程中,出现了两个问题。首先第一个是出现如下错误
~~~
remote:
remote: ========================================================================
remote:
remote: The project you were looking for could not be found or you don't have permission to view it.
remote:
remote: ========================================================================
remote:
fatal: 无法读取远程仓库。
请确认您有正确的访问权限并且仓库存在。
platform/build/bazel:
~~~
检测代码后发现bazel仓库在路径build中不存在这个仓库被建立在了platform下。导致这个问题的原因是由于前面的创建git的脚本中发现build被指定为project所以创建为仓库而bazel必须是在一个group下路径才会成立。而build的仓库已经存在创建这个group失败后就默认使用了更上一层的group。而解决办法也非常简单直接将default中的几个build路径下的几个project重新命名不要放在build的group下即可。下面是解决后的default.xml配置。
~~~
<project path="build/make" name="platform/build" groups="pdk" >
<copyfile src="core/root.mk" dest="Makefile" />
<linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />
<linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" />
<linkfile src="core" dest="build/core" />
<linkfile src="envsetup.sh" dest="build/envsetup.sh" />
<linkfile src="target" dest="build/target" />
<linkfile src="tools" dest="build/tools" />
</project>
<project path="build/bazel" name="platform/build_bazel" groups="pdk" >
<linkfile src="bazel.WORKSPACE" dest="WORKSPACE" />
<linkfile src="bazel.sh" dest="tools/bazel" />
<linkfile src="bazel.BUILD" dest="BUILD" />
</project>
<project path="build/blueprint" name="platform/build_blueprint" groups="pdk,tradefed" />
<project path="build/pesto" name="platform/build_pesto" groups="pdk" />
<project path="build/soong" name="platform/build_soong" groups="pdk,tradefed" >
<linkfile src="root.bp" dest="Android.bp" />
<linkfile src="bootstrap.bash" dest="bootstrap.bash" />
</project>
~~~
另外一个问题也非常类似。错误如下。
~~~
请确认您有正确的访问权限并且仓库存在。
device/mediatek/wembley-sepolicy: sleeping 4.0 seconds before retrying
~~~
经过检查后发现这是由于这个仓库在default.xml中的配置如下
~~~
<project name="device/mediatek/wembley-sepolicy" path="device/mediatek/wembley-sepolicy" groups="device"/>
~~~
然后看了创建仓库和批量提交代码的逻辑就明白了是的name和path的顺序反了导致正则表达式未能成功匹配到这个仓库所以我们调整一下name和path的顺序即可。到这里就完成了gitlab源码管理android源码开发了。最后如何使用git提交和查看历史记录我就不在这里叙述了。
## 2.10 小结

View File

@ -2,5 +2,64 @@
## 3.1 源码结构介绍
通过前面的学习我们成功编译了Android12以及对应的内核并且通过多种方式刷入手机。接下来我们需要先对源码的结构有一定的了解
在上一章的学习中我们成功编译了Android12以及对应的内核并且通过多种方式刷入手机。接下来我们需要先对Android源码的结构有一定的了解,对结构有一定了解能帮助我们更快的定位和分析源码同时能让开发人员更好的理解Android系统。
Android源码结构分为四个主要的模块frameworks、packages、hardware、system。frameworks模块是Android系统的核心包含了Android系统的核心类库、Java框架和服务它是Android开发的基础。packages模块包括了Android系统的应用程序主要是用户使用的应用程序例如通讯录、日历和相机。hardware模块提供了对硬件设备的支持例如触摸屏、摄像头等。最后system模块包含了Linux内核和Android底层服务它负责管理资源和处理系统事件。除了这些主要模块Android源码中还有一些其他的文件夹例如build、external、prebuilts和tools等他们提供了编译系统所需的资源和工具。接下来我们对根目录进行一个简单的介绍。
1、art该目录是Android 5.0中新增加的主要是实现Android RunTimeART的目录它作为Android 4.4中的Dalvik虚拟机的替代主要处理Java字节码。
2、bionic这是Android的C库包含了很多标准的C库函数和头文件还有一些Android特有的函数和头文件。
3、bootable该目录包含了引导程序这些引导程序用于从系统启动并初始化硬件 例如Bootloader和Recovery程序。
4、build该目录包含了编译Android源代码所需要的脚本包括makefile文件和一些构建工具。
5、compatibility该目录收集了Android设备的兼容性测试套件CTS和兼容性实现Compatibility Implementation
6、cts该目录包含了Android设备兼容性测试套件CTS主要用来测试设备是否符合Android标准。
7、dalvik该目录包含了Dalvik虚拟机它是Android 2.3版本之前的主要虚拟机它主要处理Java字节码。
8、developers该目录包含了Android开发者文档和样例代码。
9、development该目录包含了一些调试工具如systrace、monkey、ddms等。
10、device该目录包含了特定的Android设备的驱动程序。
11、external该目录包含了一些第三方库如WebKit、OpenGL等。
12、frameworks该目录提供了Android应用程序调用底层服务的API它也是Android应用程序开发的重要组成部分。
13、hardware该目录包含了Android设备硬件相关的驱动代码如摄像头驱动、蓝牙驱动等。
14、kernel该目录包含了Android系统内核的源代码它是Android系统的核心部分。
15、libcore该目录包含了Android底层库它提供了一些基本的API如文件系统操作、网络操作等。
16、libnativehelper该目录提供了一些C++库,它们可以帮助我们调用本地代码。
17、packages该目录包含了Android框架、应用程序和其他模块的源代码。 包含了 Android 系统中的所有应用程序,例如短信、电话、浏览器、相机等
18、pdk该目录是一个Android平台开发套件它包含了一些工具和API以便开发者快速开发Android应用程序。
19、platform_testing该目录包含了一些测试工具用于测试Android平台的稳定性和性能。
20、prebuilts该目录包含了一些预先编译的文件如编译工具、驱动程序等。
21、sdk该目录是Android SDK的源代码它包含了Android SDK的API文档、代码示例、工具等。
22、system该目录包含了Android系统的核心部分如系统服务、应用程序、内存管理机制、文件系统、网络协议等。
23、test该目录包含了一些测试代码用于测试Android系统的各个组件。
24、toolchain该目录包含了一些编译器和工具链如GCC、Clang等用于编译Android源代码。
25、tools该目录包含了一些开发工具如Android SDK工具、Android Studio、Eclipse等。
26、vendor该目录包含了一些硬件厂商提供的驱动程序如摄像头驱动、蓝牙驱动等。
我们并不需要全部记下,只要大致的有个印象,当你常常为了实现某个功能,查阅翻读源码时,就会不断加深你对这些目录划分的了解,这里我们回顾一下第二章中,在我们编译源码的过程中下载了两个驱动相关的文件。回顾下图。
![image-20230219161123065](.\images\image-20230219161123065.png)
下载两个驱动文件后我们将文件放到源码根目录中解压并且执行相应的sh脚本进行导出到了这里我们了解到vendor中是硬件厂商提供的摄像头蓝牙之类的驱动程序。那么我们就可以观察到脚本执行后实际就是将驱动文件放到了对应目录中。

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -25,19 +25,24 @@
2.8 源码的开发环境搭建
2.9 gitlab+repo管理源码
第3章 认识系统组件
3.1 源码结构介绍
3.2 init进程
3.2.1 initrc配置文件
3.2 进程启动流程
3.3 init进程
3.3.1 initrc配置文件
...
3.2.x initrc添加xxx
3.3 认识services
3.4 认识framework
3.5 认识libcore
3.6 认识sepolicy
3.7 认识linker
3.3.x initrc添加xxx
3.4 认识services
3.5 认识framework
3.6 认识libcore
3.7 认识sepolicy
3.8 认识linker
第4章 系统美化
4.1 常见的系统美化方式