NDK编译系列:高频编译选项详解

NDK编译系列:高频编译选项详解

    • 前言
    • 正文

NDK编译系列文章

  1. NDK编译系列:简介及环境搭建,link
  2. NDK编译系列:构建C/CPP工程,link
  3. NDK编译系列:高频编译选项详解,link

前言


上篇文章【NDK编译系列:C/CPP工程构建】总结了构建可执行exe或库文件lib时的基本过程和脚本模板,但后台有读者私信一些编译选项的问题,故本文在此做一些小结。

正文


常见NDK编译C代码配置选项

  • 是否打开neon优化
  • 地址消毒选项
  • 时间复杂度优化等级选择
  • fuzz测试

打开NEON优化

android.mk中,添加以下语句:

LOCAL_CFLAGS += -mfpu=neon -mfloat-abi=softfp -mcpu=cortex-a53

即可启动硬件加速优化(前提是代码做了NEON指令集优化),提速效果明显。

mcpu参数指定的是对应ARM的cortex平台,一般cortex-a53对应armv8a,地址宽度64比特。cortex-a7对应armv7,地址宽度为32比特。armv8比v7代数更晚,效果更好。

打开地址越界选项

android.mk中,添加以下语句:

LOCAL_CFLAGS += -fsanitize=undefined,address -fno-omit-frame-pointer

即可开启地址消毒功能,以查看软件运行过程中是否出现地址越界、内存泄漏及未定义行为等问题,根据挂死断点可迅速排查到bug所在,十分方便。

但要注意的是,开启该功能后,由于运行过程会打桩记录大量数据,开销会大幅增加,仅适用于debug时打开。

时间复杂度优化等级选择

android.mk中,添加以下语句:

LOCAL_CFLAGS += -O2 -fPIC -Wall -pie -FPIE

优化等级中,最常用的是O2,按优化程度从低到高分别有:O0、O1、O2、O3。

  • O0等级,不做任何代码优化
  • O1等级,会做一些基础代码优化
  • O2等级,会优化一些高阶的如for循环展开
  • O3等级,最烈度的优化,可能会导致与O0有精度差异,且经常编译会报错

其他配置选项加上也可以增加代码运行提示和生成效率。

打开fuzz测试

android.mk中,添加以下语句:

LOCAL_CFLAGS += -g -O0
LOCAL_CFLAGS += -fsanitize=fuzzer,undefined,address -fno-omit-frame-pointer
LOCAL_LDFLAGS += -fsanitize=fuzzer,undefined,address

即可开启fuzz测试功能,前提是ndk为r21及以上版本编译,-fsanitize=fuzzer需要再编译和链接时均加上,同时开启地址消毒便于快速定位bug。

fuzz测试的优势是能自动生成大量用例,暴力测试极端场景,能快速暴露隐藏问题。由于需要单独适配写一个调度文件才能使用,其具体使用经验后面可以进一步展开。

你可能感兴趣的:(经验总结,android,ndk,编译构建)