Android.mk学习

1.LOCAL_PATH:= $(call my-dir) 必须有

Android.mk必须以LOCAL_PATH变量开始,它用于在树中定位文件。

宏功能my-dirbuildsystem提供的,用于返回当前目录路径。

2.include$(CLEAR_VARS) 必须有

CLEAR_VARSbuildsystem提供的变量。这个功能会清理掉所有以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的值,比如EXECUTABLESSHARED_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(如resres_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,如果不指定,默认使用testkeyLOCAL_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/目录下有如下的4KEY

1media.pk8media.x509.pem

2platform.pk8platform.x509.pem

3shared.pk8shared.x509.pem

4testkey.pk8testkey.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.apkso(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 armx86arm64

指定目标lib库的类型



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值