把 android常用的 mk 编译过程中的常用参数整理一下,有的是参考网上的,有的是自己总结的。
重点参考,android 开发指南:
https://developer.android.com/ndk/guides/application_mk.html
1. -Wall 编译优化
例如:APP_LDFLAGS += -Wl
-Wall:选项可以打印出编译时所有的错误或者警告信息。这个选项很容易被遗忘,编译的时候,没有错误或者警告提示,以为自己的程序很完美,其实,里面有可能隐藏着许多陷阱。变量没有初始化,类型不匹配,或者类型转换错误等警告提示需要重点注意,错误就隐藏在这些代码里面。
-O0: 表示编译时没有优化。
-O1: 表示编译时使用默认优化。
-O2: 表示编译时使用二级优化。
-O3: 表示编译时使用最高级优化。
-Os:相当于-O2.5优化,但又不所见代码尺寸.
2. android version 和 android API level的对应关系
例如:APP_PLATFORM := android-14
3. android支持的cpu架构
armeabi | 第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢 |
armeabi-v7a | 第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能 |
arm64-v8a | 第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bit |
x86 | intel 32位,一般用于平板 |
x86_64 | intel 64位,一般用于平板 |
mips | 少接触 |
mips64 | 少接触 |
查看设备支持的 CPU 架构或者 APP 提供的 CPU 架构可以使用 Native Libs Monitor。
Android加载so文件规则:
当你只提供了armeabi目录时,armeabi-v7a、arm64-v8a架构的程序都会去armeabi里寻找,而当你同时也提供了armeabi-v7a、armeabi-v8a目录,而里面又不存在对应的so库时,系统就不会再去armeabi里面寻找了,直接找不到报错。其他平台也是如此。这里我踩了不少的坑,切记。
一般来说,一些比较有名的第三方库都会提供armeabi、armeabi-v7a、x86这三种类型的so文件,同时拥有这三种版本的app可以在所有机型上运行。另外,越来越多的SDK会同时提供arm64-v8a版本。只包含armeabi的项目也可以在所有设备上运行。
4.Clang
例如:NDK_TOOLCHAIN_VERSION := clang
-
中文名
- Clang 外文名
- Clang
-
隶属项目
- LLVM [1] 相关特征
- 编译器,兼容GNU规范 可编译
- C,C++,Objective-C
5. APP_PIE
从Jelly Bean (4.1)开始,Android的动态链接器支持position-independent executables (PIE),用-fPIE进行编译,这个标志会使得通过随机代码的位置来查找内存损坏的bug更加困难。
默认,ndk-build将自动设置这个值为‘true’,如果你的工程targets是Android-16或更高。你可以手工的设置它为‘true’或‘false’。
重要:PIE executables不能运行在Android4.1之前的版本上。
注意这个只能运用在可执行程序上。当编译动态或静态库的时候是不起作用的。
6 . 样例
LOCAL_PATH := $(call my-dir)
APP_ABI := x86
APP_BUILD_SCRIPT := $(LOCAL_PATH)/../src/Android.mk
APP_PLATFORM := android-14
USE_CLANG := 1
ifeq ($(strip $(USE_CLANG)),1)
NDK_TOOLCHAIN_VERSION := clang
APP_CFLAGS += -g -Oz
else
NDK_TOOLCHAIN_VERSION := 4.9
APP_CFLAGS += -g -Os
endif
APP_OPTIM := release
APP_PIE := true
APP_CFLAGS += -DAndroid -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden
APP_LDFLAGS += -Wl,--gc-sections -Wl,-Bsymbolic -fPIC -Wl,--no-warn-shared-textrel
APP_CPPFLAGS += -std=c++11 -fexceptions -frtti -DBOOST_ASIO_DISABLE_STD_CHRONO -DBOOST_BUILD_PCH_ENABLED
APP_STL := c++_static
#APP_STL := gnustl_static
Build4Android_split := 1
# -ftime-report -fstrict-aliasing -fprefetch-loop-arrays
BuildSuportHttps := 1
$(info build info is compiler($(NDK_TOOLCHAIN_VERSION)) STL($(APP_STL)) SuportHttps($(BuildSuportHttps))...)