安卓 bp & mk 文件

bp:

bp编译不同类型的模块

java_library {                             //编译成 Java 库,.jar

            name: "SystemUI-proto",        //name: [PackageName] 编译出的模块名

            srcs: ["src/**/*.proto"],      //包含的Src文件范围; src目录下的所有.java原文件都将参与编译

java_library_static {                       //编译成 Java 静态库

android_library {                           //编译成 JAR LIBRARY

            resource_dirs: [                //包含的Res文件范围

            static_libs: [                  //导入静态JAVA库依赖; 模块的静态依赖库列表,下面所列模块,需使用静态链接,否则将出现‘Class NOT found errors’。

            libs: [                         //模块依赖的的动态库列表

            manifest: "AndroidManifest.xml",    //Manifest文件

android_app {                               //编译成 APK 应用

          name: "Settings",                 //生成的APK名为:Settings.apk

          platform_apis: true,              //授权使用@hide API

          certificate: "platform",          //采用系统签名

          system_ext_specific: true,        //结合privileged: true,编译生成的文件,将存放到 /system/system_ext/priv-app 目录

          privileged: true,                 //是否存放到priv-app 目录

           optimize: {                      //代码混淆控制

                    proguard_flags_files: ["proguard.flags"],

            },

            overrides: [                    //指定覆盖编译(被指定的模块会在整编时被编进去,而是由当前模块代替)

                    "SystemUI",

            ],

cc_library_shared {                         //编译成 Native 动态库

cc_library_static {                         //编译成 Native 静态库

cc_binary {                                 //编译成 Native 执行程序

cc_library_headers {                        //编译成头文件库

文件路径

local_include_dirs: ["xxx", ...]                //本地头文件路径

export_include_dirs: ["xxx", ...]            //导出的头文件路径

resource_dirs: ["xxx", ...]                     //包含Res 文件范围

库依赖

static_libs: ["xxx", "xxx", ...]                //依赖的静态库

shared_libs: ["xxx", "xxx", ...]            //依赖的动态库

header_libs: ["xxx", "xxx", ...]            //依赖的头文件库

Java: 都以 .jar为结尾后缀,区别仅限于你想动态集成,静态集成

c/c++: Linux下的动态库以.so结尾, 静态库一般以.lib结尾;windows下的动态库则以.dll结尾,静态库也是以lib结尾

prebuilt_etc {name: "", product_specific: true,  sub_dir: "",  src:"",  filename_from_src: //将name 关联 src, }    //预编配置文件

filegroup / genrule                        // 模块引用

mk

编译模块以 include $(CLEAR_VARS) 开始,以 include $(BUILD_XXX) 结束,由GNUMAKEFILE 清除LOCAL_PATH 外的所有 LOCAL_XXX 变量

LOCAL_STRIP_MODULE := false                                        将 debug 调试信息去掉与否,不可重复执行

LOCAL_MODUL_PATH:=$(PRODUCT_OUT)/...                    文件输出路径

LOCAL_MODULE_TAGS :=user/eng/tests/optional         只在特定版本下编译

LOCAL_CERTIFICATE := PRESIGNED                                    软件证书签名

LOCAL_POST_INSTALL_CMD +=                                         在预装程序生成完后使用Linux 命令进行操作 

LOCAL_OVERRIDES_PACKAGES :=                                      不编译以下的包,文件涵盖太多容易出错

LOCAL_REQUIRED_MODULES :=                                        模块安装时将会同步安装它所依赖的模块

PRODUCT_DEL_PACKAGES +=                                           需要大面积删除应用

mk常用编译模块类型

BUILD_PREBUILD                        编译为成一个预置程序

BUILD_PACKAGES                        编译为一个 apk 或者资源包文件

BUILD_JAVA_LIARARY                编译成一个Java共享库

BUILD_STATIC_JAVA_LIARARY    编译成一个Java静态库

BUILD_EXECUTABLE                    编译成一个可执行文件

BUILD_SHARED_LIARARY            编译成一个native共享库,前缀为lib,后缀为.so

在make 编译后将apk、so 打包到 system.img 的方法

PRODUCT_PACKAGES                        把需要打包的文件添加到变量中

PRODUCT_PRODUCT_COPY_FILES    增加自己的文件夹,并且把需要打包的文件,拷贝到文件夹下

PRODUCT_MAKEFILES                        AndroidProduct.mk 文件给编译系统变量赋值

若添加product 到系统中,最好在device 和 vendor 目录下,因为android 编译系统也会默认扫描这两个目录下的AndriodProduct.mk

TARGET_BUILD_VARIANT                    表示编译产品的类型,可能的值有eng、user和userdebug

TARGET_BULD_TYPE                            表示编译的类型,可选的值是release和debug

PRODUCT_OUT                                    展开为out/target/product/$(TARGET_DEVICE)

多级连 mk 文件需编译包含衔接 Android.mk 文件

include $(call all-subdir-makefiles)

e.g.

Build so:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := \

    cpp/VrDesktopListener.cpp \

    cpp/native-lib.cpp

LOCAL_C_INCLUDES := \

    system/core/init \

    frameworks/native/include

LOCAL_SHARED_LIBRARIES := \

    liblog \

    libutils \

    libbinder \

    libgui

LOCAL_MODULE := libcontrollermanager

include $(BUILD_SHARED_LIBRARY)

* LOCAL_PATH := $(call my-dir):             设置 LOCAL_PATH 变量为当前 Makefile 所在的目录。

* include $(CLEAR_VARS):                         清除先前的模块变量设置。

* LOCAL_SRC_FILES:                                 定义源文件列表,包括 VrDesktopListener.cpp 和 native-lib.cpp。

* LOCAL_C_INCLUDES:                             指定 C/C++ 源码的头文件搜索路径。

* LOCAL_SHARED_LIBRARIES:                  指定所依赖的共享库。

* LOCAL_MODULE:                                    指定生成的共享库的名称。

* include $(BUILD_SHARED_LIBRARY):     构建共享库

Build APK:

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_DEX_PREOPT := nostripping

LOCAL_PROGUARD_ENABLED := disabled

LOCAL_SRC_FILES := $(call all-java-files-under, java) \

    $(call all-Iaidl-files-under, java)

LOCAL_AIDL_INCLUDES += $(LOCAL_PATH)/java/

LOCAL_STATIC_JAVA_LIBRARIES := android-common

LOCAL_AAPT_FLAGS := \

    --auto-add-overlay \

    --extra-packages com.nolovr.androidsdkclient \

LOCAL_STATIC_JAVA_AAR_LIBRARIES := nolo_sdk_aar

LOCAL_SHARED_LIBRARIES := libcontrollermanager

LOCAL_PACKAGE_NAME := ControllerManager

LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

* LOCAL_MODULE_TAGS:             指定 APK 模块的标签。

* LOCAL_DEX_PREOPT:                 控制是否进行 dex 优化。

* LOCAL_PROGUARD_ENABLED:  控制是否启用 ProGuard 代码混淆。

* LOCAL_SRC_FILES:                     指定 Java 源文件和 AIDL 文件。

* LOCAL_AIDL_INCLUDES:             指定 AIDL 文件的包含路径。

* LOCAL_STATIC_JAVA_LIBRARIES: 指定静态 Java 库的依赖。

* LOCAL_AAPT_FLAGS:                 指定传递给 aapt 工具的额外标志。

* LOCAL_STATIC_JAVA_AAR_LIBRARIES: 指定静态 AAR 库的依赖。

* LOCAL_SHARED_LIBRARIES:     指定所依赖的共享库。

* LOCAL_PACKAGE_NAME:         指定生成的 APK 的包名。

* LOCAL_CERTIFICATE:                 指定 APK 的签名证书。

Prebuilt Shared Library:

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_SUFFIX := .so

LOCAL_MODULE := libNoloVR

LOCAL_MODULE_CLASS := SHARED_LIBRARIES

LOCAL_SRC_FILES_arm64 := libs/arm64-v8a/libNoloVR.so

LOCAL_SRC_FILES_arm := libs/armeabi-v7a/libNoloVR.so

LOCAL_MULTILIB := both

include $(BUILD_PREBUILT)

* LOCAL_MODULE_TAGS: 指定模块标签。

* LOCAL_MODULE_SUFFIX: 指定生成的模块文件的后缀名。

* LOCAL_MODULE: 指定生成的模块的名称。

* LOCAL_MODULE_CLASS: 指定模块的类型(在此为共享库)。

* LOCAL_SRC_FILES_arm64 和 LOCAL_SRC_FILES_arm: 指定不同 ABI 下的预构建共享库文件路径。

* LOCAL_MULTILIB: 指定是否为多 ABI 构建

Prebuilt AAR Library:

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := nolo_sdk_aar:libs/androidsdkclient-industry-release.aar

include $(BUILD_MULTI_PREBUILT)

* LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES: 指定预构建的静态 Java 库。

* nolo_sdk_aar: 静态 Java 库的名称。

* libs/androidsdkclient-industry-release.aar: AAR 文件的路径

Additional Prebuilt Section:

# include $(CLEAR_VARS)

# LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \

#     ControllerAPI:libs/ControllerAPI.jar

# include $(BUILD_MULTI_PREBUILT)

这是一个被注释掉的部分,示例了如何添加额外的预构建库(在此为 ControllerAPI.jar)。在你的具体情况下,如果有其他预构建库,可以按照这个模板添加


创建文件软连接

vendor/qcom/opensource/wlan/qcacld-3.0/Android.mk

TARGET_FW_DIR := firmware/wlan/qca_cld

ifeq ($(PRODUCT_VENDOR_MOVE_ENABLED),true)

    TARGET_FW_PATH := $(TARGET_OUT_VENDOR)/$(TARGET_FW_DIR)

else

    TARGET_FW_PATH := $(TARGET_OUT_ETC)/$(TARGET_FW_DIR)

endif

$(shell mkdir -p $(TARGET_FW_PATH); \

        ln -sf $(TARGET_MAC_BIN_PATH)/wlan_mac.bin  $(TARGET_FW_PATH)/wlan_mac.bin)

在Android项目中创建一个目录(如果目录不存在),然后在该目录中创建一个符号链接(或者是文件拷贝)将`$(TARGET_MAC_BIN_PATH)`下的`wlan_mac.bin`链接(或复制)到`$(TARGET_FW_PATH)`目录下

`mkdir -p`命令用于创建目录,如果目录已经存在则不会报错。 

`\`:反斜杠用于将这个规则连接到下一行。这样做是为了让这个语句跨越多行而不会被解释为多个独立的规则。 

`In -sf $(TARGET_MAC_BIN_PATH)/wlan_mac.bin $(TARGET_FW_PATH)/wlan_mac.bin`:这是另一个Shell命令

    - `In`:这很可能是`ln`命令的错误拼写。 

    - `-sf`:这是`ln`命令的选项,它用于创建一个符号链接。 

    - `$(TARGET_MAC_BIN_PATH)/wlan_mac.bin`:这是源文件的路径,`wlan_mac.bin`应该是源文件的名字

    - `$(TARGET_FW_PATH)/wlan_mac.bin`:这是目标路径,`wlan_mac.bin`应该是目标文件的名字

 黑猫带你学Makefile第5篇:Makefile中函数的使用_echo makefile_黑猫学长呀的博客-优快云博客

mk vs bp

编译模块名

MK 以 include 结尾表示编译模块,BP 则以类似json 格式,在外部标明编译模块

"BUILD_SHARED_LIBRARY"            - "cc_library_shared"

"BUILD_STATIC_LIBRARY"              -"cc_library_static"

"BUILD_EXECUTABLE"                    -"cc_binary"

"BUILD_HEADER_LIBRARY"            -"cc_library_headers"

"BUILD_JAVA_LIBRARY"                -"java_library"

"BUILD_STATIC_JAVA_LIBRARY"   -"java_library_static"

"BUILD_PACKAGE"                        -"android_app"

LOCAL_PACKAGE_NAME                 -name

LOCAL_SRC_FILES                             -srcs

LOCAL_RESOURCE_DIR                     -resource_dirs

LOCAL_STATIC_JAVA_LIBRARIES       -static_libs

LOCAL_MANIFEST_FILE                     -additional_manifests

LOCAL_DEX_PREOPT                        -dex_preopt        //编译是否优化

LOCAL_PRODUCT_MODULE := true/false      -product_specific: true/false    //编译标记向product 分区中安装模块

(17条消息) PRODUCT_COPY_FILES语法解析_0xfree的博客-优快云博客_product_copy_files

 Android编译系统-完结 - 简书


mk 打印log 

$(warning siming log is :$(TARGET_KENEL_VERSION))

编译 make -j8 输出 log,用来打印变量来 debug

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值