官网文档介绍了如何使能Address Sanitizer和运行时控制它的行为
https://developer.android.google.cn/ndk/guides/asan?hl=zh-cn
https://source.android.google.cn/devices/tech/debug/asan?hl=zh_cn
https://github.com/google/sanitizers/wiki
本文接下来主要是对官网的补充:
1、Android.bp构建Native代码时如何使能Address Sanitizer功能
cc_library_shared {
name: "libnative_test",
cflags: [
"-fno-omit-frame-pointer",
"-O0",
],
sanitize: {
address: true;//使能Address Sanitizer
hwaddress: true;//使能HW Address Sanitizer
},
}
cflags增加"-fno-omit-frame-pointer"和"-O0"选项,为了让打印的栈信息更清晰
address和hwaddress字段不能一起使能,
2、AndroidManifest.xml中android:extractNativeLibs=true如果不配置采用默认值可能会出现APK安装失败
需要明确指定,否则选择不同的最小SDK版本导致将导致该默认值不一致具体详见的链接《关于android:extractNativeLibs的默认值》
3、APK源码目录需要增加asan动态库,库完整名称是"libclang_rt.asan-aarch64-android.so",如果是hwasan则是"libclang_rt.hwasan-aarch64-android.so"
4、wrap.sh导致APK启动白屏
使用AndroidStuidio按照官网目录创建wrap.sh文件后,文件的格式是DOS格式,Android上运行的shell脚本必须是unix格式,需要进行格式转换否则APK启动失败,APK一直白屏。
https://github.com/google/sanitizers/issues/1023
5、wrap.sh的运行原理
zygote首先启动wrap.sh,wrap.sh配置环境变量一起其他启动APK前想做的其他处理然后启动APK。可以通过Wrap.sh修改ASAN_OPTIONS的值,控制Address Sanitizer的运行时。比如“ASAN_OPTIONS=detect_container_overflow=0,detect_odr_violation=0”;这里是关闭容器溢出访问和odr_violation检查。
6、异常输出
当Address Sanitizer检测到异常时,异常信息会输出到Logcat,TAG是“wrap.sh”。