Android系统lunch一个当前的Product大概流程包括下面几个部分:

1. lunch确定TARGET_PRODUCT。一般位于vendor/device/build/target/product中的vendorsetup.sh脚本来定义分别有user/eng/userdebug。

2. 开发check product的合理性。

通过载入vendor/device/build/target/product中的AndroidProduct.mk文件,记录其包括的各个.mk文件以及其所在的路径,作为当前的all_product_makefile.

通过选择的TARGET_PRODUCT filter到current_prodcut_makefile.

197 current_product_makefile :=
198 all_product_makefiles :=
199 $(foreach f, $(all_product_configs),\
200 $(eval _cpm_words := $(subst :,$(space),$(f)))\
201 $(eval _cpm_word1 := $(word 1,$(_cpm_words)))\
202 $(eval _cpm_word2 := $(word 2,$(_cpm_words)))\
203 $(if $(_cpm_word2),\
204 $(eval all_product_makefiles += $(_cpm_word2))\
205 $(if $(filter $(TARGET_PRODUCT),$(_cpm_word1)),\
206 $(eval current_product_makefile += $(_cpm_word2)),),\
207 $(eval all_product_makefiles += $(f))\
208 $(if $(filter $(TARGET_PRODUCT),$(basename $(notdir $(f)))),\
209 $(eval current_product_makefile += $(f)),)))
210 _cpm_words :=
211 _cpm_word1 :=
212 _cpm_word2 :=
213 current_product_makefile := $(strip $(current_product_makefile))
214 all_product_makefiles := $(strip $(all_product_makefiles))

取xxx.mk所在的路径notdir后的basename。

3 通过import-product当前的makefile文件,有可能是all,通常是current。这个import过程,基本是解析这个mk文件,并依据_product_var_list来生成一个全新的list变量。

 66
67 _product_var_list := \
68 PRODUCT_NAME \
69 PRODUCT_MODEL \
70 PRODUCT_LOCALES \
71 PRODUCT_AAPT_CONFIG \
72 PRODUCT_AAPT_PREF_CONFIG \
73 PRODUCT_PACKAGES \
74 PRODUCT_PACKAGES_DEBUG \
75 PRODUCT_PACKAGES_ENG \
76 PRODUCT_PACKAGES_TESTS \

这些变量须要在我们Product文件夹下进行定义并赋值,当中相关赋值决定了这个Product是否能通过lunch的Product check。

4. 当对相关的mk文件进行var list的生成后组成全新的变量名:

PRODUCT.device/"vendor"/*/"device_name"/xxx.mk.PRODUCT_NAME = 我们自定义的产品名字.

当中*号可代表存在多级文件夹下的xxx.mk.即/*/会自己主动跨越多级文件夹找到须要的目标文件。

5. resolve-short-product-name

resolve-short-product-name函数定义在build/core/product.mk文件里。

该函数的本质是依据TARGET_PRODUCT来与我们之前已经依据xxx.mk生成这个var list中的带PRODUCT_NAME字段的变量值做match匹配。终于假设匹配的话。就把这个变量中属于这个xxx.mk文件的路径作为返回值返回。

这个过程假设出现no matches ,则说明尽管我们创建的文件结构尽管正常,但当Product相关的xxx.mk文件里指定的PRODUCT_NAME与我们lunch申明的值时是不相互匹配的。则说明这个lunch选择的product的不合理的,须要又一次选择。或者说这个product name须要改动。。

lunch选择的TARGET_PRODUCT作用首先是定位xxx,mk文件结构是正常的。如lunch fish。则一般须要定义fish,mk文件。

但终于TARGET_PRODUCT进一步的作用在于须要和详细fish,mk中的PRODUCT_NAME的值相互match,才会通过match过程。

6. 上述过程终于目的是通过PRODUCT来确定TARGET_DEVICE,从而找到这个device

device最直接的体现是这个xxx,mk中定义的PRODUCT_DEVICE值是须要作为一个文件夹名的,由于兴许在envsetup.mk中查找device相关的boardconfig.mk时,须要在device和vendor的文件夹下查找-maxdepath 4 -path */$(TARGET_DEVICE)/BoradConfig,mk(TARGET_DEVICE,值是由xxx,mk中定义的PRODUCT_DEVICE来决定)。

总结:

上述描写叙述大致能够说明在定义一个vendor下须要公布的Product时,我们应该先定义一个device_name作为当前Product的一个大文件夹,在这个文件夹下定义一个xxx,mk文件,这个xxx.mk中须要指定PRODUCT_DEVICE和文件夹名一致,然后定义PRODUCT_NAME。再去lunch 中定义同样的一个name,能够有user/eng等类型可选。在处理好这些后须要将xxx命名为这个PRODUCT_NAME即TARGET_PRODUCT相应的数值。

之所以须要这样做的目的是为了顺利在all Product makefile文件里提取和TARGET_Product相一致的mk文件作为当前文件。

/device/gzz/fish/下基本文件:

1.先定义一个xxx.mk。xxx须要由PRODUCT_NAME决定。即两者一致:

PRODUCT_NAME := my_fish
PRODUCT_DEVICE := fish

device name两者一致

2.切换文件名称为my_fish.mk,确保Product name一致

3. AndroidProduct.mk:

PRODUCT_MAKEFILES := $(LOCAL_DIR)/my_fish.mk

4. vendorsetup,sh

add_lunch_combo my_fish-eng,确保Product name一致

5. 其它相关如boardconfig.mk等.

须要说明的是定义的Product和device name两者是能够不一致的,后者作为在out/target/product/fish/编译的输出。

lunch在处理时从下到上開始处理,TARGET_PRODCUTmy_fish假设无法从全部的Product makefile匹配my_fish.mk文件的话,lunch失败。

假设my_fish.mk文件被解析并生成var list后。再与my_fish匹配,假设PRODUCT_NAME与my_fish不一致,则match失败。

match成功并找到device name后确定TAEGET_DEVICE来自于PRODUCT_DEVICE如这里的fish。假设所在的文件夹名不是fish。则报no device config失败。

故各方面都须要保持一致。才干够通过一次lunch的查找,Android非常好的确保了系统进行编译时,整个编译环境是ok的,且是你所须要的Product。

Android集成一个新产品时,lunch的product name和device name注意事项的更多相关文章

  1. ANDROID Porting系列二、配置一个新产品

    ANDROID Porting系列二.配置一个新产品 详细说明 下面的步骤描述了如何配置新的移动设备和产品的makefile运行android. 1.         目录//vendor/创建一个公 ...

  2. magento -- 添加新产品时状态默认为激活,库存状态默认为有库存

    添加新产品时状态默认为激活 打开文件/app/code/core/Mage/Catalog/Model/Product/Status.php,注释掉“Please Select” /** * Retr ...

  3. NEXT | 不错过任何一个新产品

    NEXT | 不错过任何一个新产品 NEXT 不错过任何一个新产品

  4. android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖?

    android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖? 分析原因: 主要是由于.我之前的 SDK 的版本号 更新的有点高了.低版本号是不会有这样的问题g的,新版本号中g ...

  5. JS事件 加载事件(onload)注意:1. 加载页面时,触发onload事件,事件写在<body>标签内。 2. 此节的加载页面,可理解为打开一个新页面时。

    加载事件(onload) 事件会在页面加载完成后,立即发生,同时执行被调用的程序. 注意:1. 加载页面时,触发onload事件,事件写在<body>标签内. 2. 此节的加载页面,可理解 ...

  6. Android 创建一个新的Activity

    本文转载自:http://www.cnblogs.com/wuyudong/p/5658020.html 新建一个项目,创建一个java类,继承自Activity 新建一个Android.xml文件: ...

  7. MFC 关于new出一个新对话框时,退出对话框内存泄漏的问题解决

    问题: 在进行点击按钮弹出对话框时,我是用了new来生成一个新的对话框,但是在新对话框关闭的时候,经过检查发现,新对话框存在内存泄漏问题. 原因: 因为使用了new,但是当时没有找到地方进行delet ...

  8. Android进入一个新页面,EditText失去焦点并禁止弹出键盘

    android在进入一个新页面后,edittext会自动获取焦点并弹出软键盘,这样并不符合用户操作习惯. 在其父控件下,添加如下的属性,就可以完美解决,使其进入页面后不主动获取焦点,并且不弹出软键盘: ...

  9. 做一个新产品需求,体验的分析文档?(例:喜马拉雅FM)

    2.1 战略层 2.11 产品定位: 一款产品覆盖面广,收听节目种类齐全,资源丰富的电台APP. 以PGC为主流,通过合作方式吸纳专业的电台人,节目人,行业名人分享内容. 融合UGC,满足人们在空闲时 ...

随机推荐

  1. Qt on Android:资源文件系统qrc与assets

    使用 Qt 为 Android 开发应用时,有时我们的应用会携带一些资源文件,如 png . jpg 等,也可能有一些配置文件,如 xml 等.这些文件放在哪里呢? 有两种方式: qrc assets ...

  2. HDU - 4054 Hexadecimal View (2011 Asia Dalian Regional Contest)

    题意:按要求输出.第一列是表示第几行.每行仅仅能有16个字节的字母,第二列是16进制的ASCII码.第三列大写和小写转换 思路:纯模拟,注意字母的十六进制是2位 #include <iostre ...

  3. java 基本数据类型及自己主动类型提升

    基本数据类型:8种 1.整型: byte    1个字节    8位    -128到127 short   2个字节    16位  -2^15到(2^15)-1 int    4个字节    32 ...

  4. iOS-UIImageView载入网络下载的图片(异步+多线程)

    最原始的载入网络下载的图片方式: //最原始载入网络图片方法,相当堵塞主线程,界面卡顿 -(void)setImageWithURL:(NSString *)imageDownloadUrl{ UII ...

  5. TLS握手

    http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1 ...

  6. Sublime text3 Emmet使用

    Emmet需要配置pyv8 进入 https://github.com/emmetio/pyv8-binaries 下载解压文件放入Sublime Installed Packages下面 就可以使用 ...

  7. [MySQL] 按年度、季度、月度、周、日统计查询

    该死的mysql没有提供unix时间戳的专门处理函数,所以,如果遇到时间分组,而你用的又是整型unix时间戳,则只有转化为mysql的其他日期类型!   FROM_UNIXTIM()将unix时间戳转 ...

  8. Ubuntu14.04下Mongodb的Java API编程实例(手动项目或者maven项目)

    不多说,直接上干货! 若大家,不会安装的话,则请移步,随便挑选一种. Ubuntu14.04下Mongodb(在线安装方式|apt-get)安装部署步骤(图文详解)(博主推荐) Ubuntu14.04 ...

  9. 洛谷P3707 [SDOI2017]相关分析(线段树)

    题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...

  10. c#可自定义码表的base64加密解密算法类

    000 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...