1.LOCAL_PATH:= $(call my-dir) 必须有
Android.mk必须以LOCAL_PATH变量开始,它用于在树中定位文件。
宏功能my-dir是buildsystem提供的,用于返回当前目录路径。
2.include$(CLEAR_VARS) 必须有
CLEAR_VARS是buildsystem提供的变量。这个功能会清理掉所有以LOCAL_开头的内容(除了LOCAL_PATH),可以理解成在include(CLEAR_VARS)上定义的其它LOCAL_开头的内容都不会生效。由于所有的MakeFile都是在一个编译环境下执行的,因此
变量的定义理论上是全局的,在每个模块编译开始前进行清理工作是必要的。
3.LOCAL_MODULE_TAGS:= user eng optional tests userdebug 可选定义
默认是optional,一般选optional就可以了,表示该模块在所有版本下都可以编译。
不定义的时候默认是optional。
4.LOCAL_MODULE:= Calculator
LOCAL_PACKAGE_NAME:= Calculator
这两个必须要定义一个。应该是一个意思。
模块名,需保证在整个编译系统中是唯一存在的,而且中间不可以有空格
个人感觉一般带源码的用的是LOCAL_PACKAGE_NAME,而直接预置的apk的是用的LOCAL_MODULE.
后续在device/medetik/mt6735/bird.mk中添加应用时候
PRODUCT_PACKAGES+= Calculator 要保持一致。
5.LOCAL_MODULE_SUFFIX:=$(COMMON_ANDROID_PACKAGE_SUFFIX)
suffix:后缀
6.LOCAL_SRC_FILES:= $(call all-java-files-under,src) 有源码的
LOCAL_SRC_FILES:= $(LOCAL_MODULE).apk 直接apk的
LOCAL_SRC_FILES:= Calculator.apk 直接apk的
LOCAL_SRC_FILES:= $(call all-subdir-java-files)
几种写法如上。
必须有。
7.LOCAL_MODULE_PATH:= $(TARGET_OUT_DATA_APPS)
LOCAL_MODULE_PATH:= $(TARGET_OUT)/vendor/operator/app
模块的输出路径,加上这句预置的apk是可以卸载的。
可选定义。
8.LOCAL_MODULE_CLASS:= APPS ETC SHARED_LIBRARIES EXECUTABLES
标识模块编译后放置的位置。ETC对应system/etc
APPS对应system/app或者system/priv-app
只有这一句的话是system/app,如果要放在system/priv-app需要配合LOCAL_PRIVILEGED_MODULE:= true使用
priv就是privileged(特权)的缩写
SHARED_LIBRARIES对应system/lib
EXECUTABLES对应system/bin
在不同的Android.mk文件中,对于模块include()不同的编译类型选项,比如对于Library或者app,execut等在调用对应的处理mk文件时,会默认就指定当前的LOCAL_MODULE_CLASS的值,比如EXECUTABLES、SHARED_LIBRARIES等。所以在自己编写的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)。
9.
$(callmy-dir) | 获取当前文件夹的路径 |
$(callall-java-files-under,<src>) | 获取指定目录下的所有java文件 |
$(callall-c-files-under, <src>) | 获取指定目录下的所有c文件 |
$(callall-Iaidl-files-under, <src>) | 获取指定目录下的所有AIDL文件 |
$(callall-makefiles-under, <folder>) | 获取指定目录下的所有Make文件 |
10.LOCAL_RESOURCE_DIR:= $(LOCAL_PATH)/res
重定向本地资源文件
如果只有res目录,默认可以不写?
多个res(如res,res_ext,res_bird)的时候再写?
11.LOCAL_PROGUARD_FLAG_FILES:=proguard.flags
使用代码混淆
12.include$(BUILD_PACKAGE)
include$(BUILD_PREBUILD)
include$(BUILD_EXECUTABLE)
include$(BUILD_XXX)
include$(BUILD_PACKAGE)一般用在带源码的apk预置
include$(BUILD_PREBUILD)一般用在无源码的apk预置
这个是Android.mk的重点,它表示将源码编译成什么目标文件,如动态库、可执行程序、APK等,它一般被认为是一个编译模块的结束标志
BUILD_EXECUTABLE | 编译成可执行的模块 |
|
BUILD_STATIC_LIBRARY | 编译成静态库 |
|
BUILD_SHARED_LIBRARY | 编译成动态库 |
|
13.LOCAL_CERTIFICATE:=media platform shared PRESIGNED
用于指定签名时使用的KEY,如果不指定,默认使用testkey,LOCAL_CERTIFICATE可设置的值如下:
LOCAL_CERTIFICATE:= platform
LOCAL_CERTIFICATE:= shared
LOCAL_CERTIFICATE:= media
而在Android.mk中的这些配置,需要在APK源码的AndroidManifest.xml文件中的manifest节点添加如下内容:
android:sharedUserId="android.uid.system"
android:sharedUserId="android.uid.shared"
android:sharedUserId="android.media"
这些刚好与上面的mk文件里的配置对应上。
在Android源码的build/target/product/security/目录下有如下的4对KEY:
1、media.pk8与media.x509.pem;
2、platform.pk8与platform.x509.pem;
3、shared.pk8与shared.x509.pem;
4、testkey.pk8与testkey.x509.pem;
其中,“*.pk8”文件为私钥,“*.x509.pem”文件为公钥,这需要去了解非对称加密方式。
LOCAL_CERTIFICATE:= PRESIGNED 表示这个apk已经签过名了,系统不需要再次签名;
14.include$(call all-makefiles-under,$(LOCAL_PATH))
表示需要build该目录下的子目录的文件,这样编译系统就会在当前目录下的子目录寻找Android.mk来编译so等其它程序。
15.注意:若是被预置的apk里有so库,需要将从Test.apk的so库(Test.apk解压出来的so库)拷贝到out/target/product/xxx/system/lib/目录下,若无so库,则去掉此步;
16.LOCAL_MULTILIB:= both 32 64 first ""
指定编译目标为32位或64位
"both" // build both 32-bit and 64-bit
"32" // build 32-bit
"64" // build 64-bit
"first" // build for the first arch (32-bit in 32-bit device, 64-bit in64-bit device)
"" // the default
17.LOCAL_MODULE_TARGET_ARCH:= arm 或armx86或arm64
指定目标lib库的类型