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
mk 打印log
$(warning siming log is :$(TARGET_KENEL_VERSION))
编译 make -j8 输出 log,用来打印变量来 debug