android开发笔记之Makefile(二)

本文探讨了Android开发中Makefile编译过程,解析了BUILD_MYOS、SUB_PROJECT_NAME、PROJECT_NAME等关键参数的来源及作用。这些参数实际上定义了变量,并根据变量执行相应操作,简化了编译流程。同时提到了TARGET_PRODUCT和TARGET_BUILD_VARIANT,它们分别表示lunch选择的项目和编译类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司编译项目的命令为:

make -j8  PROJECT_NAME=*** SUB_PROJECT_NAME=**** BUILD_MYOS=yes

比原始的编译方法多了几个后面的参数,那我们就分析一下这几个参数是怎么来的吧。

#BUILD_MYOS

./build/core/main.mk

#如果BUILD_MYOS为yes,我们执行****
ifeq ($(strip $(BUILD_MYOS)),yes)
****
endif
#如果BUILD_MYOS为no,我们执行****
ifeq ($(strip $(BUILD_MYOS)),no)
*****
endif

#SUB_PROJECT_NAME

Android.mk文件

#如果SUB_PROJECT_NAME不为空,则包含此路径的Android.mk
ifneq ($(strip $(SUB_PROJECT_NAME)),)
include $(LOCAL_PATH)/$(SUB_PROJECT_NAME)/Android.mk
endif

*.mk文件

#取SUB_PROJECT_NAME的值
LOCAL_PATH := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/SUB_PROJECTS/$(SUB_PROJECT_NAME)

#取SUB_PROJECT_NAME的值
PRODUCT_PROPERTY_OVERRIDES += ro.tinno.operator=$(SUB_PROJECT_NAME)

#如果SUB_PROJECT_NAME为空,则**,如果SUB_PROJECT_NAME不为空,则**
ifeq ($(strip $(SUB_PROJECT_NAME)),)
*****
else
****
endif


# 如果SUB_PROJECT_NAME不为空,则包含对应SUB_PROJECT_NAME目录下的configs.mk,或则包含上一个层级的configs.mk
CFG_FILE := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/configs.mk
ifneq ($(strip $(SUB_PROJECT_NAME)),)
CFG_FILE := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/SUB_PROJECTS/$(SUB_PROJECT_NAME)/configs.mk
ifeq ($(wildcard $(CFG_FILE)),)
    CFG_FILE := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/configs.mk
endif
endif
-include $(CFG_FILE)

#如果SUB_PROJECT_NAME不为空,则包含对应SUB_PROJECT_NAME目录下的gms.mk,或则包含默认目录下的gms.mk
GMS_FILE :=vendor/google/products/gms.mk
ifneq ($(strip $(SUB_PROJECT_NAME)),)
GMS_FILE :=vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/SUB_PROJECTS/$(SUB_PROJECT_NAME)/gms.mk
ifeq ($(wildcard $(GMS_FILE)),)
  GMS_FILE :=vendor/tinno/google/products/gms.mk
endif
endif
$(call inherit-product-if-exists, $(GMS_FILE))

build/core/Makefile

#如果SUB_PROJECT_NAME不为空
ifneq ($(strip $(SUB_PROJECT_NAME)),)
****
endif

build/core/main.mk

#如果SUB_PROJECT_NAME不为空,则
ifneq ($(strip $(SUB_PROJECT_NAME)),)
   PROPERTY_CINFIGS_SUB_PROJECT_NAME = $(SUB_PROJECT_NAME)
endif

#PROJECT_NAME

*.mk

#当前目录
LOCAL_PATH := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)
#给系统属性赋值
PRODUCT_PROPERTY_OVERRIDES += ro.project=$(PROJECT_NAME)

#如果PROJECT_NAME为test,则***
ifeq ($(strip $(PROJECT_NAME)),test)
***
endif

#如果PROJECT_NAME为test,则***
ifeq ($(PROJECT_NAME),test)
***
endif

#如果PROJECT_NAME对应的目录下的文件不为空,则复制此文件到对应的目录,或者复制默认的文件到对应的目录
NEW_APN_FILES := vendor/$(TARGET_PROJECT)/$(PROJECT_NAME)/etc/apns-conf.xml
ifneq ($(wildcard $(NEW_APN_FILES)),)
  PRODUCT_COPY_FILES += $(NEW_APN_FILES):/system/etc/apns-conf.xml
else
  PRODUCT_COPY_FILES += $(LOCAL_PATH)/apns-conf.xml:/system/etc/apns-conf.xml
endif


./build/core/Makefile

#如果SUB_PROJECT_NAME和PROJECT_NAME结果不相等
ifneq ($(strip $(SUB_PROJECT_NAME)),$(PROJECT_NAME))
****
endif

看到这,其实我们基本上已经是非常清楚为什么多了这些参数,说白了就是加了几个变量,然后根据这些变量,来执行对应的操作。没有什么非常玄的东西。

#TARGET_PRODUCT

TARGET_PRODUCT值为对应编译项目的选择,就是lunch时选择的项目

#TARGET_BUILD_VARIANT
TARGET_BUILD_VARIANT值对应项目的选择编译类型,就是lunch时选择项目的编译类型,如user,userdebug,eng

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hfreeman2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值