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

