Android.mk详解(1)

本文详细介绍了Android.mk文件的使用,从LOCAL_PATH的设置到LOCAL_MODULE的定义,涵盖LOCAL_SRC_FILES、LOCAL_MODULE_TAGS、LOCAL_MODULE_CLASS等关键配置。通过实例解析,解释了如何控制模块编译条件、源文件指定及预编译方法。对于Android开发者理解构建过程非常有帮助。

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

首先看一个最简单的Android.mk的例子(无源码apk预置)

LOCAL_PATH:= $(call my-dir)                                    #指定当前目录
include $(CLEAR_VARS)                                          #引入编译变量 
LOCAL_MODULE := Demo                                            #编译出来的模块名
LOCAL_MODULE_TAGS := optional                                   #编译选项便是在何种情况下编译
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk                         #源apk
LOCAL_MODULE_CLASS := APPS                                      #指定文件类型,apk文件用APPS,
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)            #指定module的后缀,这里是.apk
LOCAL_CERTIFICATE := PRESIGNED                                  #指定是否进行系统签名,
LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app         #指定拷贝的目的目录
include $(BUILD_PREBUILT)                                      #引入编译成可执行文件的规则

讲解如下:

LOCAL_PATH := $(call my-dir)

每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。
宏my-dir 则由Build System提供。返回包含Android.mk的目录路径。

include $(CLEAR_VARS) 

CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.

例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.

这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

LOCAL_MODULE := Demo

LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。

Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_TAGS :=user eng tests optional
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk 这种是直接指定源apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_CLASS 指定文件类型,apk文件用APPS, 并且 会检查 是否是apk文件,动态库so文件用SHARED_LIBRARIES ,bin文件用EXECUTABLES,其他文件 用ETC

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_MODULE_SUFFIX, 不用定义,module的后缀,=.apk。

LOCAL_CERTIFICATE := PRESIGNED

LOCAL_CERTIFICATE := PRESIGNED 表示 这个apk已经签过名了,系统不需要再次 签名;

LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app

LOCAL_MODULE_PATH 指定拷贝的路径,如果路径不存在自己创建

include $(BUILD_PREBUILT)

Android提供了Prebuilt编译方法,两个文件prebuilt.mk和multi_prebuilt.mk,对应的方法宏是BUILD_PREBUILT和 BUILD_MULTI_PREBUILT。
prebuilt.mk就是prebuilt的具体实现,它是针对独立一个文件的操作,multi_prebuilt.mk 可以针对多个文件的,它对多个文件进行判断,然后调用prebuilt对独立一个文件进行处理。

补充说明:
:=是赋值的意思,
+=是追加的意思,
$是引用某变量的值

BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。

include (BUILDPACKAGE)apkinclude (BUILD_STATIC_JAVA_LIBRARY)则是编译出jar包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值