Android.mk文件和Application.mk文件詳解
相同點:都是輕量級 Makefile(Makefile文件定義一些列指令,指定文件編譯順序,類似shell腳本)
Application:
位置:通常在 $PROJECT/jni目錄下
作用:配置所有modules的編譯變量在 APP_ABI := xxx xxx xxx 設置中間有空格
可以設置一個或多個ABI對應的指令集
指令集合(armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips,mips64,all) all全部對應
關於指令集的選擇:
armeabi-v7a兼容armeabi
x86手機因兼容性基本都使用libhoudini模塊,兼容arm指令集
64位默認兼容32位abi的so
所以:對大小嚴格要求選擇 armeabi,對性能也有要求添加 x86
APP_OPTM(編譯模式)
默認release 可修改為debug
Android.mk文件
包含:
1. 宏:my-dir,all-subdir-makefiles等 在$(call <function>)調用,返回文本信息
2. 變量:CLEAR_VARS,BUILD_SHARED_LIBRARY,TARGET_ARCH等,NDK提供,在Android.mk被解析前存在
3. 模塊描述變量:LOCAL_PATH,LOCAL_MODULE,LOCAL_SRC_FILES等(LOCAL_前綴),除LOCAL_PATH外其余都在include $(CLEAR_VARS)和include $(BUILD_XXX)之間。
LOCAL_PATH(當前目錄):
my-dir:通常最后一次包含Makefile文件路徑,通常是Android.mk所在路徑
CLEAR_VARS(變量清除):
除LOCAL_PATH外的其余在include $(CLEAR_VARS)和include $(BUILD_XXX)之間的變量
BUILD_EXECUTABLE
LOCAL_MODULE(module名稱)
LOCAL_SRC_FILE(源碼文件)
BUILD_SHARED_LIBRARY(動態編譯) BUILD_STATIC_LIBRARY(靜態編譯)
PREBUILD_SHARED_LIBRARY(動態預編譯) PREBUILD_STATIC_LIBRARY(靜態預編譯)
BUILD_EXECUTABLE(生成可執行的文件)
TARGET_ARCH_ABI(目標ABI名稱)
LOCAL_LDLIBS(鏈接庫)
用額外鏈接選項,所有庫都有“-l”前綴,可同時列出空格隔開
LOCAL_CFLAGS,LOCA_CPPFLAGS和LOACL_LDFLAGES(編譯,鏈接標志)
LOCAL_CFLAGS: 編譯C/C++傳遞給編譯器的標志集合
LCOAL_CPPFLAGS: 只支持C++傳遞給編譯器的標志集合
LOCAL_LDFLAGES: 傳遞給連接器的額外參數
編譯選項格式(LOCAL_CPPFLAGES += XXX)
1.-fexception:NDK異常處理默認禁止,可以編譯帶異常處理的C++代碼
2.-ftti:NDK默認不支持C++RTTI,可以編譯帶RTTI的C++代碼
3.-fvisibility=hidden:隱藏不需要導出的函數,若某個函數需要導出添加JNIEXPROT或者__attribute__((visibility(“default”)))即可
4.-lfunction-section:默認編譯文件.o中代碼部分只有.text段,會使每個函數都單獨
有一個段。對鏈接后代碼大小並沒有影響
5.-fdata-section:同上每個data都有一個單獨的段
6.-Wl—gc-sections:使用連接器ld鏈接時刪除不用的段
-Wl,<option>告訴編譯器,后邊選項<option>傳遞給連接器
7.-fPIC:PIC(position independent code)用於編譯位置無關代碼,生成可用於共享庫的位置獨立代碼。若不添加-fPIC,加載so文件的代碼段時,代碼段引用的數據對象需要重
定位,重定位會修改代碼段內容,造成,沒有調用這個so,代碼段的進程在內核中會產生着個文件拷貝。
8.-Wall:(wring all)編譯和鏈接中顯示所有警告信息
關閉PIE:
-
LOCAL_CFLAGS += -pie -fPIE
-
LOCAL_LDFLAGS += -pie -fPIE
Android.mk通用格式:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_EXECUTABLE)
Application.mk通用格式
APP_ABI := x86 armeabi-v7a