Android 中的 mk 和 bp 文件编译说明

主要介绍 Android 中的 mk 和 bp 文件的编译方式, Android 构建系统的两种不同配置文件。

1. Android.mk 文件

基本概念

  • 传统构建系统:基于 GNU Make
  • 文件扩展名.mk
  • 使用场景:Android 7.0 之前的主要构建配置方式

基本语法示例

makefile 复制代码
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)

# 或者构建为静态库
# include $(BUILD_STATIC_LIBRARY)

# 或者构建为可执行文件
# include $(BUILD_EXECUTABLE)

2. Android.bp 文件

基本概念

  • 新构建系统:基于 Soong(取代 Make)
  • 文件扩展名.bp
  • 引入版本:Android 7.0 (Nougat) 开始引入
  • 特点:更简单、更快速、更易于维护

基本语法示例

python 复制代码
// 构建共享库
cc_library_shared {
    name: "mylibrary",
    
    // 源文件
    srcs: [
        "file1.cpp",
        "file2.cpp",
    ],
    
    // 头文件路径
    include_dirs: [
        "include",
    ],
    
    // 共享库依赖
    shared_libs: [
        "liblog",
        "libutils",
    ],
    
    // 编译标志
    cflags: [
        "-DDEBUG",
    ],
    
    // 版本控制
    vendor: true,
    proprietary: true,
}

// 构建可执行文件
cc_binary {
    name: "myexecutable",
    srcs: ["main.cpp"],
    shared_libs: ["mylibrary"],
}

// 构建静态库
cc_library_static {
    name: "mystaticlib",
    srcs: ["static.cpp"],
}

3. 主要区别对比

特性 Android.mk Android.bp
语法 Makefile 语法 简单的声明式语法
性能 较慢 更快
可读性 复杂 简洁明了
条件编译 支持 有限支持
错误检查 运行时 编译时
维护性 困难 容易

4. 常见模块类型

Java 库

python 复制代码
// Android.bp
java_library {
    name: "myjavalib",
    srcs: ["**/*.java"],
    libs: ["core-current"],
    sdk_version: "current",
}

Android 应用

python 复制代码
android_app {
    name: "MyApp",
    srcs: ["src/**/*.java"],
    resource_dirs: ["res"],
    manifest: "AndroidManifest.xml",
    platform_apis: true,
    certificate: "platform",
}

预编译库

python 复制代码
cc_prebuilt_library_shared {
    name: "prebuilt_lib",
    srcs: ["libs/*.so"],
    vendor: true,
}

5. 高级特性

条件编译(在 bp 中)

python 复制代码
cc_library_shared {
    name: "mylibrary",
    srcs: [
        "common.cpp",
    ],
    target: {
        android: {
            srcs: ["android_specific.cpp"],
            shared_libs: ["libandroid"],
        },
        linux_glibc: {
            srcs: ["linux_specific.cpp"],
        },
    },
}

变量和函数

python 复制代码
// 在 .bp 文件中使用变量
mylib_srcs = [
    "file1.cpp",
    "file2.cpp",
]

cc_library_shared {
    name: "mylibrary",
    srcs: mylib_srcs,
}

// 在 mk 中使用函数
LOCAL_SRC_FILES := $(call all-java-files-under, src)

6. 转换示例

mk 转 bp 示例

Android.mk:

makefile 复制代码
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:

python 复制代码
cc_library_shared {
    name: "libexample",
    srcs: ["example.cpp"],
    shared_libs: ["liblog"],
}

7. 最佳实践

  1. 新项目优先使用 bp 文件
  2. 保持配置简洁明了
  3. 合理使用模块化
  4. 注意依赖关系
  5. 考虑平台兼容性

目前 Android 推荐使用 bp 文件进行新开发,但了解 mk 文件对于维护旧项目和理解构建系统仍然很重要。

各example使用案例,可以看Android源码:Android/external/ 路径下实例,也可以自己添加模块。

相关推荐
sky北城1 小时前
You are not able to choose some of the languages, because locales for them a
android
儿歌八万首1 小时前
Jetpack Compose 实战:打造高性能轮播图 (Carousel) 组件
android·前端·kotlin
QING6181 小时前
Kotlin Flow 防抖(Debounce)详解
android·kotlin·android jetpack
QING6181 小时前
Kotlin Flow 防抖(Debounce)、节流(Throttle)、去重(distinctUntilChanged) —— 新手指南
android·kotlin·android jetpack
AI视觉网奇2 小时前
android yolo12 android 实战笔记
android·笔记·yolo
海上飞猪2 小时前
【Mysql】Mysql的安装部署和使用
android·mysql·adb
我是好小孩2 小时前
【Android】项目的组件化搭建
android
aqi003 小时前
FFmpeg开发笔记(九十四)基于Kotlin的国产开源推拉流框架anyRTC
android·ffmpeg·kotlin·音视频·直播·流媒体
马 孔 多 在下雨3 小时前
Android 组件化开发基础实践
android
技术摆渡人3 小时前
Android 系统技术探索(2)构建大脑(System Services & PMS)
android