Android Make脚本的简记(1)

转自 http://blog.chinaunix.net/u/8866/

本文详细解析了编译系统的mk脚本文件,特别用示例的方式描述了编译的过程。


1.    Build Layers

Build Layers描述的是产品的硬件配置情况,据此make时选择不同的配置和模块。按照从上到下的顺序,Build Layer分成4层。
Layer    sample    Note
Arch    arm, x86    处理器的种类
Board    
    板子类型的代号
Device    
    device配置的类型代号
Product    
    具体产品的代号

2.    Android.mk中使用的LOCAL_VARS

2.1 Calculator as Sample

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 following 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_FILESapp的所有源码,可以调用all-java-files-under得到,如果是java源码的话。
LOCAL_PACKAGE_NAMEpackage的名字,这个名字在脚本中将标识这个apppackage
$(CLEAR_VARS)指的是clear_vars.mk,脚本会清空所有LOCAL_xxx的变量,不影响后面这些变量的使用。
$(BUILD_PACKAGE)指的是package.mk生成规则
最后一句all-makefiles-under将会包含当前目录下所有的mk脚本文件。

2.2 LOCAL_XXX的列表

Include $(CLEAR_VARS),可以做为局部宏定义使用.

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

LOCAL_PATH            当前路径,必须定义。
LOCAL_PACKAGE_NAME    必须定义,package的名字,这个名字在脚本中将标识apppackage
LOCAL_MODULE_SUFFIX    不用定义,module的后缀,=.apk
LOCAL_MODULE            不用定义,=$(LOCAL_PACKAGE_NAME)
LOCAL_JAVA_RESOURCE_DIRS    不用定义。
LOCAL_JAVA_RESOURCE_FILES    不用定义。
LOCAL_MODULE_CLASS    APPS/ETC(for firmware)/EXECUTABLES/STATIC_LIBRARYS/SHARED_LIBRARYS/JAVA_LIBRARYS
LOCAL_MODULE_TAGS        可选定义。默认optional。取值范围user debug eng tests optional samples shell_ash shell_mksh
LOCAL_ASSET_DIR    可选定义,推荐不定义。默认$(LOCAL_PATH)/assets
LOCAL_RESOURCE_DIR    可选定义,推荐不定义。默认product packagedevice package相应的res路径和$(LOCAL_PATH)/res

LOCAL_EXPORT_PACKAGE_RESOURCES    可选定义,默认null。如果允许app的资源被其它模块使用,则设置true
LOCAL_PROGUARD_ENABLED    可选定义,默认为full,如果是useruserdebug。取值full, disabled, custom

LOCAL_MANIFEST_FILE    AndroidManifest.xml
full_android_manifest        不用定义,=$(LOCAL_PATH)/AndroidManifest.xml

LOCAL_CERTIFICATE    可选定义,默认为testkey。最终
        private_key := $(LOCAL_CERTIFICATE).pk8
        certificate := $(LOCAL_CERTIFICATE).x509.pem

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

Calculator为例,
设置中间生成目录路径,中间路径将放置R.stamp文件。
LOCAL_PATH 导出LOCAL_ASSET_DIR all_assetsLOCAL_RESOURCE_DIR all_resources,由LOCAL_PACKAGE_NAME导出变量LOCAL_MODULE
设置LOCAL_MODULE_CLASS=APPS,此值local-intermediates-dir会用到。
package_expected_intermediates_COMMON := $(call local-intermediates-dir,COMMON)
这里COMMONnull,而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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值