Android 源码查看笔记

94 阅读4分钟

1 准备条件

AS/ASFP 查看java, vs code 查看 c/c++代码,这样比较丝滑

生成代码需要make 编译模块才能索引

  • ubuntu系统
  • vs code; vs code安装使用clangd插件、Extension Pack for Java插件
  • AS(Android Studio)/ASFP
  • 系统安装clangd

vs code:settings.json设置命名规则,clangd,java分别是id; java插件进行了封装,而clangd直接传递命令参数

2 C/C++源码

  1. 生成compile_commands.json文件
  • 执行source build/envsetup.sh;lunch 你的版本
  • 执行 export SOONG_GEN_COMPDB=1;make [模块] nothing;如果生成的json文件为空,一定要加模块
  • 确认产物compile_commands.json,可能路径:out/soong/development/ide/compdb/compile_commands.json
  1. 打开 VS Code 的 settings.json (Ctrl+Shift+P -> Open User Settings JSON),json跟中插入:
"clangd.path": "/usr/bin/clangd", // 你的clangd位置
"clangd.arguments": [
	"--background-index", // 后台建立索引
	"--all-scopes-completion", // 全局补全
	"--header-insertion=never", // 禁止乱插头文件
	"-j=12", // 并行数,根据 CPU 核心数定
   // 在这里强行指定数据库目录 (必须指向包含 compile_commands.json 的文件夹),若clangd中能识别,则不必指定,路径依赖不同项目会有问题
   "--compile-commands-dir=/mnt-data/QCM6125/out/soong/development/ide/compdb/",
   // 如果需要指定编译器,12.0 版本通常需要通过 query-driver,若clangd中能识别,则不必指定,路径依赖不同项目会有问题
   "--query-driver=/mnt-data/QCM6125/prebuilts/clang/host/linux-x86/*/bin/clang++"
]

4.所需查看代码根目录下命名为 .clangd 内容如下:(对齐需要使用空格不然报错),关键参数就是数据库和编译器路径,这个可以在settings定义,这里可以忽略

CompileFlags:
	# 告诉 clangd 强制使用这个数据库
	CompilationDatabase: out/soong/development/ide/compdb/
  # 强制指定编译器路径,解决 Android 交叉编译头文件找不到的问题
  Compiler:prebuilts/clang/host/linux-x86/**/clang++
	Add: [
		"-I", "frameworks/native/libs/binder/ndk/include_cpp",
		"-I", "system/core/include",
		"-D__ANDROID__"
	]
	Remove: [-m*, -f*] # 移除不支持的编译器参数
  1. 重启服务:Ctrl + Shift + P -> 执行 clangd: Restart language server

make nothing未生成compile_commands.json, 则使用bear监听

  • 安装bear工具
  • bear -- make 模块名字: bear版本不同,可能需要省略--、make模块引号引用

3 Java源码

  1. 执行source build/envsetup.sh;lunch 你的版本
  2. make idegen 或者make aidegen; idegen工具在高版本使用失败,可以根据development/tools/idegen/idegen.sh内容进行修改,这时最建议使用aidegen
  3. 两个命令执行不同结果
  • development/tools/idegen/idegen.sh,在根目录下生成android.ipr和android.iml文件,使用AS或者ASFP工具查看,打开ipr文件即可
  • aidegen 模块路径 -i s/v -n, s代表AS/AFSP工具查看,在模块路径下*.iml,打开iml文件即可;v代表vscode,直接加载即可;不加 -n 会寻找ide软件并自动加载

vscode查看java代码,其实就是使用了java扩展配置:工程跟目录下.classpath, .project文件, .project文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <!-- 项目名称,可以随便起,建议跟你的工程名一致 -->
    <name>Android_QCM6125_Core</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
        <buildCommand>
            <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <!-- 这个 nature 是关键,它告诉 VS Code 这是一个 Java 项目 -->
        <nature>org.eclipse.jdt.core.javanature</nature>
    </natures>
</projectDescription>

.classpath文件配置,src,lib等关联文件(一般来说idegen会在源码跟目录生成一个总的.classpath文件)

若aidegen无法生成vscode查看java的.project和.classpath文件, 则直接生成iml进行转换即可

  • .project可能需要虚拟路径,vscode java工程只支持相对工程路径
	<linkedResources>
   	<link>
   		<name>virture_android_root_external</name>
   		<type>2</type>
   		<location>/mnt-data/QCM6125/external</location>
   	</link>
   	<link>
   		<name>virture_android_root_frameworks</name>
   		<type>2</type>
   		<location>/mnt-data/QCM6125/frameworks</location>
   	</link>
   	<link>
   		<name>virture_android_root_hardware</name>
   		<type>2</type>
   		<location>/mnt-data/QCM6125/hardware</location>
   	</link>
   	<link>
   		<name>virture_android_root_libcore</name>
   		<type>2</type>
   		<location>/mnt-data/QCM6125/libcore</location>
   	</link>
   	<link>
   		<name>virture_android_root_out</name>
   		<type>2</type>
   		<location>/mnt-data/QCM6125/out</location>
   	</link>
   </linkedResources>
  • .classpath,源码使用src, jar包使用lib;virture_android_root_out就是虚拟目录
    <classpathentry kind="src" path="BtService/BluetoothPolicyService/src/main/java"/>
...
   <classpathentry kind="lib" path="virture_android_root_out/soong/.intermediates/frameworks/base/framework/android_common/jarjar/framework.jar"/>

若aidegen 命令报错python相关问题,是python不兼容,这时直接使用idegen工具即可

如果在此文章中您有所收获,请给作者一个鼓励,点个赞,谢谢支持

技术变化都很快,但基础技术、理论知识永远都是那些;作者希望在余后的生活中,对常用技术点进行基础知识分享;如果你觉得文章写的不错,请给予关注和点赞;如果文章存在错误,也请多多指教!