android编译系统makefile(Android.mk)写法.pdf
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
在Android开发中,构建系统是至关重要的组成部分,它负责编译、链接以及打包应用程序或系统组件。`Android.mk`文件是Android编译系统中的一个关键文件,它使用GNU Make工具来定义编译规则和依赖关系,指导构建过程。本文将详细讲解`Android.mk`文件的写法及其在Android编译系统中的作用。 每个`Android.mk`文件都会定义`LOCAL_PATH`变量,这是为了确定源代码文件的位置。通常,`LOCAL_PATH`设置为`$(call my-dir)`,这会返回当前`Android.mk`文件所在的目录,确保Makefile能够找到相关的源代码文件。 接下来,我们可以通过`include $(CLEAR_VARS)`来清除之前定义的编译模块变量,以便开始定义一个新的模块。`CLEAR_VARS`是由编译系统提供的,它会清空所有`LOCAL_XXX`变量,除了`LOCAL_PATH`之外。这些变量包括`LOCAL_MODULE`(模块名称)、`LOCAL_SRC_FILES`(源文件列表)、`LOCAL_SHARED_LIBRARIES`(依赖的共享库)、`LOCAL_STATIC_LIBRARIES`(依赖的静态库)等。 `Android.mk`文件中的模块定义通常以`include $(BUILD_XXX)`语句结束,这里的`XXX`可以是`STATIC_LIBRARY`、`SHARED_LIBRARY`或`EXECUTABLE`,分别对应于创建静态库、动态库和可执行程序。例如: - `include $(BUILD_STATIC_LIBRARY)`:指示编译器将当前模块编译为静态库。 - `include $(BUILD_SHARED_LIBRARY)`:指示编译器生成动态库。 - `include $(BUILD_EXECUTABLE)`:则告诉编译系统编译一个可执行程序。 下面是一个示例的`Android.mk`文件,位于`frameworks/base/libs/audioflinger`目录下: ```makefile LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) # 模块一 ifeq ($(AUDIO_POLICY_TEST),true) ENABLE_AUDIO_DUMP := true endif LOCAL_SRC_FILES:= \ AudioHardwareGeneric.cpp \ AudioHardwareStub.cpp \ AudioHardwareInterface.cpp ifeq ($(ENABLE_AUDIO_DUMP),true) LOCAL_SRC_FILES += AudioDumpInterface.cpp LOCAL_CFLAGS += -DENABLE_AUDIO_DUMP endif LOCAL_SHARED_LIBRARIES := \ libcutils \ libutils \ libbinder \ libmedia \ libhardware_legacy ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true) LOCAL_CFLAGS += -DGENERIC_AUDIO endif LOCAL_MODULE:= libaudiointerface ifeq ($(BOARD_HAVE_BLUETOOTH),true) LOCAL_SRC_FILES += A2dpAudioInterface.cpp LOCAL_SHARED_LIBRARIES += liba2dp LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP LOCAL_C_INCLUDES += $(call include-path-for, bluez) endif include $(BUILD_STATIC_LIBRARY) # 编译为静态库 # 模块二 include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ AudioPolicyManagerBase.cpp LOCAL_SHARED_LIBRARIES := \ libcutils \ libutils \ libmedia ifeq ($(TARGET_SIMULATOR),true) LOCAL_LDLIBS += -ldl else LOCAL_SHARED_LIBRARIES += libdl endif LOCAL_MODULE:= libaudiopolicybase ifeq ($(BOARD_HAVE_BLUETOOTH),true) LOCAL_CFLAGS += -DWITH_A2DP endif ifeq ($(AUDIO_POLICY_TEST),true) LOCAL_CFLAGS += -DAUDIO_POLICY_TEST endif include $(BUILD_STATIC_LIBRARY) # 编译为静态库 # ... ``` 在这个示例中,可以看到两个编译模块的定义。第一个模块包含了几个源文件,并根据条件添加了额外的源文件和编译标志。同时,它依赖于多个共享库,如`libcutils`和`libmedia`。第二个模块的结构类似,但源文件不同,并且根据目标是否为模拟器或蓝牙功能是否启用来调整编译选项。 通过这样的方式,`Android.mk`文件可以灵活地控制编译过程,包括选择编译的源文件、添加编译标志、处理条件语句以适应不同的设备配置,并管理与之关联的库。这样的灵活性使得Android平台能够支持广泛的硬件变体和定制化需求。 总结来说,`Android.mk`文件是Android编译系统的核心,它定义了如何将源代码转换为可执行的二进制文件。通过对`LOCAL_PATH`、`LOCAL_MODULE`、`LOCAL_SRC_FILES`等变量的设置,以及`include $(BUILD_XXX)`语句的使用,开发者能够控制编译过程,实现模块化的构建策略,确保Android应用程序和系统组件的正确编译和链接。


剩余7页未读,继续阅读






























- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于asyncio和aiohttp的七牛云Python异步客户端。.zip
- 基于 SQLAlchemy 和 Pydantic 的异步 Python
- 基于android,uiautomator2,opencv-python基于图片识别算法自动化统计页面加载.zip
- 基于bugscanner的python网站指纹识别练习脚本.zip
- 基于brython与codemirror的前端python运行页面.zip
- 基于blockly 生成 python scrapy代码练手小项目.zip
- 基于FFmpeg的python视频处理包-因疫情影响,工作比较繁忙,心情也没在视频上面再研究,该项目已经搁置,源码很简单,大家可以自己研究一下自己扩展.zip
- 基于Django 2.1.2 和Python 3 的个人漫画管理网站.zip
- 基于ES构建的一个简单的检索式问答系统,主要用来学习下python相关的ES操作.zip
- 基于Golang的GitHub反向代理下载 python源码来自:https___github.com_hunshcn_gh-proxy.zip
- 基于hash向量和共现矩阵的python聚类:DBSCAN、k-means、agglomerative.zip
- 基于Flask的Python全国招聘岗位就业可视化系统.zip
- 基于Jupyter notebook的一本python入门书。.zip
- 基于Keras预训练模型VGG16、ResNet50、InceptionV3,使用Python的HTTP框架Flask搭建图像识别接口.zip
- 基于kafka和python实现的某个功能.zip
- 基于Numpy和Boost__Python实现的矩量法.zip



评论0