android中Android.mk文件的写法

本文详细解析了Android应用在源码级别的编译配置过程,重点介绍了如何使用mk文件进行资源和Java文件的配置,以及如何针对不同类型的资源和库进行有效管理。

在源码中编译的时候要用mk文件来配置java文件和资源文件才能编译

就应用来说,通常在src和res文件夹同级的目录有一个mk文件来控制编译,我感觉 eclipse的目录层级和androidstudio相比较起来更“像”是源码里的应用的目录结构。

比如说闹钟系统app的位置  alps/packages/apps/DeskClock/

在这个文件夹下的结构如下图

可以看到这里有Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_RESOURCE_DIR := packages/apps/DeskClock/res
LOCAL_RESOURCE_DIR += frameworks/opt/datetimepicker/res

ifeq ($(TARGET_BUILD_APPS),)
LOCAL_RESOURCE_DIR += frameworks/support/design/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/gridlayout/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/res
else
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/design/res
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/appcompat/res
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/gridlayout/res
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/recyclerview/res
endif

LOCAL_CERTIFICATE := platform

LOCAL_PROGUARD_ENABLED := disabled

LOCAL_MODULE_TAGS := optional
#LOCAL_SDK_VERSION := current

LOCAL_PACKAGE_NAME := DeskClock
LOCAL_OVERRIDES_PACKAGES := AlarmClock

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

LOCAL_STATIC_JAVA_LIBRARIES := android-opt-datetimepicker
LOCAL_STATIC_JAVA_LIBRARIES += messageformat
LOCAL_STATIC_JAVA_LIBRARIES += android-support-design
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-appcompat
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-gridlayout
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-recyclerview

LOCAL_AAPT_FLAGS := --auto-add-overlay
LOCAL_AAPT_FLAGS += --extra-packages android.support.design
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.gridlayout
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview
LOCAL_AAPT_FLAGS += --extra-packages com.android.datetimepicker
LOCAL_AAPT_FLAGS += --extra-packages com.android.messageformat

LOCAL_PROGUARD_FLAG_FILES := ../../../frameworks/support/design/proguard-rules.pro

include $(BUILD_PACKAGE)

看着很乱,分层次来看就很清楚了。首先第一句 LOCAL_PATH := $(call my-dir) 定义了当前文件夹路径就是LOCAL_PATH ,

然后 从    include $(CLEAR_VARS) 到 include $(BUILD_PACKAGE) 这就是一个编译模块了。

include $(CLEAR_VARS) :清空参数

include $(BUILD_PACKAGE) :编译模块(类型)include $(BUILD_PACKAGE) ,就是说要编译个App出来,如果是include $(BUILD_STATIC_JAVA_LIBRARY)就是编译个jar包出来。还有其他的。。


剩下的这两行中间的就是这个模块的配置了。

这些配置都是有固定的意义,而且没有先后顺序。

LOCAL_RESOURCE_DIR:res文件夹(资源)用那些资源文件夹就往里+
TARGET_BUILD_APPS:是编App还是编系统什么的,网上查一下,因为mk好像有很多这种固定的变量

LOCAL_CERTIFICATE := platform :表示是平台的,也就是系统应用要系统签名

LOCAL_PACKAGE_NAME := DeskClock :生成的apk的名字还有它的文件夹的名字(位于alps/out/target/product/xxxx/system/app/)

LOCAL_OVERRIDES_PACKAGES := AlarmClock  覆盖的包名,例如一些厂商定制要覆盖掉原生的

LOCAL_SRC_FILES := $(call all-java-files-under, src gen):src,gen 这些文件夹下的java都要参与编译,也可以像res一样+

LOCAL_PROGUARD_ENABLED := disabled :代码要不要混淆

LOCAL_STATIC_JAVA_LIBRARIES:用到的系统中的jar包 也包括第三方的jar但是需要作为一个模块重新编一次

LOCAL_AAPT_FLAGS :R资源生成别名,查了一下为资源设置别名,这样别人也可以用定义的这些包名访问本app资源了

LOCAL_PROGUARD_FLAG_FILES:指定不需要混淆的native方法与变量的proguard.flags文件

还有很多别的配置,记得去搜索

其他的问题:

1)第三方的jar要放在mk里,就要编译模块,就像上边说的

include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := pinyin4j:lib/pinyin4j-2.5.0.jar
include $(BUILD_MULTI_PREBUILT)


LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := pinyin4j:lib/pinyin4j-2.5.0.jar:表示重新编译这个jar ,“:”前面为编后的名字“pinyin4j”,后面为编之前的名字“lib/pinyin4j-2.5.0.jar”。

添加到依赖的jar包

LOCAL_STATIC_JAVA_LIBRARIES += pinyin4j

2)AndroidStudio由于目录结构的问题, mk需要放在src/main/下面比较方便。

外层文件夹依次加入如下mk,又来调用main下面的mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

include $(call all-makefiles-under,$(LOCAL_PATH))


aidl文件写法:

LOCAL_SRC_FILES += ./aidl/包名/XX.aidl




### Android.bp 和 Android.mk 的区别及用法 #### 文件格式差异 `Android.mk` 使用的是 GNU Makefile 格式,而 `Android.bp` 则采用了一种更现代化的声明性配置语言 Blueprints (Blueprints DSL)[^5]。这种设计使得 `Android.bp` 更加简洁易读,并减少了冗余。 #### 构建系统支持版本 `Android.mk` 被广泛应用于基于旧版 Android 构建系统的项目中,即 Soong 之前的构建系统。然而,在 Android 7.0 (Nougat) 及之后的版本中,Google 推出了新的构建工具链——Soong,它主要依赖于 `Android.bp` 来描述模块和其属性[^6]。因此,对于较新版本的 Android 源码树来说,推荐优先使用 `Android.bp` 进行模块定义。 #### 性能表现对比 由于 `Android.bp` 是通过解析 JSON-like 数据结构实现快速加载与处理,相比起传统 make 工具逐行解释执行的方式效率更高,从而显著缩短了大型项目的编译时间[^7]。 #### 功能特性比较 - **条件判断**: 在 `Android.mk` 中可以灵活运用各种宏定义来进行复杂的逻辑控制;而在 `Android.bp` 当前仅限于简单的布尔表达式或者列表操作来决定某些字段是否存在。 - **变量作用域管理**: `Android.mk` 支持全局范围内的环境设置共享给多个目标文件; 对应到 `Android.bp`, 所有参数都必须显式指定,不存在隐式的继承关系。 - **跨平台兼容性考虑**: 如果涉及到不同架构下的差异化编译需求,则需分别编写各自的规则集放入对应的目录下。此时两者并无本质差别,均要遵循特定命名约定以便正确匹配所需资源路径。 以下是两个典型例子展示它们各自写法上的异同: ```makefile # Example of Android.mk file content. LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) ``` ```json // Equivalent representation using Android.bp format. cc_library_shared { name: "hello-jni", srcs: ["hello-jni.c"], } ``` 尽管如此,实际开发过程中可能还会遇到混合使用的场景,这是因为部分遗留代码尚未完全迁移到新体系之下所致[^8]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值