LOCAL_PATH := $(call my-dir) 此变量表示源码所在目录,写法固定
include $(CLEAR_VARS) 清除 除LOCAL_PATH变量外其它缓存变量
LOCAL_MODULE 此变量表示模块名称
LOCAL_SRC_FILES 此变量包含构建系统生成模块时所用的源文件列表
LOCAL_MODULE_SUFFIX 此变量表示后缀名
LOCAL_PREBUILT_JNI_LIBS 只适用编译第三方app,且app依赖了so库 *
LOCAL_MULTILIB 此变量表示编译32位还是64位架构
LOCAL_MANIFEST_PACKAGE_NAME 本地清单包名
LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块
LOCAL_SDK_VERSION 指定编译sdk版本
include $(BUILD_PREBUILT) 该指令编译目标apk
include ( c a l l a l l − m a k e f i l e s − u n d e r , (call all-makefiles-under, (callall−makefiles−under,(LOCAL_PATH))搜索编译该源码目录下所有mk文件
LOCAL_PACKAGE_NAME 此常量表示App应用名称
LOCAL_OVERRIDES_PACKAGES 此常量可以使其它模块不加入编译
LOCAL_PRIVATE_PLATFORM_APIS 设置后,会使用sdk的hide的api来编译,不可以跟LOCAL_SDK_VERSION常量一起,会导致不能访问hide的api而报错
LOCAL_USE_AAPT2 此常量为是否使用aapt2
LOCAL_RESOURCE_DIR 此常量表示Res的路径
LOCAL_STATIC_ANDROID_LIBRARIES 指定依赖的android类库
LOCAL_JAVA_LIBRARIES 指定依赖的共享java类库,只是在编译的时候引用
LOCAL_STATIC_JAVA_LIBRARIES 指定依赖的静态java类库,最终会打包到Apk里
LOCAL_PROGUARD_FLAG_FILES 指定混淆配置
LOCAL_JNI_SHARED_LIBRARIES 编译jni
LOCAL_DEX_PREOPT 此变量设置为false 可以 使整个系统使用提前优化的时候,某个app不使用提前优化
LOCAL_REPLACE_PREBUILT_APK_INSTALLED apk路径
LOCAL_CERTIFICATE 此常量为设置签名
签名的方式:
testkey 普通apk,默认情况下使用,默认为使用apk自己的签名
platform 使用平台签名
shared 使用共享签名,该apk需要和home/contacts进行共享数据
media 使用媒体签名,该apk是media/download系统中的一环
LOCAL_MODULE_PATH 指定最后安装位置,默认等于TARGET_OUT_$(LOCAL_MODULE_CLASS),
可以手动指定,如:
$$(TARGET_OUT)/preload-app 存放位置为 system/preload-app
其中含有几个固定路径写法
TARGET_ROOT_OUT 表示根文件系统
TARGET_OUT 表示system文件系统
TARGET_OUT_DATA 表示data文件系统
LOCAL_MODULE_CLASS 此变量表示 指定模块的类型
一般可以不用定义,如果不定义则 不存放到系统中,会放到obj目录下对应目录中
如果 include $()里的值为BUILD_PREBUILT 则必须定义MODULE_CLASS
其中常用的几种参数及含义与 默认下的LOCAL_MODULE_PATH 配合后存放的位置
ETC ,存放于system/etc
EXECUTABLES 编译可执行文件,存放于system/bin
SHARED_LIBRARIES 定义动态库文件,放于system/lib
JAVA_LIBRARIES 编译jar包,
APPS 编译apk文件,存放于system/app
LOCAL_MODULE_TAGS 此变量表示模块编译模式,一般默认为optional
包含模式有:
optional 该模块所有编译版本下都编译
user 该模块只在user编译版本下才编译
eng 该模块只在eng编译版本下才编译
tests 该模块只在tests编译版本下才编译
项目remake时如果监测到非该编译版本下的编译模式,会报错停止
LOCAL_PROPRIETARY_MODULE 控制生成路径到system/vendor/lib,否则就是system/lib
LOCAL_PRIVILEGED_MODULE 此常量决定了其编译后在的安装位置
设置为true,安装位置为system/priv-app,不设置或设置为false,安装位置为system/app
跟LOCAL_MODULE_PATH一起使用的时候,如果设置true,则LOCAL_PRIVILEGED_MODULE 优先级高,如果设置为false 则LOCAL_MODULE_PATH优先级高
引用第三方java类库
使用方法:
项目下创建libs目录,放入需要导入的jar包
在Android.mk中添加
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := aaa:libs/xxxx.jar
include $(BUILD_MULTI_PREBUILT)
LOCAL_STATIC_JAVA_LIBRARIES := aaaa
BUILD_MULTI_PREBUILT 指令的作用是将静态java类库压缩到.dex文件中
问题一
error: X (java:sdk) should not link to Y (java:platform)
解决办法:
LOCAL_SDK_VERSION 替换成 LOCAL_PRIVATE_PLATFORM_APIS := true
问题二
代码里java文件找不到jar包里的类
解决办法:暂无
android 源码中添加第三方APK Android.mk内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestDemo
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)
android 源码中以源码形式添加第三方app Android.mk内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := TestDemo
LOCAL_SDK_VERSION := current
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_MODULE_TAGS := optional
LOCAL_USE_AAPT2 := true
LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.appcompat_appcompat \
com.google.android.material_material \
androidx-constraintlayout_constraintlayout
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
编译条件语句
ifeq 当条件成立后执行
例:
ifeq($(strip $(TEST)),yes)
xxxx
endif
当TEST 为 yes后才执行xxx代码
ifneq 当条件不成立后执行
例:
ifeq($(strip $(TEST)),yes)
xxxx
endif
当TEST 为 no后才执行xxx代码