Android 中的 mk 和 bp 文件編譯示例詳解
主要介紹 Android 中的 mk 和 bp 文件的編譯方式, Android 構(gòu)建系統(tǒng)的兩種不同配置文件。
1. Android.mk 文件
基本概念
- 傳統(tǒng)構(gòu)建系統(tǒng):基于 GNU Make
- 文件擴展名:
.mk - 使用場景:Android 7.0 之前的主要構(gòu)建配置方式
基本語法示例
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 模塊基本信息
LOCAL_MODULE := mylibrary
LOCAL_MODULE_TAGS := optional
# 源文件
LOCAL_SRC_FILES := \
file1.cpp \
file2.cpp
# 頭文件路徑
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include
# 依賴的共享庫
LOCAL_SHARED_LIBRARIES := \
liblog \
libutils
# 編譯標(biāo)志
LOCAL_CFLAGS += -DDEBUG
# 構(gòu)建為共享庫
include $(BUILD_SHARED_LIBRARY)
# 或者構(gòu)建為靜態(tài)庫
# include $(BUILD_STATIC_LIBRARY)
# 或者構(gòu)建為可執(zhí)行文件
# include $(BUILD_EXECUTABLE)2. Android.bp 文件
基本概念
- 新構(gòu)建系統(tǒng):基于 Soong(取代 Make)
- 文件擴展名:
.bp - 引入版本:Android 7.0 (Nougat) 開始引入
- 特點:更簡單、更快速、更易于維護(hù)
基本語法示例
// 構(gòu)建共享庫
cc_library_shared {
name: "mylibrary",
// 源文件
srcs: [
"file1.cpp",
"file2.cpp",
],
// 頭文件路徑
include_dirs: [
"include",
],
// 共享庫依賴
shared_libs: [
"liblog",
"libutils",
],
// 編譯標(biāo)志
cflags: [
"-DDEBUG",
],
// 版本控制
vendor: true,
proprietary: true,
}
// 構(gòu)建可執(zhí)行文件
cc_binary {
name: "myexecutable",
srcs: ["main.cpp"],
shared_libs: ["mylibrary"],
}
// 構(gòu)建靜態(tài)庫
cc_library_static {
name: "mystaticlib",
srcs: ["static.cpp"],
}3. 主要區(qū)別對比
| 特性 | Android.mk | Android.bp |
|---|---|---|
| 語法 | Makefile 語法 | 簡單的聲明式語法 |
| 性能 | 較慢 | 更快 |
| 可讀性 | 復(fù)雜 | 簡潔明了 |
| 條件編譯 | 支持 | 有限支持 |
| 錯誤檢查 | 運行時 | 編譯時 |
| 維護(hù)性 | 困難 | 容易 |
4. 常見模塊類型
Java 庫
// Android.bp
java_library {
name: "myjavalib",
srcs: ["**/*.java"],
libs: ["core-current"],
sdk_version: "current",
}Android 應(yīng)用
android_app {
name: "MyApp",
srcs: ["src/**/*.java"],
resource_dirs: ["res"],
manifest: "AndroidManifest.xml",
platform_apis: true,
certificate: "platform",
}預(yù)編譯庫
cc_prebuilt_library_shared {
name: "prebuilt_lib",
srcs: ["libs/*.so"],
vendor: true,
}5. 高級特性
條件編譯(在 bp 中)
cc_library_shared {
name: "mylibrary",
srcs: [
"common.cpp",
],
target: {
android: {
srcs: ["android_specific.cpp"],
shared_libs: ["libandroid"],
},
linux_glibc: {
srcs: ["linux_specific.cpp"],
},
},
}變量和函數(shù)
// 在 .bp 文件中使用變量
mylib_srcs = [
"file1.cpp",
"file2.cpp",
]
cc_library_shared {
name: "mylibrary",
srcs: mylib_srcs,
}
// 在 mk 中使用函數(shù)
LOCAL_SRC_FILES := $(call all-java-files-under, src)6. 轉(zhuǎn)換示例
mk 轉(zhuǎn) bp 示例
Android.mk:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libexample LOCAL_SRC_FILES := example.cpp LOCAL_SHARED_LIBRARIES := liblog include $(BUILD_SHARED_LIBRARY)
對應(yīng)的 Android.bp:
cc_library_shared {
name: "libexample",
srcs: ["example.cpp"],
shared_libs: ["liblog"],
}7. 最佳實踐
- 新項目優(yōu)先使用 bp 文件
- 保持配置簡潔明了
- 合理使用模塊化
- 注意依賴關(guān)系
- 考慮平臺兼容性
目前 Android 推薦使用 bp 文件進(jìn)行新開發(fā),但了解 mk 文件對于維護(hù)舊項目和理解構(gòu)建系統(tǒng)仍然很重要。
各example使用案例,可以看Android源碼:Android/external/ 路徑下實例,也可以自己添加模塊。
到此這篇關(guān)于Android 中的 mk 和 bp 文件編譯說明的文章就介紹到這了,更多相關(guān)android mk 和 bp 文件編譯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android AIDL實現(xiàn)進(jìn)程間通信探索
這篇文章主要為大家詳細(xì)介紹了Android AIDL實現(xiàn)進(jìn)程間通信的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android 開發(fā)使用PopupWindow實現(xiàn)加載等待界面功能示例
這篇文章主要介紹了Android 開發(fā)使用PopupWindow實現(xiàn)加載等待界面功能,結(jié)合實例形式分析了Android使用PopupWindow組件實現(xiàn)加載等待界面功能相關(guān)布局與功能實現(xiàn)技巧,需要的朋友可以參考下2020-05-05
Android編程之ICS式下拉菜單PopupWindow實現(xiàn)方法詳解(附源碼下載)
這篇文章主要介紹了Android編程之ICS式下拉菜單PopupWindow實現(xiàn)方法,結(jié)合實例詳細(xì)分析了ICS式下拉菜單的實現(xiàn)原理與相關(guān)技巧,并附帶源碼供讀者下載,需要的朋友可以參考下2015-12-12
Flutter下Android Studio配置gradle的方法
這篇文章主要介紹了Flutter下Android Studio配置gradle的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
android 仿微信demo——登錄功能實現(xiàn)(服務(wù)端)
這系列文章主要介紹了微信小程序-閱讀小程序?qū)嵗?,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給你們提供幫助2021-06-06
android獲取當(dāng)前運行Activity名字的方法
這篇文章主要介紹了android獲取當(dāng)前運行Activity名字的方法,對比分析了兩種實現(xiàn)方法供大家選擇,具有一定參考借鑒價值,需要的朋友可以參考下2015-01-01

