Android 源码为了区分不同的厂商 vendor 引入了 HAL 。 我们在读 hardware 层静态代码时,很难捋清楚从 framework 层到 hardware 层的代码执行流程。
通过打印堆栈信息,能帮助我们快速定位代码执行流程。
Android CPP 打印堆栈信息
Android.mk 中添加
LOCAL_C_INCLUDES += $(TOP)/frameworks/native/include/
LOCAL_SHARED_LIBRARIES += libcutils libutils
在源码中添加:
void func()
{
...
android::CallStack Stack("testStack");
...
}
定位堆栈信息
例如: log
#06 pc 0000d24b /system/lib/libutils.so (android::Thread::_threadLoop(void*)+274)
#07 pc 0004769f /system/lib/libc.so (__pthread_start(void*)+22)
#08 pc 0001b015 /system/lib/libc.so (__start_thread+32)
在 Android 源码编译环境执行如下命令:
addr2line -ae out/target/product/xxx/symbols/system/lib/libc.so 0001b015
打印如下图所示, 堆栈信息能定位到某个文件的哪一行。
如此一来, 能快速梳理 Android 项目中代码调用流程,并定位BUG 。