0%

clion vscode 阅读Android native源码

1. clion vscode 阅读Android native源码

1.1. 为native源码编译生成cmake文件

1
2
export SOONG_GEN_CMAKEFILES=1
export SOONG_GEN_CMAKEFILES_DEBUG=1

将上面两句加入到~/.bashrc下, 以后新工程就不用重复export了

源码source lunch后, 直接make随便一个module即可.
cmake文件会生成在源码根目录的out/development/ide/clion下

1.2. 使用clion导入native工程

可以直接看单module,
file->new cmake project from sources

但多个module 需要手动写cmake 引进子的module, 重复工作量大, 而且soong生成的cmake 同一module包含多个子目标

1
2
drwxrwxr-x  2 mi mi 4096 3月  13 20:51 librecovery-arm64-android
drwxrwxr-x 2 mi mi 4096 3月 13 20:51 librecovery-arm-android

手动添加工作量比较大, 而且是重复工作

这边提供一个脚本
比如我想看 miui-q-cepheus-dev 分支的 bootable/recovery/ system/vold等的源码, 可以这样写

  • 第一个参数: 建立的工程目录
  • 第二个参数: 哪套源码的
  • 第…个参数: 想看的子目录的源码
1
find_and_add_cmake2.py cepheus-q-recovery miui-q-cepheus-dev bootable/recovery system/vold bionic/libc system/core/base system/core/fs_mgr system/core/crypto_test system/security/keystore system/gatekeeper system/core/libcutils system/core/init frameworks/base/media/jni

规则是 第一个参数: 工程目录位于~/program/cmake_work_space下, 建新的工程都会在该目录下创建工程的根目录
第二个参数, 源码的根目录在 ~/work_space下, 这些文件夹可以自己修改脚本指定

1.3. clion导入工程

上面建的工程位于~/program/cmake_work_space下, clion 菜单 File->new cmake project from sources, 点击之前通过脚本建立的CMakeLists.txt文件导入, 点击Open Existing Project即可, 等待symbol加载完成.

2. clion gdb remote debug native源码

2.1.1. 手机端设置gdbserver

1
2
3
4
5
# 进程已经启动的情况下
ps -e ; #查找native进程的pid
gdbserver64 --attach :8888 <pid>
# 进程未启动情况下
gdbserver64 :8888 /system/bin/recovery

pc 端

1
adb forward tcp:8888 tcp:8888

2.1.2. clion 端配置

参考下图
Run->Edit Configurations

  • Templates


注意上面的几个参数都要配置正确

  • gdb: 源码下的prebuilts/gdb/linux-x86/bin/gdb
  • target remote args tcp:127.0.0.1:8888
  • path mappings: 注意映射完整路径

3. vscode gdb remote debug

将prebuilts/gdb/linux-x86/bin/gdb 和 gdb orig 链接到环境变量下的系统目录中,或者单独加入到环境变量下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Remote Launch",
"type": "cppdbg",
"request": "launch",
"miDebuggerServerAddress": "127.0.0.1:8888",
"program": "/home/mi/work_space/miui-q-umi-dev/out/target/product/cmi/symbols/exaid/root/sbin/exaid",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"sourceFileMap": {
"bootable/exaid": "/home/mi/work_space/miui-q-umi-dev/bootable/exaid"
},
"logging": {
"trace": true,
"traceResponse": true,
"engineLogging": true,
},
"MIMode": "gdb",
}
]
}

gdb init

1
2
3
define target hookpost-remote
set solib-absolute-prefix /home/mi/work_space/miui-r-umi-dev/out/target/product/cmi/symbols/
end

stl 支持

默认情况下不支持stl 输出, 需要gdb支持python脚本, 一般需要自己编译.

另外需要定制gdbinit, android上废弃了stlport和gnustl的支持, 只支持libc++的方式集成stl.

所以python解析脚本是基于libc++开发的, 这里提供一下github上的一个脚本

https://github.com/koutheir/libcxx-pretty-printers

同时, vscode的launch.json也要配置打开 pretty-printers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Remote Launch",
"type": "cppdbg",
"request": "launch",
"miDebuggerServerAddress": "127.0.0.1:8888",
"program": "/home/mi/work_space/miui-r-umi-dev/out/target/product/cmi/symbols/system/bin/test_code_aaaaaaa",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"sourceFileMap": {
"system/core/crypto_test": "/home/mi/work_space/miui-r-umi-dev/system/core/test_code"
},
"logging": {
"trace": true,
"traceResponse": true,
"engineLogging": true,
},
"MIMode": "gdb",
"miDebuggerPath": "/home/mi/Programs/gdb/bin/aarch64-linux-android-gdb",
//"miDebuggerPath": "/home/mi/work_space/miui-r-umi-dev/prebuilts/gdb/linux-x86/bin/gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
],
}
]
}