利用makefile将添加的资源文件编译到Android系统中

本文介绍了如何使用makefile将添加的资源文件,如铃声,编译并集成到Android系统中。通过查找资源文件,设置LOCAL_BUILT_MODULE、LOCAL_INSTALLED_MODULE和LOCAL_MODULE_CLASS等参数,配合LOCAL_SRC_FILES定义资源路径,然后根据资源类型选择适当的LOCAL_MODULE_CLASS。最终,将LOCAL_MODULE添加到PRODUCT_PACKAGES以确保在编译过程中正确打包。

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

利用makefile将添加的资源文件编译到系统中

查找文件
首先,查找需要批量编译到系统内的资源文件;


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
define target-all-files
$(patsubst ./%,%, \   
  $(shell cd $(LOCAL_PATH) ; \
  find . -iname "*.$(2)" \  
  ) \
 ) 
endef

define all-child-files
$(call target-all-files,device/moto/<product>/media/audio,$(1)) 
endef 

利用for循环批量生成build_prebuilt模块

all_oggs := $(shell echo $(call all-child-files,ogg)) 
$(warning
==all_oggs:====$(all_oggs)======) 
$(foreach cf, $(all_oggs),\
    $(eval ringname := $(patsubst %.ogg,%,$(notdir $(cf)))) \
    $(eval diring := $(patsubst %/,%,$(patsubst ./%,%,$(dir $(cf))))) \
    $(info out/target/product/<product>/system/media/audio/$(diring)) \
    $(eval LOCAL_MODULE     := $(ringname)_$(diring)) \
    $(eval LOCAL_MODULE_TAGS := optional) \
    $(eval LOCAL_BUILT_MODULE  := ) \
    $(eval LOCAL_INSTALLED_MODULE  := ) \
    $(eval LOCAL_MODULE_CLASS := ETC) \
    $(eval LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/media/audio/$(diring)) \
    $(eval LOCAL_SRC_FILES   := $(cf)) \
    $(eval include $(BUILD_PREBUILT)) \ )
  • 设置LOCAL_BUILT_MODULE LOCAL_INSTALLED_MODULE 为空
  • LOCAL_MODULE_PATH
    当前模块编译结果生成的目的位置
  • LOCAL_SRC_FILES
    当前模块依赖的资源文件
  • LOCAL_MODULE_CLASS
    制定当前模块编译之后放置的位置,不指定不会放置在out下,否则放置于out/target/product/product_name/obj下
    编写拷贝资源的makefile文件;
    LOCAL_MODULE_CLASS 变量的取值包含
    LOCAL_MODULE_CLASS := EXECUTABLES
    LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
    LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES
    LOCAL_MODULE_CLASS := ETC
    LOCAL_MODULE_CLASS := STATIC_LIBRARIES
    LOCAL_MODULE_CLASS := EXECUTABLES
    LOCAL_MODULE_CLASS := FAKE
    LOCAL_MODULE_CLASS := JAVA_LIBRARIES
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    LOCAL_MODULE_CLASS := APPS

把LOCAL_MODULE添加到PRODUCT_PACKAGES

define target-all-files
$(patsubst ./%,%, \
  $(shell cd device/moto/<product>/media/audio; \
          find . -iname "*.$(2)" \
 ) \
)
endef

define all-child-files
$(call target-all-files,device/moto/<product>/media/audio,$(1))
endef

all_oggs := $(shell echo $(call all-child-files,ogg))
$(warning =====$(all_oggs)=====)
$(foreach cf, $(all_oggs),\
    $(eval ringname := $(patsubst %.ogg,%,$(notdir $(cf)))) \
    $(eval diring := $(patsubst %/,%,$(dir $(cf)))) \
    $(eval PRODUCT_PACKAGES += $(ringname)_$(diring)) \
)
  • 添加到 PRODUCT_PACKAGES的模块名称要和LOCAL_MODULE 保持一致;
  • 利用 eval 将变量添加到makefile的编译环境中去;

    *本文将android新增铃声资源文件编译到系统中为例
    *除此之外,还可以利用$(shell cp src dest) 以及 PRODUCT_COPY_FILES

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值