当前位置: 代码迷 >> 综合 >> AOSP mk文件总结
  详细解决方案

AOSP mk文件总结

热度:99   发布时间:2023-12-12 22:41:02.0

1 Build Layers

Build Layers描述的是产品的硬件配置情况,据此make时选择不同的配置和模块。按照从上到下的顺序,Build Layer分成4层。

Layer    sample    Note
Arch    arm, x86    处理器的种类
Board    -    板子类型的代号
Device    -    device配置的类型代号
Product    -    具体产品的代号

2 添加应用

2.1 一个例子

以calculator为例,app代码可以放到packages/apps/目录下边,一个app对应一个目录,此例,pakcages/apps/Calculator/。Android.mk,已去除多余的注释行。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := libarity
LOCAL_SRC_FILES := $(call all-Java-files-under, src)
LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := Calculator
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:arity-2.1.2.jar
include $(BUILD_MULTI_PREBUILT)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

至少有一个子目录,src下放源码。

android.mk中需要赋值的几个LOCAL_XXX变量

LOCAL_PATH,调用my-dir(在defination.mk中定义),得到当前路径,即,<yourSrcPath>/ pakcages/apps/Calculator/

LOCAL_MODULE_TAGS,取值范围debug eng tests optional samples shell_ash shell_mksh,注意不能取值user,如果要预装,则应定义core.mk。

LOCAL_SRC_FILES,app的所有源码,如果是java源码的话,可以调用all-java-files-under得到。

LOCAL_PACKAGE_NAME,package的名字,这个名字在脚本中将标识这个app或package。

$(CLEAR_VARS)指的是clear_vars.mk,脚本会清空所有LOCAL_xxx的变量,不影响后面这些变量的使用。

$(BUILD_PACKAGE)指的是package.mk
最后一句all-makefiles-under将会 包含 当前目录下 所有的mk脚本 文件。

2.2 LOCAL_XXX的列表相关简绍

说明:
必须定义, 在app或package的Android.mk中必须给定值。
可选定义,在app或package的Android.mk中可以也可以不给定值。
不用定义,在app或package的Android.mk中不要给定值,脚本自动指定值。

LOCAL_PATH, 当前路径,必须定义

LOCAL_PACKAGE_NAME, 必须定义,package的名字,这个名字在脚本中将标识app或package。

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

LOCAL_MODULE, 不用定义,=$(LOCAL_PACKAGE_NAME)。

LOCAL_JAVA_RESOURCE_DIRS, 不用定义。

LOCAL_JAVA_RESOURCE_FILES, 不用定义。

LOCAL_MODULE_CLASS, 不用定义。

LOCAL_MODULE_TAGS, 可选定义。默认optional。取值范围user debug eng tests optional samples shell_ash shell_mksh

LOCAL_ASSET_DIR, 可选定义,推荐不定义。默认$(LOCAL_PATH)/assets

LOCAL_RESOURCE_DIR, 可选定义,推荐不定义。默认product package和device package相应的res路径和$(LOCAL_PATH)/res。

LOCAL_PROGUARD_ENABLED, 可选定义,默认为full,如果是user或userdebug。取值full, disabled, custom, full_android_manifest, 不用定义


=$(LOCAL_PATH)/AndroidManifest.xml。

LOCAL_EXPORT_PACKAGE_RESOURCES, 可选定义,默认null。如果允许app的资源被其它模块使用,则设置true。

LOCAL_CERTIFICATE, 可选定义,默认为testkey。最终

        private_key := $(LOCAL_CERTIFICATE).pk8certificate := $(LOCAL_CERTIFICATE).x509.pem

2.3 mm创建apk时的package.mk中变量分析

以Calculator为例,
LOCAL_PATHLOCAL_PACKAGE_NAME导出变量LOCAL_MODULEall_assetsall_resources
设置LOCAL_MODULE_CLASS=APPS,此值local-intermediates-dir会用到。
设置中间生成目录路径,中间路径将放置R.stamp文件。

package_expected_intermediates_COMMON := $(call local-intermediates-dir,COMMON)

这里COMMON是null,而LOCAL_MODULE_CLASS=APPS,所以

package_expected_intermediates_COMMON=out/target/common/obj/$(LOCAL_MODULE_CLASS)/$(LOCAL_MODULE)_intermediates

package_expected_intermediates_COMMON=out/target/common/obj/APPS/Calculator_intermediates

设置

LOCAL_BUILT_MODULE_STEM := package.apk

LOCAL_BUILT_MODULE := $(built_module_path)/$(LOCAL_BUILT_MODULE_STEM)    @base_rules.mk
built_module_path := $(intermediates)        @base_rules.mk
intermediates := $(call local-intermediates-dir)    @java.mk

最终

LOCAL_BUILT_MODULE=out/target/product/<PRODUCT>/obj/$(LOCAL_MODULE_CLASS)/$(LOCAL_MODULE)_intermediates/$(LOCAL_BUILT_MODULE_STEM)

LOCAL_BUILT_MODULE=out/target/product/generic/obj/APPS/Calculator_intermediates/package.apk

LOCAL_CERTIFICATE导出

private_key := $(SRC_TARGET_DIR)/product/security/$(LOCAL_CERTIFICATE).pk8
certificate := $(SRC_TARGET_DIR)/product/security/$(LOCAL_CERTIFICATE).x509.pem
LOCAL_CERTIFICATE默认为testkey。

2.4 package.mk中定义的几个PACKAGE.xxx变量

PACKAGES.$(LOCAL_PACKAGE_NAME).PRIVATE_KEY := $(private_key)
PACKAGES.$(LOCAL_PACKAGE_NAME).CERTIFICATE := $(certificate)
PACKAGES.$(LOCAL_PACKAGE_NAME).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))
PACKAGES.$(LOCAL_PACKAGE_NAME).RESOURCE_FILES := $(all_resources)PACKAGES := $(PACKAGES) $(LOCAL_PACKAGE_NAME)

全编译时,PACKAGES变量将会记录遍历到的packages。


1. java.mk分析

选取APPS场景,以Calculator为例说明。
LOCAL_JAVA_LIBRARIES=true时,Android.mk中不能定义LOCAL_SDK_VERSION
LOCAL_SDK_VERSION=current时,LOCAL_JAVA_LIBRARIES=android_stubs_current

package.mk中定义LOCAL_BUILT_MODULE_STEM=package.apk
两个中间目录的路径,即对应的obj目录下

APPS/<LOCAL_MODULE>_intermediates/。
intermediates=out/target/product/generic/obj/APPS/Calculator_intermediates
intermediates.COMMON=out/target/common/obj/APPS/Calculator_intermediates

LOCAL_INTERMEDIATE_TARGETS先前package.mk中已经定义了R.stamp,java.mk有增添了7个。

LOCAL_INTERMEDIATE_TARGETS += \$(full_classes_jar) \$(full_classes_compiled_jar) \$(full_classes_emma_jar) \$(full_classes_full_names_jar) \$(full_classes_stubs_jar) \$(full_classes_jarjar_jar) \$(built_dex)

此例中,具体值是

LOCAL_INTERMEDIATE_TARGETS=out/target/common/obj/APPS/Calculator_intermediates/src/R.stamp            @defined in package.mkout/target/common/obj/APPS/Calculator_intermediates/classes.jar            @full_classes_jarout/target/common/obj/APPS/Calculator_intermediates/classes-full-debug.jar        @full_classes_compiled_jarout/target/common/obj/APPS/Calculator_intermediates/emma_out/lib/classes-full-debug.jar    @full_classes_emma_jarout/target/common/obj/APPS/Calculator_intermediates/classes-full-names.jar @full_classes_full_names_jarout/target/common/obj/APPS/Calculator_intermediates/stubs.jar @full_classes_stubs_jarout/target/common/obj/APPS/Calculator_intermediates/classes-jarjar.jar    @full_classes_jarjar_jarout/target/common/obj/APPS/Calculator_intermediates/classes.dex    @built_dex

java.mk随后include base_rules.mk

后面处理了EMMA,PROGUARD在enable/disable情况下的动作

最后定义的target, $(LOCAL_MODULE)-findbugs因为prebuilt/common下还没有findbugs,目前不可用。

java.mk还定义了几个特别的变量,

ALL_MODULES.$(LOCAL_MODULE).PROGUARD_ENABLED:=$(LOCAL_PROGUARD_ENABLED)
ALL_MODULES.$(LOCAL_MODULE).CHECKED := $(full_classes_compiled_jar)
ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar)

2. base_rules.mk的分析

续1的场景。
提取变量

my_prefix:=TARGET_LOCAL_MODULE_TAGS

在Android.mk或package.mk中已经设定,默认是optional。
确认LOCAL_MODULE_PATH,默认$($(my_prefix)OUT$(use_data)_$(LOCAL_MODULE_CLASS)),此例中是out/target/product/generic/system/app
设定module_id := MODULE.$(TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE),此例MODULE.TARGET.APPS.Calculator。
设定中间目录路径intermediates,intermediates.COMMON,参见1.

设定LOCAL_MODULE_STEM=$(LOCAL_MODULE),此例,Calculator。LOCAL_INSTALLED_MODULE_STEM=Calculator.apk。

LOCAL_INTERMEDIATE_TARGETS追加上package.apk,参见1.

处理aidl,转为java,放在intermediates.COMMON下的目录中。

处理logtag,转为java,放在intermediates.COMMON下的目录中。

确定java_sources,这包括android.mk中包含的,aidl和logtag生成的。

处理java_resource_files

处理了Java lib相关

定义clean-$(LOCAL_MODULE) target, 可以删除app/package的生成文件,包括