如何在Android中编译eBPF程序?是否需使用adeb和bcc工具?
Android系统编译eBPF程序操作指南
首先明确:adeb和bcc不是编译eBPF程序的必选依赖,两者属于调试类工具链组件,你可以根据自己的使用场景选择对应的编译方案。
场景1:基于AOSP源码树编译(官方推荐方案)
该方案符合Android系统eBPF规范,编译产物可直接内置到系统镜像,自动适配系统的eBPF加载逻辑、SELinux权限规则,适合做系统级eBPF功能开发。
- 确认基础条件:目标设备运行Android 11及以上版本,对应内核版本≥4.14,且已开启eBPF相关内核配置(
CONFIG_BPF=y、CONFIG_BPF_SYSCALL=y、CONFIG_BPF_JIT=y等,AOSP通用内核默认已开启这类配置)。 - 将编写完成的eBPF源码(
.c后缀)放到AOSP的system/bpf/progs/目录,或你自定义的模块目录下。 - 编写对应
Android.bp编译规则,示例如下:
bpf { name: "demo_bpf_prog.o", srcs: ["demo_bpf_prog.c"], cflags: [ "-Wall", "-Werror", ], }
- 执行编译命令:
m demo_bpf_prog.o,编译产物会生成在AOSP输出目录的system/etc/bpf/路径下。 - 若需要将程序打包到系统镜像,在对应产品的mk配置文件中添加
PRODUCT_PACKAGES += demo_bpf_prog.o即可。
场景2:脱离AOSP树独立编译
该方案适合不需要做系统内置,要把eBPF程序作为第三方应用组件使用的场景,无需下载完整AOSP源码。
- 准备r21及以上版本的Android NDK,该版本开始NDK自带的clang已经支持bpf编译目标。
- 参考如下命令执行编译:
<NDK存放路径>/toolchains/llvm/prebuilt/<主机平台>/bin/clang \ -target bpfel -g -O2 -c demo_bpf_prog.c -o demo_bpf_prog.o \ -I<NDK存放路径>/sysroot/usr/include \ -I<NDK存放路径>/sysroot/usr/include/aarch64-linux-android
- 该方式编译的eBPF程序,需要目标设备已root,或你的应用持有
CAP_BPF权限才能正常加载运行。
adeb和bcc的适用场景
两者更适合临时调试、快速验证eBPF功能的场景:
- adeb可以在不刷机的前提下,快速给Android设备搭建一个包含完整eBPF工具链的Debian运行环境,默认集成bcc工具集。
- bcc支持编写Python+嵌入式C结构的eBPF程序,无需提前编译为
.o文件,运行时动态编译加载,调试效率更高。 - 该方案的缺点是依赖设备root权限,产出的程序无法直接集成到正式系统或应用中,仅适合调试场景使用。
注意:无论使用哪种编译方案,都需要确保目标设备内核开启了对应eBPF程序类型的配置,比如开发tracepoint类型的eBPF程序,需要内核开启
CONFIG_BPF_EVENTS=y配置。
内容的提问来源于stack exchange,提问作者jalee0606
相关产品推荐
相关产品推荐

