在 Andorid 上使用 eBPF 程序

本文详述了在Android Studio Emulator中测试Android高版本内核对libbpf CO-RE技术的支持情况。通过构建Debian环境,尝试运行eunomia-bpf工具链,成功案例包括bootstrap和tcpstates,但也遇到如opensnoop因内核选项限制无法运行的问题。测试表明,Android内核对eBPF支持良好,但在Android系统上直接使用eBPF工具仍具挑战。

本文主要记录了笔者在 Android Studio Emulator 中测试高版本 Android Kernel 对基于 libbpf 的 CO-RE 技术支持程度的探索过程、结果和遇到的问题。
测试采用的方式是在 Android Shell 环境下构建 Debian 环境,并基于此尝试构建 eunomia-bpf 工具链、运行其测试用例。

背景

截至目前(2023-04),Android 还未对 eBPF 程序的动态加载做出较好的支持,无论是以 bcc 为代表的带编译器分发方案,还是基于 btf 和 libbpf 的 CO-RE 方案,都在较大程度上离不开 Linux 环境的支持,无法在 Android 系统上很好地运行1

虽然如此,在 Android 平台上尝试 eBPF 也已经有了一些成功案例,除谷歌官方提供的修改 Android.bp 以将 eBPF 程序随整个系统一同构建并挂载的方案2,也有人提出基于 Android 内核构建 Linux 环境进而运行 eBPF 工具链的思路,并开发了相关工具。

目前已有的资料,大多基于 adeb/eadb 在 Android 内核基础上构建 Linux 沙箱,并对 bcc 和 bpftrace 相关工具链进行测试,而对 CO-RE 方案的测试工作较少。在 Android 上使用 bcc 工具目前有较多参考资料,如:

其主要思路是利用 chroot 在 Android 内核上运行一个 Debian 镜像,并在其中构建整个 bcc 工具链,从而使用 eBPF 工具。如果想要使用 bpftrace,原理也是类似的。

事实上,高版本的 Android 内核已支持 btf 选项,这意味着 eBPF 领域中新兴的 CO-RE 技术也应当能够运用到基于 Android 内核的 Linux 系统中。本文将基于此对 eunomia-bpf 在模拟器环境下进行测试运行。

eunomia-bpf 是一个结合了 libbpf 和 WebAssembly 技术的开源项目,旨在简化 eBPF 程序的编写、编译和部署。该项目可被视作 CO-RE 的一种实践方式,其核心依赖是 libbpf,相信对 eunomia-bpf 的测试工作能够为其他 CO-RE 方案提供参考。

测试环境

  • Android Emulator(Android Studio Flamingo | 2022.2.1)
  • AVD: Pixel 6
  • Android Image: Tiramisu Android 13.0 x86_64(5.15.41-android13-8-00055-g4f5025129fe8-ab8949913)

环境搭建3

  1. eadb 仓库 的 releases 页面获取 debianfs-amd64-full.tar.gz 作为 Linux 环境的 rootfs,同时还需要获取该项目的 assets 目录来构建环境;
  2. 从 Android Studio 的 Device Manager 配置并启动 Android Virtual Device;
  3. 通过 Android Studio SDK 的 adb 工具将 debianfs-amd64-full.tar.gzassets 目录推送到 AVD 中:
    • ./adb push debianfs-amd64-full.tar.gz /data/
### 启用 Android 系统中的 eBPF 支持 在 Android 上启用 eBPF 功能需要满足多个条件,包括内核支持、系统配置以及适当的工具链。以下为实现这一目标的关键步骤和注意事项。 #### 内核版本与功能要求 Android 自 9.0 版本起,其内核普遍升级至 Linux 4.x 或更高版本,这为 eBPF 的运行提供了基础保障。eBPF 在现代 Android 设备中已经具备较为全面的支持能力,尤其是在较高版本的 Android 内核中可以发现对 BTF(BPF Type Format)调试信息以及基于 CO-RE(Compile Once – Run Everywhere)机制的 eBPF 程序的良好兼容性[^1]。 要确保设备内核启用了 eBPF 子系统,可以通过检查 `/proc/config.gz` 或直接访问内核源码中的 `CONFIG_BPF` 和 `CONFIG_BPF_SYSCALL` 配置项是否被设置为 `y` 来确认。如果使用的是自定义内核,则需手动开启这些选项以激活 eBPF 支持。 #### 系统级配置 当 Android 启动时,它会自动从 `/system/etc/bpf/` 目录加载所有 eBPF 对象文件,并创建相应的映射结构。随后,这些程序及其关联的映射将被固定到 BPF 文件系统中(通常是 `/sys/fs/bpf/` 路径下),从而允许后续与 eBPF 程序进行交互或读取映射数据[^3]。 为了使能此流程,应确保该目录存在且包含正确的 eBPF ELF 格式对象文件(如 `.o` 文件)。此外,还需正确配置 SELinux 策略规则,避免因权限问题导致加载失败。对于非官方固件或者开发者定制ROM的情况,可能还需要修改 init 脚本以确保加载过程顺利执行。 #### 用户空间工具链准备 尽管 `bpftool` 并非专为 Android 打造,但通过构建适用于 Android 架构的交叉编译环境,仍然可以在设备上部署并利用这一强大工具来管理 eBPF 程序和映射。由于大多数操作涉及内核资源访问,因此通常需要 root 权限才能成功运行相关命令[^1]。 除了 `bpftool` 外,还推荐安装 libbpf 库以及其他必要的开发组件,以便于编写用户态应用程序eBPF 程序通信。例如,可借助 libbpf 提供的 API 实现高效的 map 操作及事件处理逻辑。 #### 安全性和稳定性考量 考虑到 eBPF 程序直接运行于内核上下文中,不当的代码可能导致系统崩溃甚至安全漏洞。因此,在部署任何新的 eBPF 程序之前务必进行全面测试,并遵循最小特权原则限制程序所能访问的资源范围。同时注意监控系统日志输出,及时发现潜在异常行为。 ```bash # 示例:使用 bpftool 查看当前加载的所有 eBPF 程序 bpftool prog show ``` 最后,请记住不同厂商可能会根据自身需求调整默认内核配置,这意味着即使同属相同 Android 版本系列的不同机型也可能表现出差异化的 eBPF 兼容表现。遇到具体问题时建议查阅对应设备的技术文档获取更精确的信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值