Android.mk的基本构成
这个Android.mk 会编译出一个hello的可执行文件,并放入system/bin
LOCAL_PATH := $(call my-dir) #指定当前目录
include $(CLEAR_VARS) #引入编译变量
LOCAL_MODULE := hello #编译出来的模块名
LOCAL_MODULE_TAGS := optional #编译选项便是在何种情况下编译
LOCAL_SRC_FILES := hello.c #源文件(可以指定多个)
LOCAL_MODULE_CLASS := EXECUTABLES #指定编译之后放置的位置(此处指示放在system/bin下)
include $(BUILD_EXECUTABLE) #引入编译成可执行文件的规则
参考实例
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := SystemCore
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := SystemCore_v5.2.5.7-10.apk
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/app
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := libjni_gpiocontrol.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := libjni_gpiocontrol.so
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/lib
include $(BUILD_PREBUILT)
代码编译规则
-
LOCAL_PATH
指定目录,以上是一般用法指示当前目录(my-dir函数是Android编译时. build/envsetup.sh命令生成的 能够获取当前目录的路径) -
include $(CLEAR_VARS)
android有自己的一套代码编译规则跟编译选项等变量的定义,此变量实际是build/core/clear_vas.mk
-
LOCAL_MODULE
必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格 -
LOCAL_MODULE_TAGS
user 模块只在user版本下编译
eng 模块只在eng版本下编译
tests 模块只在test版本下编译
optional 模块在所有版本下都编译
- LOCAL_MODULE_CLASS
标识了所编译模块最后放置的位置,如果不指定,不会放到系统中,之后放在最后的obj目录下的对应目录中.
编译C/C++规则build/core/definitions.mk
LOCAL_MODULE_CLASS用于制定LOCAL_MODULE_PATH的路径所在
自己编写的Android.mk可不显示的指定LOCAL_MODULE_CLASS的值。
但当遇到include $(BUILD_PREBUILT)的预编译选项时不会指定模块模块编译输出的类型CLASS,需要在自己编写的Android.mk中明确指定LOCAL_MODULE_CLASS的值如ETC/APP等,使其值为非空,从而帮助系统确定LOCAL_MODULE_PATH的路径,比如最终编译输出LOCAL_MODULE_PATH := $(TARGRT_OUT_ETC)。
LOCAL_MODULE_CLASS := ETC #表示放于system/etc目录
LOCAL_MODULE_CLASS := EXECUTABLES #放于/system/bin
LOCAL_MODULE_CLASS := SHARED_LIBRARIES #放在/system/lib下
-
LOCAL_MODULE_PATH
目标安装路径 -
LOCAL_MODULE_RELATIVE_PATH
指定动态库的相对路径,以各自编译对象放置的目录为参考。
android.mk文件中有
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw 改为
LOCAL_MODULE_RELATIVE_PATH := hw
后一种可以分别在lib和lib64下分别生成32位和64位的so文件
- LOCAL_CERTIFICATE
签名方式
testkey 普通APK,默认情况下使用。
platform 该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
shared 该APK需要和home/contacts进程共享数据。
media 该APK是media/download系统中的一环。
- LOCAL_SRC_FILES
源文件列表
#添加所有cpp文件
MY_CPP_LIST += $(wildcard $(LOCAL_PATH)/src/core/*.cpp)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
- include $(BUILD_XXX)
表示编译出来的模块类型,有三种
BUILD_EXECUTABLE 编译成可执行的模块 build/core/host_executable.mk
BUILD_STATIC_LIBRARY 编译成静态库 build/core/host_static_library.mk
BUILD_SHARED_LIBRARY 编译成动态库 build/core/host_shared_library.mk
BUILD_PREBUILT :
这种方式把文件当成编译项目,在Android.mk中copy一个file