Android Make脚本简记.docx
- 文档编号:3409033
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:17
- 大小:30.68KB
Android Make脚本简记.docx
《Android Make脚本简记.docx》由会员分享,可在线阅读,更多相关《Android Make脚本简记.docx(17页珍藏版)》请在冰豆网上搜索。
AndroidMake脚本简记
AndroidMake脚本简记
原文地址:
原文作者:
Email:
zcatt@
Blog
一、
1、BuildLayers
BuildLayers描述的是产品的硬件配置情况,据此make时选择不同的配置和模块。
按照从上到下的顺序,BuildLayer分成4层。
Layer sample Note
Arch arm,x86 处理器的种类
Board - 板子类型的代号
Device - device配置的类型代号
Product - 具体产品的代号
2、添加应用
2.1、一个例子
以calculator为例,app代码可以放到packages/apps/目录下边,一个app对应一个目录,此例,pakcages/apps/Calculator/,创建Android.mk,已去除多余的注释行。
Java代码
1.LOCAL_PATH :
= $(call my-dir)
2.include $(CLEAR_VARS)
3.LOCAL_MODULE_TAGS :
= optional
4.LOCAL_STATIC_JAVA_LIBRARIES :
= libarity
5.LOCAL_SRC_FILES :
= $(call all-java-files-under, src)
6.LOCAL_SDK_VERSION :
= current
7.LOCAL_PACKAGE_NAME :
= Calculator
8.include $(BUILD_PACKAGE)
9.include $(CLEAR_VARS)
10.LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :
= libarity:
arity-2.1.2.jar
11.include $(BUILD_MULTI_PREBUILT)
12.# Use the folloing include to make our test apk.
13.include $(call all-makefiles-under,$(LOCAL_PATH))
Android.mk中需要赋值的几个LOCAL_XXX变量,
LOCAL_PATH ,调用my-dir(在defination.mk中定义),得到当前路径,即,
LOCAL_MODULE_TAGS ,取值范围debugengtestsoptionalsamplesshell_ashshell_mksh,注意不能取值user,如果要预装,则应定义core.mk;
LOCAL_SRC_FILES ,app的所有源码,可以调用all-java-files-under得到,如果是java源码的话;
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的列表
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。
取值范围userdebugengtestsoptionalsamplesshell_ashshell_mksh
LOCAL_ASSET_DIR,可选定义,推荐不定义。
默认$(LOCAL_PATH)/assets
LOCAL_RESOURCE_DIR,可选定义,推荐不定义。
默认productpackage和devicepackage相应的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).pk8和certificate:
=$(LOCAL_CERTIFICATE).x509.pem;
2.3、mm创建apk时的package.mk中变量分析
以Calculator为例,
由LOCAL_PATH,LOCAL_PACKAGE_NAME导出变量LOCAL_MODULE,all_assets,all_assets,all_resources。
设置LOCAL_MODULE_CLASS=APPS,此值local-intermediates-dir会用到。
设置中间生成目录路径,中间路径将放置R.stamp文件。
package_expected_intermediates_COMMON:
=$(calllocal-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:
=$(calllocal-intermediates-dir) @java.mk
最终
LOCAL_BUILT_MODULE=out/target/product/
即
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/
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 @definedinpackage.mk
out/target/common/obj/APPS/Calculator_intermediates/classes.jar @full_classes_jar
out/target/common/obj/APPS/Calculator_intermediates/classes-full-debug.jar @full_classes_compiled_jar
out/target/common/obj/APPS/Calculator_intermediates/emma_out/lib/classes-full-debug.jar @full_classes_emma_jar
out/target/common/obj/APPS/Calculator_intermediates/classes-full-names.jar@full_classes_full_names_jar
out/target/common/obj/APPS/Calculator_intermediates/stubs.jar@full_classes_stubs_jar
out/target/common/obj/APPS/Calculator_intermediates/classes-jarjar.jar @full_classes_jarjar_jar
out/target/common/obj/APPS/Calculator_intermediates/classes.dex @built_dex
java.mk随后includebase_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(Java.mk)的场景。
提取变量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
处理了javalib相关
定义clean-$(LOCAL_MODULE)target,可以删除app/package的生成文件,包括$(PRIVATE_CLEAN_FILES),$(LOCAL_BUILT_MODULE),$(LOCAL_INSTALLED_MODULE),$(intermediates),$(intermediates.COMMON)
还定义了$(LOCAL_MODULE)target,几个变量的值
LOCAL_MODULE=Calculator
LOCAL_BUILT_MODULE=out/target/product/generic/obj/APPS/Calculator_intermediates/package.apk
LOCAL_INSTALLED_MODULE=out/target/product/generic/system/app/Calculator.apk
最后定义了几个ALL_MODULES变量。
ALL_MODULES.$(LOCAL_MODULE).CLASS
ALL_MODULES.$(LOCAL_MODULE).PATH
ALL_MODULES.$(LOCAL_MODULE).TAGS
ALL_MODULES.$(LOCAL_MODULE).CHECKED
ALL_MODULES.$(LOCAL_MODULE).BUILT
ALL_MODULES.$(LOCAL_MODULE).INSTALLED
ALL_MODULES.$(LOCAL_MODULE).REQUIRED
ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS
3、multi_prebuilt.mk的分析
续1的场景。
mulit_prebuilt.mk顾名思义就是多次调用prebuilt.mk,对几种明确的prebuiltlibrary完成需要的copy操作。
multi_prebuilt.mk定义了命令auto-prebuilt-boilerplate。
入口有6个参数
#$
(1):
filelist,"
#$
(2):
IS_HOST_MODULE
#$(3):
MODULE_CLASS
#$(4):
OVERRIDE_BUILT_MODULE_PATH
#$(5):
UNINSTALLABLE_MODULE
#$(6):
BUILT_MODULE_STEM
根据这6个参数,命令确定
LOCAL_IS_HOST_MODULE
LOCAL_MODULE_CLASS
OVERRIDE_BUILT_MODULE_PATH
LOCAL_UNINSTALLABLE_MODULE
LOCAL_MODULE
LOCAL_SRC_FILES
LOCAL_BUILT_MODULE_STEM
LOCAL_MODULE_SUFFIX
并调用prebuilt.mk
multi_prebuilt.mk中分别对下面5中lib调用了auto-prebuilt-boilerplate。
prebuilt_static_libs:
=$(filter%.a,$(LOCAL_PREBUILT_LIBS))
prebuilt_shared_libs:
=$(filter-out%.a,$(LOCAL_PREBUILT_LIBS))
prebuilt_executables:
=$(LOCAL_PREBUILT_EXECUTABLES)
prebuilt_java_libraries:
=$(LOCAL_PREBUILT_JAVA_LIBRARIES)
prebuilt_static_java_libraries:
=$(LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES)
4、prebuilt.mk的分析
续1的场景。
首先,includebase_rules.mk
定义
PACKAGES.$(LOCAL_MODULE).OVERRIDES
第二步,如果是APPS类型,则zipalign,并拷贝到中间路径$(intermediates)。
不是APPS,则不做zipalign。
本例是JAVA_LIBRARY类型,目的路径out/target/common/obj/JAVA_LIBRARIES/libarity_intermediates/javalib.jar,注意其中的libarity和javalib.jar。
最后检查signed情况。
三、
1.findleaves.py的分析
main.mk中调用了findleaves.py,得到所有子目录下Android.mk文件的路径。
subdir_makefiles:
=\
$(shellbuild/tools/findleaves.py--prune=out--prune=.repo--prune=.git$(subdirs)Android.mk)
$(subdirs)一般编译中取值$(TOP)。
使用方法,
Usage:
%(progName)s[
Options:
--mindepth=
Bothbehaveinthesamewayastheirfind
(1)equivalents.
--prune=
Avoidsreturningresultsfrominsideanydirectorycalled
(e.g.,"*/out/*").Maybeusedmultipletimes.
程序首先依次选取dirlist中的目录,然后遍历所有子目录查找Android.mk文件,如果有,则加入到返回列表中。
2.pathmap.mk的分析
pathmap.mk中定义了一个列表pathmap_INCL,列表中每项是"短名:
路径"对。
命令include-path-for使用这个pathmap_INCL列表,输入短名,得到路径。
你可以在这个列表中添加自己的对。
使用$(callinclude-path-for,<短名>)就可以得到路径。
另外,定义了FRAMEWORKS_BASE_JAVA_SRC_DIRS,含有frameworks/base目录下含java文件的所有目录。
3.config.mk的分析
首先,包含pathmap.mk,其次,定义了一些变量,例如通用的编译参数,package的后缀名等。
随后包含buildspec.mk。
接着包含envsetup.mk。
然后包含$(board_config_mk)。
$(board_config_mk)是位于build/target/board/$(TARGET_DEVICE)/,device/*/$(TARGET_DEVICE)/,或vendor/*/$(TARGET_DEVICE)/目录下的BoardConfig.mk文件。
-------TODO
4.buildspec.mk的分析
buildspec.mk是用户
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android Make脚本简记 Make 脚本 简记