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 ]。
-
这里导入 我们同步的 aosp 源码所在的目录。
-
配置对应的工程。
- 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 开始编译模块依赖
编译过程中…
编译依赖完成
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
我们这里简单阅读一下在 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
此时我们就可以正常去调试 我们的蓝牙服务对应的进程了。
3.2 调试 native 进程
asfp 不但可以调试我们的java 进程, 还同时可以调试 对应的native 进程。那我们该如何配置asfp 去调试 native 进程。
关键点就是告诉 asfp 我们的符号表在哪里。
具体步骤如下:
- 新建一个 调试配置
-
将其命名为 debug_native_java
- 只需要配置我红色箭头标识的地方
- 符号表路径根据自己实际编译的路径来指定。
-
attach debug process.
-
我在蓝牙扫描对应的native 打了一个断点。 触发蓝牙扫描即可回溯到对应的调用栈。