Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188004
  • 博文数量: 50
  • 博客积分: 1053
  • 博客等级: 少尉
  • 技术积分: 577
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-05 22:55
文章分类

全部博文(50)

文章存档

2016年(2)

2015年(1)

2014年(6)

2012年(11)

2011年(22)

2010年(5)

2009年(3)

我的朋友

分类: LINUX

2011-03-29 10:14:02

http://blogold.chinaunix.net/u/8866/

#后记:主要解释了几大变量。比上篇文章深入
Android Make脚本的简记(1) 


Email:    zcatt@163.com
Blog    http://zcatt.cublog.cn

 
内容提要
文档简要整理Android的make脚本的内容。以供备忘和参考。



声明
仅限学习交流,禁止商业用途。转载需注明出处。


版本记录
Date    Ver    Note
2010-11-05    0.1    Draft.  zcatt@Beijing
 
 
1.    Build LayersBuild Layers描述的是产品的硬件配置情况,据此make时选择不同的配置和模块。按照从上到下的顺序,Build Layer分成4层。
Layer    sample    Note
Arch    arm, x86    处理器的种类
Board    -    板子类型的代号
Device    -    device配置的类型代号
Product    -    具体产品的代号
66:就是4层次.

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

0.3阶级:每个应用程序 都有一个makefile
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中定义),得到当前路径,即,/ pakcages/apps/Calculator/。
LOCAL_MODULE_TAGS,,取值范围debug eng tests optional samples shell_ash shell_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脚本文件。


66:从上,可以看到作者介绍,比kandroid的详细多了,还有列出了作用,还有好多自助工具"call *" :-)

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).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文件。

66:索引变量1:package_expected_intermediates_COMMON
package_expected_intermediates_COMMON := $(call local-intermediates-dir,COMMON)
这里COMMON是null,而LOCAL_MODULE_CLASS=APPS,

66:0.3 这里说到common是null.这是怎么回事?
所以
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

66:索引变量2:LOCAL_BUILT_MODULE 

设置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//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。
阅读(1845) | 评论(0) | 转发(0) |
0

上一篇:2011-03-29

下一篇:2011-03-29

给主人留下些什么吧!~~