无亟 發表於 2025-10-10 09:41:28

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1. Android.mk 文件</li><ul class="second_class_ul"><li>基本概念</li><li>基本语法示例</li></ul><li>2. Android.bp 文件</li><ul class="second_class_ul"><li>基本概念</li><li>基本语法示例</li></ul><li>3. 主要区别对比</li><ul class="second_class_ul"></ul><li>4. 常见模块类型</li><ul class="second_class_ul"><li>Java 库</li><li>Android 应用</li><li>预编译库</li></ul><li>5. 高级特性</li><ul class="second_class_ul"><li>条件编译(在 bp 中)</li><li>变量和函数</li></ul><li>6. 转换示例</li><ul class="second_class_ul"><li>mk 转 bp 示例</li></ul><li>7. 最佳实践</li><ul class="second_class_ul"></ul></ul></div><p>主要介绍 Android 中的 mk 和 bp 文件的编译方式, Android 构建系统的两种不同配置文件。</p>
<p class="maodian"></p><h2>1. Android.mk 文件</h2>
<p class="maodian"></p><p class="maodian"></p><h3>基本概念</h3>
<ul><li><strong>传统构建系统</strong>:基于 GNU Make</li><li><strong>文件扩展名</strong>:<code>.mk</code></li><li><strong>使用场景</strong>:Android 7.0 之前的主要构建配置方式</li></ul>
<p class="maodian"></p><p class="maodian"></p><h3>基本语法示例</h3>
<div class="jb51code"><pre class="brush:java;">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)</pre></div>
<p class="maodian"></p><h2>2. Android.bp 文件</h2>
<h3>基本概念</h3>
<ul><li><strong>新构建系统</strong>:基于 Soong(取代 Make)</li><li><strong>文件扩展名</strong>:<code>.bp</code></li><li><strong>引入版本</strong>:Android 7.0 (Nougat) 开始引入</li><li><strong>特点</strong>:更简单、更快速、更易于维护</li></ul>
<h3>基本语法示例</h3>
<div class="jb51code"><pre class="brush:java;">// 构建共享库
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"],
}</pre></div>
<p class="maodian"></p><h2>3. 主要区别对比</h2>
<table><thead><tr><th>特性</th><th>Android.mk</th><th>Android.bp</th></tr></thead><tbody><tr><td>语法</td><td>Makefile 语法</td><td>简单的声明式语法</td></tr><tr><td>性能</td><td>较慢</td><td>更快</td></tr><tr><td>可读性</td><td>复杂</td><td>简洁明了</td></tr><tr><td>条件编译</td><td>支持</td><td>有限支持</td></tr><tr><td>错误检查</td><td>运行时</td><td>编译时</td></tr><tr><td>维护性</td><td>困难</td><td>容易</td></tr></tbody></table>
<p class="maodian"></p><h2>4. 常见模块类型</h2>
<p class="maodian"></p><h3>Java 库</h3>
<div class="jb51code"><pre class="brush:java;">// Android.bp
java_library {
    name: "myjavalib",
    srcs: ["**/*.java"],
    libs: ["core-current"],
    sdk_version: "current",
}</pre></div>
<p class="maodian"></p><h3>Android 应用</h3>
<div class="jb51code"><pre class="brush:java;">android_app {
    name: "MyApp",
    srcs: ["src/**/*.java"],
    resource_dirs: ["res"],
    manifest: "AndroidManifest.xml",
    platform_apis: true,
    certificate: "platform",
}</pre></div>
<p class="maodian"></p><h3>预编译库</h3>
<div class="jb51code"><pre class="brush:java;">cc_prebuilt_library_shared {
    name: "prebuilt_lib",
    srcs: ["libs/*.so"],
    vendor: true,
}</pre></div>
<p class="maodian"></p><h2>5. 高级特性</h2>
<p class="maodian"></p><h3>条件编译(在 bp 中)</h3>
<div class="jb51code"><pre class="brush:java;">cc_library_shared {
    name: "mylibrary",
    srcs: [
      "common.cpp",
    ],
    target: {
      android: {
            srcs: ["android_specific.cpp"],
            shared_libs: ["libandroid"],
      },
      linux_glibc: {
            srcs: ["linux_specific.cpp"],
      },
    },
}</pre></div>
<p class="maodian"></p><h3>变量和函数</h3>
<div class="jb51code"><pre class="brush:java;">// 在 .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)</pre></div>
<p class="maodian"></p><h2>6. 转换示例</h2>
<p class="maodian"></p><h3>mk 转 bp 示例</h3>
<p><strong>Android.mk:</strong></p>
<div class="jb51code"><pre class="brush:java;">LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libexample
LOCAL_SRC_FILES := example.cpp
LOCAL_SHARED_LIBRARIES := liblog
include $(BUILD_SHARED_LIBRARY)</pre></div>
<p><strong>对应的 Android.bp:</strong></p>
<div class="jb51code"><pre class="brush:java;">cc_library_shared {
    name: "libexample",
    srcs: ["example.cpp"],
    shared_libs: ["liblog"],
}</pre></div>
<p class="maodian"></p><h2>7. 最佳实践</h2>
<ol><li><strong>新项目优先使用 bp 文件</strong></li><li><strong>保持配置简洁明了</strong></li><li><strong>合理使用模块化</strong></li><li><strong>注意依赖关系</strong></li><li><strong>考虑平台兼容性</strong></li></ol>
<p>目前 Android 推荐使用 bp 文件进行新开发,但了解 mk 文件对于维护旧项目和理解构建系统仍然很重要。</p>
<p>各example使用案例,可以看Android源码:Android/external/ 路径下实例,也可以自己添加模块。</p>
<p>到此这篇关于Android 中的 mk 和 bp 文件编译说明的文章就介绍到这了,更多相关android mk 和 bp 文件编译内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Android.mk文件使用速通手册</li><li>详解android.mk中引用第三方库的方法</li><li>Android.mk引入第三方jar包和so库文件的方法</li><li>Android.mk文件中添加第三方jar文件的方法</li><li>浅析Android.mk</li><li>Android.bp语法和使用方法讲解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Android 中的 mk 和 bp 文件编译示例详解