android.iml
和 android.ipr
两个文件
1
2
3
4
5
6
7
8
|
# 在源码根目录执行
source build
/
envsetup.sh
lunch
22
mmm development
/
tools
/
idegen
# or make idegen
sudo development
/
tools
/
idegen
/
idegen.sh
sudo chmod
777
android.iml
sudo chmod
777
android.ipr
|
sudo deepin-editor android.iml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<excludeFolder url
=
"file://$MODULE_DIR$/bionic"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/bootable"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/build"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/cts"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/dalvik"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/developers"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/development"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/device"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/docs"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/external"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/hardware"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/kernel"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/out"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/pdk"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/platform_testing"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/prebuilts"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/sdk"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/system"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/test"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/toolchain"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/tools"
/
>
<excludeFolder url
=
"file://$MODULE_DIR$/.repo"
/
>
|
Open an existing Android Studio project
选项选择源码根目录的android.ipr
就可以导入源码代号 | 版本 | API 级别/NDK 版本 |
---|---|---|
Android13 | 13 | API 级别 33 |
Android12L | 12 | API 级别 32 |
Android12 | 12 | API 级别 31 |
Android11 | 11 | API 级别 30 |
Android10 | 10 | API 级别 29 |
Pie | 9 | API 级别 28 |
Oreo | 8.1.0 | API 级别 27 |
Oreo | 8.0.0 | API 级别 26 |
Nougat | 7.1 | API 级别 25 |
Nougat | 7.0 | API 级别 24 |
Marshmallow | 6.0 | API 级别 23 |
1
2
3
|
/
android
/
android
/
android
-
10.0
.
0_r2
/
frameworks
/
base
/
core
/
res
/
AndroidManifest.xml
/
android
/
android
/
android
-
10.0
.
0_r2
/
frameworks
/
base
/
core
/
res
/
res
/
android
/
android
/
android
-
10.0
.
0_r2
/
frameworks
/
base
/
core
/
res
/
assets
|
在源码的根目录创建start_emulator.sh脚本,为了方便的启动模拟器,输入以下内容 后执行
1
2
3
4
5
6
|
#!/bin/bash
source build
/
envsetup.sh
lunch
6
emulator
# sudo chmod 777 ./start_emulator.sh
# ./start_emulator.sh
|
1
2
3
4
5
|
# 第三方app需先以调试模式启动app 点击运行
adb shell am
set
-
debug
-
app
-
w com.example.dexlassloaders
# 等待附加调试 会自动继续运行 直到触发断点
# 系统进程可直接进行附加调试
|
在系统源码找到ActivityStarter这个类,在startActivityMayWait这个方法打断点
点击菜单的Run–>Attach Debugger to Android Process,勾选Show all processer,选择system_process 随便启动app 触发断点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 进入源码目录
cd
/
android
/
android
/
android
-
10.0
.
0_r2
# 先初始化环境 主要为lunch 目标
source build
/
envsetup.sh
lunch
22
# 进入gdbclient.py 脚本目录
cd development
/
scripts
# 调试模式启动 第三方app 此命令需手动点击
adb shell am
set
-
debug
-
app
-
w com.example.dexlassloaders
# 以调试模式启动 无需手动点击
adb shell am start
-
D
-
n com.example.dexlassloaders
/
.MainActivity
# 查看进程pid
adb shell
"ps -ef | grep com.example.dexlassloaders"
# u0_a103 6018 1631 0 18:24:11 ? 00:00:00 com.example.dexlassloaders
# root 6046 1677 0 18:25:54 ? 00:00:00 sh -c ps -ef | grep com.example.dexlassloaders
# root 6049 6046 0 18:25:54 ? 00:00:00 grep com.example.dexlassloaders
# 执行此命令等待 输出 vscode launch.json配置 报错 请检查pid
gdbclient.py
-
p
6018
-
-
setup
-
forwarding vscode
# 没调试完不要 按enter
# 接着使用as 附加调试 或者
adb forward tcp:
12345
jdwp:
6018
# (Where XXX is the PID of the debugged process.)
jdb
-
attach localhost:
12345
|
gdbclient.py -p 6018 --setup-forwarding vscode
输出下面内容 把其中 {} 复制到 VScode launch.json
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
36
37
38
39
40
41
42
|
{
"configurations"
: [
/
/
{} 复制到这里
{
"miDebuggerPath"
:
"/android/android/android-10.0.0_r2/prebuilts/gdb/linux-x86/bin/gdb"
,
"program"
:
"/android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/system/bin/app_process64"
,
"setupCommands"
: [
{
"text"
:
"-enable-pretty-printing"
,
"description"
:
"Enable pretty-printing for gdb"
,
"ignoreFailures"
: true
},
{
"text"
:
"-environment-directory /android/android/android-10.0.0_r2"
,
"description"
:
"gdb command: dir"
,
"ignoreFailures"
: false
},
{
"text"
:
"-gdb-set solib-search-path /android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/system/lib64/:/android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/system/lib64/hw:/android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/system/lib64/ssl/engines:/android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/system/lib64/drm:/android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/system/lib64/egl:/android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/system/lib64/soundfx:/android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/vendor/lib64/:/android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/vendor/lib64/hw:/android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols/vendor/lib64/egl"
,
"description"
:
"gdb command: set solib-search-path"
,
"ignoreFailures"
: false
},
{
"text"
:
"-gdb-set solib-absolute-prefix /android/android/android-10.0.0_r2/out/target/product/generic_x86_64/symbols"
,
"description"
:
"gdb command: set solib-absolute-prefix"
,
"ignoreFailures"
: false
},
{
"text"
:
"-interpreter-exec console \"source /android/android/android-10.0.0_r2/development/scripts/gdb/dalvik.gdb\""
,
"description"
:
"gdb command: source art commands"
,
"ignoreFailures"
: false
}
],
"name"
:
"(gdbclient.py) Attach app_process64 (port: 5039)"
,
"miDebuggerServerAddress"
:
"localhost:5039"
,
"request"
:
"launch"
,
"type"
:
"cppdbg"
,
"cwd"
:
"/android/android/android-10.0.0_r2"
,
"MIMode"
:
"gdb"
}
]
}
|
gdbclient.py -p 6018 --setup-forwarding vscode
执行之后 vscode 附加 发现链接失败时
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
|
# 调试模式启动 第三方app 此命令需手动点击
adb shell am
set
-
debug
-
app
-
w com.example.dexlassloaders
# 以调试模式启动 无需手动点击
adb shell am start
-
D
-
n com.example.dexlassloaders
/
.MainActivity
# 查看进程pid
adb shell
"ps -ef | grep com.example.dexlassloaders"
# u0_a103 6018 1631 0 18:24:11 ? 00:00:00 com.example.dexlassloaders
# root 6046 1677 0 18:25:54 ? 00:00:00 sh -c ps -ef | grep com.example.dexlassloaders
# root 6049 6046 0 18:25:54 ? 00:00:00 grep com.example.dexlassloaders
# 1. 进入手机 shell
adb shell
# 2. 切换root模式 普通手机为su
su
# 3. 手动执行gdbserver
gdbserver64 :
1234
-
-
attach
6018
# 出现下面的表示 附加调试成功
# Remote debugging from host 127.0.0.1
# 4. 重新启动一个终端
# 4.1 进行端口映射
adb forward tcp:
5039
tcp:
1234
# 4.2 按照 获取vscodelunch.json 配置 这个做 配置vscode 检查5039端口
# 5. 启动vscode附加调试 - 先下断点
vscode 按 F5 启动调试 查看调试控制台,应该开始Loaded symbols 了
# 6. 使用as 附加调试或者 执行下面的jdb 开始调试
adb forward tcp:
12345
jdwp:
6018
jdb
-
attach localhost:
12345
|
更多【Android - 系统级源码调试】相关视频教程:www.yxfzedu.com