You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Clang构建App时,通过Build.gradle配置Address Sanitizer遇阻

配置Android项目中Address Sanitizer(ASAN)的完整Gradle流程

我来帮你理清楚用Gradle配置ASAN的完整步骤,这玩意儿刚开始接触确实容易搞混,我当初踩过不少坑,下面把三种启用方式的细节和注意事项都给你掰明白:

前提准备

首先得确认几个基础条件:

  • 你的项目基于NDK构建(CMake或ndk-build都可以)
  • 目标Android版本至少是7.0(API 24),ASAN不支持更低版本
  • NDK版本建议用r21及以上,兼容性和稳定性更好

第一种:手动添加编译/链接旗标(最基础的方式)

这种方式就是你提到的,直接在cppFlags里加-fsanitize=address,但要注意编译和链接阶段都要配置,还要加辅助旗标提升调试体验:

针对CMake项目

在模块的build.gradle中修改externalNativeBuild配置:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                // 添加ASAN编译旗标,-fno-omit-frame-pointer用来生成清晰的堆栈跟踪
                cppFlags "-fsanitize=address -fno-omit-frame-pointer"
                // 必须指定ASAN支持的ABI:armeabi-v7a, arm64-v8a, x86, x86_64
                abiFilters 'arm64-v8a', 'x86_64'
            }
        }
    }
}

针对ndk-build项目

可以在build.gradle中配置:

android {
    defaultConfig {
        externalNativeBuild {
            ndkBuild {
                cppFlags "-fsanitize=address -fno-omit-frame-pointer"
                abiFilters 'arm64-v8a', 'x86_64'
            }
        }
    }
}

或者直接在Android.mk里添加(更灵活):

LOCAL_CFLAGS += -fsanitize=address -fno-omit-frame-pointer
LOCAL_LDFLAGS += -fsanitize=address

第二种:用AGP内置的ASAN配置(推荐,AGP 4.0+支持)

Android Gradle Plugin 4.0之后提供了更简洁的配置方式,不用手动写编译旗标,Gradle会自动处理所有细节:

android {
    buildTypes {
        debug {
            // 直接启用ASAN
            sanitizer {
                address.enable = true
            }
            // 指定支持的ABI,避免编译不兼容的版本
            ndk {
                abiFilters 'arm64-v8a', 'x86_64'
            }
        }
    }
}

这种方式的好处是:Gradle会自动添加编译/链接旗标、打包ASAN运行时库,还能避免手动配置的遗漏,强烈推荐用这个。


第三种:在构建脚本中直接配置(CMakeLists.txt/Application.mk)

如果你需要更精细的控制,比如只给特定模块启用ASAN,可以直接在CMake或ndk-build的脚本里配置:

CMakeLists.txt示例

# 给C和C++代码添加ASAN编译旗标
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")

# 给链接阶段添加ASAN旗标
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")

Application.mk示例(ndk-build)

APP_CFLAGS += -fsanitize=address -fno-omit-frame-pointer
APP_LDFLAGS += -fsanitize=address
# 指定支持的ABI
APP_ABI := arm64-v8a x86_64

运行与验证注意事项

  • 仅在Debug构建中启用:ASAN会大幅增加APP的内存占用和运行开销,绝对不要用在Release版本里
  • 查看错误日志:运行APP后,一旦出现内存问题(越界访问、内存泄漏等),Logcat会输出详细的错误信息,包括完整的堆栈跟踪,直接搜索AddressSanitizer就能找到
  • 低版本兼容:如果你的项目需要支持API 24以下的设备,记得通过abiFilters或者构建变体,只给高版本设备编译ASAN版本

内容的提问来源于stack exchange,提问作者downstroy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:15:18