拉取本项目,然后执行下面的命令
git submodule init
git submodule update --remote
如果是想手工配置,则执行下面的脚本
./init-submodules.sh
编译执行下面的脚本即可,产物位于build
文件夹,注意只有单个so,部分依赖为静态编译,具体请阅读CMakeLists.txt
记得先修改ANDROID_NDK
路径,如果要编译Android 10的版本,请将ANDROID_PLATFORM
修改为android-29
./build.sh
关于shim_files
的构成:
-
liblog
- 这个下面的头文件其实就是从
system/logging
拿过来的 - 为了能编译出在Android10上使用的库,给
include/android/log.h
添加了一些Android10上没有的函数声明 - 测试暂时没有出现崩溃迹象
- 这个下面的头文件其实就是从
-
libunwindstack
- 项目所需要的源码是从
android14-release
分支拉取的,Demangle.cpp
有rust相关的内容,这里去掉了 ThreadUnwinder.cpp
中有关struct sigaction
的初始化会被编译器报警告,这里改了一下
- 项目所需要的源码是从
本方案编译实现主要参考了以下两个项目,感谢:
- https://github.com/cinit/libunwindstack
- https://github.com/Mufanc/libunwindstack-standalone
- 同步AOSP
- 在AOSP源码文件夹下创建
system/extras/unwinddaemon
文件夹 - 将本项目的
Android.bp
和main.cpp
放入上一步创建的文件夹 - 在AOSP源码文件夹下打开终端,执行下面的命令进行编译
. build/envsetup.sh lunch aosp_arm64-eng mmma system/extras/unwinddaemon
- 编译成功后,产物在
out/target/product/generic_arm64/system/bin/unwinddaemon
将out/target/product/generic_arm64/system/bin/unwinddaemon
推送到手机的/data/local/tmp
,授予可执行权限
然后执行/data/local/tmp/unwinddaemon
即可
hook_open_with_stack.py
是配合bcc修改使用的demo
bin/unwinddaemon
是预编译好的,但不一定兼容
bcc修改参见
原理,代码修改等,请查阅eBPF on Android之实现基于dwarf的用户态栈回溯
编译lib.cpp
得到的产物如下,在SeeFlowerX/stackplz中使用
ld-android.so
libbase.so
libc++.so
libdl.so
liblog.so
liblzma.so
libm.so
libstackplz.so
libunwindstack.so