开发者

Android 中的 mk 和 bp 文件编译示例详解

目录
  • 1. android.mk 文件
    • 基本概念
    • 基本语法示例
  • 2. Android.bp 文件
    • 基本概念
    • 基本语法示例
  • 3. 主要区别对比
    • 4. 常见模块类型
      • Java 库
      • Android 应用
      • 预编译库
    • 5. 高级特性
      • 条件编译(在 bp 中)
      • 变量和函数
    • 6. 转换示例
      • mk 转 bp 示例
    • 7. 最佳实践

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

      1. Android.mk 文件

      基本概念

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

      基本语法示例

      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      # 模块基本信息
      LOCAL_MOD编程客栈ULE := mylibrary
      LOCAL_MODULE_TAGS := optional
      # 源文件
      LOCAL_SRC_FILES := \
          file1.cpp \
          file2.cpp
      # 头文件路径
      LOCAL_C_INCLUDES := \
          $(LOCAL_PATH)/include
      # 依赖的共享库
      LOCAL_SHARED_LIBRARIES := \
          liblog \
          libutils
      # 编译标志
      LOCAL_CFLAGSphp += -DDEBUG
      # 构建为共享库
      include $(BUILD_SHARED_LIBRARY)
      # 或者构建为静态库
      # include $(BUILD_STATIC_LIBRARY)
      # 或者构建为可执行文件
      # include $(BUILD_EXECUTABLE)

      2. Android.bp 文件

      基本概念

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

      基本语法示例

      // 构建共享库
      cc_library_shared {
          name: "mylibrary",
          // 源文件
          srcs: [
              "file1.chttp://www.devze.compp",
              "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.mkAndroid.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"],
              },
          },
      }

      变量和函数

      // 在 .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:

      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. 最佳实践

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

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

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

      到此这篇关于Android 中的 mk 和 bp 文件编译说明的文章就介绍到这了,更多相关android mk 和 bp 文件编译内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜