android 15 源码分析【环境搭建: asfp 调试framework-java 与 native】

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

  1. 下载完成后, 使用 apt 安装。
 sudo apt install ./asfp-current-linux.deb
  1. 安装完毕后, 打开 asfp 根据提示安装 SDK。
  2. sdk 安装结束后,会出现如下界面,代表安装完成。
    在这里插入图片描述

2. 导入 android15 aosp 源码

在实际的工作中,工程师只负责其中的一个模块。如果将所有aosp 代码都导入到 asfp 中, 将会显得很臃肿。不利于我们单模块开发。接下来我以bluetooth 模块导入为例来说明,asfp的使用流程。

  1. 创建aosp 工程,点击 [ new ]。

![[asfp-2-1-1.png]]

  1. 这里导入 我们同步的 aosp 源码所在的目录。
    ![[asfp-2-1-2.png]]

  2. 配置对应的工程。
    ![[asfp-2-1-3.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]]

编译过程中…
![[asfp-2-1-5.png]]

编译依赖完成
![[asfp-2-1-6.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]]

我们这里简单阅读一下在 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 中我们可以清楚的看到:

  1. 只有在 eng build方式下才支持 Zygote.DEBUG_ENABLE_JDWP
  2. 如果是在 userdebug 支持 DEBUG_ENABLE_JDWP 需要同时满足 ENABLE_JDWP 条件

private static final boolean ENABLE_JDWP = SystemProperties.get(  
                      "persist.debug.dalvik.vm.jdwp.enabled").equals("1");

从代码中看到,如果要调试 aosp15, 有三种方式:

  1. 方式一:重新编译 aosp_oriole-ap4a-eng
  2. userdebug :
    1. 方式二: 设置系统属性 persist.debug.dalvik.vm.jdwp.enabled 为 1
    2. 方式三: 修改源码,将 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]]

此时我们就可以正常去调试 我们的蓝牙服务对应的进程了。

![[asfp-3-1-3.png]]

3.2 调试 native 进程

asfp 不但可以调试我们的java 进程, 还同时可以调试 对应的native 进程。那我们该如何配置asfp 去调试 native 进程。

关键点就是告诉 asfp 我们的符号表在哪里。

具体步骤如下:

  1. 新建一个 调试配置

![[asfp-3-2-1.png]]

![[asfp-3-2-2.png]]

![[asfp-3-2-3.png]]

  1. 将其命名为 debug_native_java

    1. 只需要配置我红色箭头标识的地方
    2. 符号表路径根据自己实际编译的路径来指定。
      ![[asfp-3-2-4.png]]
  2. attach debug process.
    ![[asfp-3-2-5.png]]

  3. 我在蓝牙扫描对应的native 打了一个断点。 触发蓝牙扫描即可回溯到对应的调用栈。
    ![[asfp-3-2-6.png]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值