android .mk 编译基础知识

把 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

Platform VersionAPI LevelVERSION_CODENotes
Android 6.023MPlatform Highlights
Android 5.122LOLLIPOP_MR1Platform Highlights
Android 5.021LOLLIPOP
Android 4.4W20KITKAT_WATCHKitKat for Wearables Only
Android 4.419KITKATPlatform Highlights
Android 4.318JELLY_BEAN_MR2Platform Highlights
Android 4.2, 4.2.217JELLY_BEAN_MR1Platform Highlights
Android 4.1, 4.1.116JELLY_BEANPlatform Highlights
Android 4.0.3, 4.0.415ICE_CREAM_SANDWICH_MR1Platform Highlights
Android 4.0, 4.0.1, 4.0.214ICE_CREAM_SANDWICH
Android 3.213HONEYCOMB_MR2
Android 3.1.x12HONEYCOMB_MR1Platform Highlights
Android 3.0.x11HONEYCOMBPlatform Highlights
Android 2.3.4
Android 2.3.3
10GINGERBREAD_MR1Platform Highlights
Android 2.3.2 Android 2.3.1
Android 2.3
9GINGERBREAD
Android 2.2.x8FROYOPlatform Highlights
Android 2.1.x7ECLAIR_MR1Platform Highlights
Android 2.0.16ECLAIR_0_1
Android 2.05ECLAIR
Android 1.64DONUTPlatform Highlights
Android 1.53CUPCAKEPlatform Highlights
Android 1.12BASE_1_1
Android 1.01BASE

3. android支持的cpu架构 

例如:APP_ABI := x86
armeabi第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢
armeabi-v7a第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能
arm64-v8a第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bit
x86intel 32位,一般用于平板
x86_64intel 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是一个C语言C++Objective-C、Objective-C++语言的轻量级编译器源代码发布于BSD协议下。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
中文名
Clang
外文名
Clang
隶属项目
LLVM [1] 
相关特征
编译器,兼容GNU规范
可编译
CC++Objective-C



2013年4月,Clang已经全面支持C++11标准,并开始实现C++1y特性(也就是C++14,这是C++的下一个小更新版本)。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。[2] 
Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过__attribute__((overloadable))来修饰函数),其目标(之一)就是超越GCC

5.  APP_PIE

Jelly Bean (4.1)开始,Android的动态链接器支持position-independent executables (PIE),用-fPIE进行编译,这个标志会使得通过随机代码的位置来查找内存损坏的bug更加困难。
默认,ndk-build将自动设置这个值为‘true’,如果你的工程targetsAndroid-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))...)










  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值