android 15 源码分析【环境搭建: asfp 调试framework-java 与 native】
Android Studio for Platform (ASfP) 是面向使用 Soong 构建系统进行构建的 Android 开源项目 (AOSP) 平台开发者的 Android Studio IDE 版本。ASfP 包含以下功能:settings。
1. ASfP
1.1 ASfP 介绍
Android Studio for Platform (ASfP) 是面向使用 Soong 构建系统进行构建的 Android 开源项目 (AOSP) 平台开发者的 Android Studio IDE 版本。ASfP 包含以下功能:
-
settings
项目设置向导
配置
lunch目标和平台模块。 -
code
多语言支持
在同一 IDE 中修改 C++、Kotlin 和 Java 编程语言。
-
bug_report
Java 和 C++ 调试支持
将调试程序连接到 Android 进程以调试 Java 和 C++ 代码。
1.2 安装
通过如下网址下载最新的 asfp
https://developer.android.google.cn/studio/platform?hl=en
- 下载完成后, 使用 apt 安装。
sudo apt install ./asfp-current-linux.deb
- 安装完毕后, 打开 asfp 根据提示安装 SDK。
- sdk 安装结束后,会出现如下界面,代表安装完成。

2. 导入 android15 aosp 源码
在实际的工作中,工程师只负责其中的一个模块。如果将所有aosp 代码都导入到 asfp 中, 将会显得很臃肿。不利于我们单模块开发。接下来我以bluetooth 模块导入为例来说明,asfp的使用流程。
- 创建aosp 工程,点击 [ new ]。
![![[asfp-2-1-1.png]]](https://i-blog.csdnimg.cn/direct/090562c77a434ede88c5e7add650bbbf.png)
-
这里导入 我们同步的 aosp 源码所在的目录。
![![[asfp-2-1-2.png]]](https://i-blog.csdnimg.cn/direct/0abd644bffaa413ea1a6bfb24906092e.png)
-
配置对应的工程。
![![[asfp-2-1-3.png]]](https://i-blog.csdnimg.cn/direct/4e02f1570c4e44259e2e1b7faa2870a3.png)
- Lunch target: 填我们编译的目标 aosp_oriole-ap4a-userdebug
- Module paths: 导入我们蓝牙模块相关的源码目录
- /home/leo/sda_1.6TB/android-15.0.0_r11/packages/modules/Bluetooth
- /home/leo/sda_1.6TB/android-15.0.0_r11/frameworks/base
- 点击 Finish 开始编译模块依赖
![![[asfp-2-1-4.png]]](https://i-blog.csdnimg.cn/direct/459f027033934f8d9d1f26a14edcf1c6.png)
编译过程中…![![[asfp-2-1-5.png]]](https://i-blog.csdnimg.cn/direct/558d7a7ed8ce46eb8ce661893d985394.png)
编译依赖完成![![[asfp-2-1-6.png]]](https://i-blog.csdnimg.cn/direct/d66f3b743256422a9ecc1aabcd06ae2b.png)
3. 调试
3.1 调试 java 程序
当我们 选择一个 进程来 attach debug 时, 我们发现没有任何一个进程。
有的 朋友就开始怀疑是不是我们 asfp 哪里的配置不对导致的。其实并不是,而是自从android 13 开始, userdebug 构建方式不再支持 attach debug.
- https://android-review.googlesource.com/c/platform/frameworks/base/+/2217921/4/core/java/com/android/internal/os/Zygote.java#1009
![![[asfp-3-1-1.png]]](https://i-blog.csdnimg.cn/direct/f389f885118e4006ba1a2123417d4f34.png)
我们这里简单阅读一下在 aosp 15 中,对应的代码改动。
- android-15.0.0_r11/frameworks/base/core/java/com/android/internal/os/Zygote.java
static void applyDebuggerSystemProperty(ZygoteArguments args) {
if (Build.IS_ENG || (Build.IS_USERDEBUG && ENABLE_JDWP)) {
args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_JDWP;
// Also enable ptrace when JDWP is enabled for consistency with
// before persist.debug.ptrace.enabled existed. args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_PTRACE;
}
if (Build.IS_ENG || (Build.IS_USERDEBUG && ENABLE_PTRACE)) {
args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_PTRACE;
}
}
从Zygote.java 中我们可以清楚的看到:
- 只有在 eng build方式下才支持 Zygote.DEBUG_ENABLE_JDWP
- 如果是在 userdebug 支持 DEBUG_ENABLE_JDWP 需要同时满足 ENABLE_JDWP 条件
private static final boolean ENABLE_JDWP = SystemProperties.get(
"persist.debug.dalvik.vm.jdwp.enabled").equals("1");
从代码中看到,如果要调试 aosp15, 有三种方式:
- 方式一:重新编译 aosp_oriole-ap4a-eng
- userdebug :
- 方式二: 设置系统属性 persist.debug.dalvik.vm.jdwp.enabled 为 1
- 方式三: 修改源码,将 Build.IS_ENG || (Build.IS_USERDEBUG && ENABLE_JDWP 改为只判断 Build.IS_ENG || Build.IS_USERDEBUG
这里我们选择方式二:
oriole:/ # setprop persist.debug.dalvik.vm.jdwp.enabled 1
leo@leo:~$ adb reboot
leo@leo:~$ adb kill-server
![![[asfp-3-1-2.png]]](https://i-blog.csdnimg.cn/direct/85b7bc4db2aa45dc94ba1805dcbf90ee.png)
此时我们就可以正常去调试 我们的蓝牙服务对应的进程了。
![![[asfp-3-1-3.png]]](https://i-blog.csdnimg.cn/direct/962710cfea3b4b67a675d0d458e9e8dd.png)
3.2 调试 native 进程
asfp 不但可以调试我们的java 进程, 还同时可以调试 对应的native 进程。那我们该如何配置asfp 去调试 native 进程。
关键点就是告诉 asfp 我们的符号表在哪里。
具体步骤如下:
- 新建一个 调试配置
![![[asfp-3-2-1.png]]](https://i-blog.csdnimg.cn/direct/4b898e386284461abe5537e7af3f074c.png)
![![[asfp-3-2-2.png]]](https://i-blog.csdnimg.cn/direct/453c46c405f3464fa55145b030738563.png)
![![[asfp-3-2-3.png]]](https://i-blog.csdnimg.cn/direct/2e75ec19a8424246b1c6c367ed111cb6.png)
-
将其命名为 debug_native_java
- 只需要配置我红色箭头标识的地方
- 符号表路径根据自己实际编译的路径来指定。
![![[asfp-3-2-4.png]]](https://i-blog.csdnimg.cn/direct/9dcaae3b16614bc0a562b2b22b2f2ddd.png)
-
attach debug process.
![![[asfp-3-2-5.png]]](https://i-blog.csdnimg.cn/direct/deddbe969ade48edacf508f8e1c57c23.png)
-
我在蓝牙扫描对应的native 打了一个断点。 触发蓝牙扫描即可回溯到对应的调用栈。
![![[asfp-3-2-6.png]]](https://i-blog.csdnimg.cn/direct/1a5d9df4a9cf48309a42a164b3d5a585.png)
更多推荐
所有评论(0)