Android平台上,是利用adeb工具来做到bcc工具在Android系统上的快速部署。一旦bcc工具在Android系统上部署完毕,我们就会很方便地利用现有的ebpf工具,进行系统开发或者调试。
另外,也可以在部署好的bcc环境里面,做自己的ebpf工具定制开发。
adeb主页:https://github.com/joelagnel/adeb
bcc工具主页:https://github.com/iovisor/bcc
adeb又名androdeb, 它在Android手机上,搭建了一个基于命令行的debian操作系统,就是可以使手机同时跑Android系统和debian系统。
用户通过chroot的方式,即可在手机里登录到该debian系统里面。在该系统里,可以干任何我们在debian系统里面干的事情。比如vim编辑文件,用gcc或者其他编译工具
开发c, perl或者Python程序,还有可以用apt-get去远程下载安装缺失的软件包。
该系统现在已经自带有bcc工具包。
所以我们可以一边在手机Android桌面上跑比如androbench 测试app,一边chroot到debian系统里面用bcc工具分析androbench产生的IO workload状况。
bcc工具目前支持的平台和Android版本是有限的,该工具如果要成功运行起来,手机需要满足以下条件
硬件方面:
必须是arm64平台,手机data分区剩余空间得大于2GB。
软件方面:
Android版本得是大于或者等于N,并且能够成功执行adb root.
内核必须是4.9或者以上的版本,必须得成功开启如下配置项:
CONFIG_KPROBES=y
CONFIG_KPROBE_EVENT=y
CONFIG_BPF_SYSCALL=y
CONFIG_IKHEADERS=y
1: 开启待运行bcc工具的内核里面ebpf支持,只需要打开上面提的4个内核配置项即可。
以e1-q版本为例,带如下changes,还有环境变量:TEMPORARY_DISABLE_PATH_RESTRICTIONS=true,重打包即可。
modify gen_kheaders.sh for ebpf support
add ebpf support
2: 下载adeb和bcc工具包, 把adeb.tgz和androdeb-fs.tgz下载到主机端,解压adeb.tgz,解压后的目录为adeb。
3: 部署bcc环境到手机端,执行命令如下:
cd adeb
sudo ln -s $(pwd)/adeb /usr/bin/adeb
adeb prepare --archive /XXX/androdeb-fs.tgz (该文件即为上面步骤中已下载的bcc工具包)
4: 执行命令:adeb shell opensnoop,检验是否可以成功在手机里面运行bcc工具。
如果无报错,能成功运行的话,说明手机的bcc开发环境已经搭建成功了。
手机能正常执行adb shell时,只要执行adeb shell,便可进入bcc开发环境中。
1: 使用介绍
该环境中已经自带很多ebpf工具,可以直接用来做Android系统调试开发工作,具体使用方法详见另外一篇博文中的现有ebpf工具介绍一节。
BCC工具在手机Android系统开发方面的优势
2: 常见的错误及解决方法
Exception: Failed to compile BPF text
这个是因为ebpf工具要正常运行,得有内核头文件的支持。如今内核头文件存在于Android系统/proc/kernel/kheaders.tar.xz文件中。
报上面错误,是因为或者上面的kheader文件本身就不存在,或者bcc工具不能正确解压该kheader压缩包,使用不了里面的内核头文件。
之前在e1-q平台碰到这个错误的原因是bcc工具不能正确解压kheader压缩包,解决方法正是带上面提的changes :899508和
环境变量:TEMPORARY_DISABLE_PATH_RESTRICTIONS=true,去重新编译内核。
带环境变量的原因详见下面链接:
https://android.googlesource.com/platform/build/+/master/Changes.md#PATH_Tools
由于手机里面的各种业务场景千变万化,现有ebpf工具还不能满足我们的需求,还需要自己针对特殊的业务场景(比如zip解压缩,androbench测评)去做新的ebpf工具。
1:ebpf工具实现原理
现有的ebpf工具是由Python脚本做成的,内部由Python 代码区和BPF program区组成。
Python 代码区:
1) 调用一些特殊的Python库接口,该接口是native层ebpf接口的进一步抽象封装,可以完成ebpf代码的编译和插入内核执行。
里面完成的重要事情有:调用attach_kprobe接口,去把ebpf目标码注入到待跟踪的内核函数中,完成对该内核函数的监控和行为修正。
2) 使用传统的Python工具库接口,比如字典,hash等,完成对监控内核输出数据的进一步统计和条件过滤工作。
BPF program区:
该区域是以bpf_text="""开头,以"""结尾的,里面是C语言代码,主要完成自定义内核监控或者调试行为。
2:ebpf工具开发指南
FAQ:
https://github.com/iovisor/bcc/blob/master/FAQ.txt
bcc开发Reference Guide:
https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md
bcc Tutorial:
https://github.com/iovisor/bcc/blob/master/docs/tutorial.md
bcc Python Developer Tutorial:
https://github.com/iovisor/bcc/blob/master/docs/tutorial_bcc_python_developer.md