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_PATH
,LOCAL_PACKAGE_NAME
导出变量LOCAL_MODULE
,all_assets
,all_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的生成文件,包括