上一篇我们讲到了lunch菜单的一般格式:ProductName_DeviceName-BuildVarient
,讲过了Product和Device,那么这次我们来说一下BuildVarient。
以aosp_flo-userdebug来说,当我们BuildVarient选择userdebug的时候,编译出来的Rom就有roo权限,但是为什么这样就会有root权限呢?
这里面有两方面的原因:
- 在编译框架内,会根据这个值来决定哪些模块会被编译,哪些模块会被安装。这个变量叫做Target_Build_Vairent,Makefile文件会根据这个变量来决定哪些模块会被编译,哪些模块会被安装
- 在编译完之后,有一个ro.build.type属性会记录这个值,在执行过程中,很多代码会根据这个属性的值来决定执行的流程。
这里有一点要注意:在Android中,编译和安装是分开进行的,有一些模块会被编译,但是不会被安装到设备上,会被安装的模块,会先被编译,编译的结果在编译目录中,然后会把该模块从编译目录拷贝到安装目录中。也就是说会被安装的模块多了一个拷贝的过程。
具体到某一个模块,该模块是否会被安装是由LOCAL_MODULE_TAGS这个变量和BuildVarient共同决定的。
他们的关系如下
|LOCAL_MODULE_TAGS|BuildVarient|
|:-----|:-----|
|optional|待决定|
|user|user|
|eng|eng|
|debug|userdebug|
比如我们的BuildVarient是Userdebug,这意味着所有的模块的Android.mk中,LOCAL_MODULE_TAGS为debug的模块将会被编译并且被安装。而LOCAL_MODULE_TAGS为user和eng的模块将不会被安装。LOCAL_MODULE_TAGS为optional的模块是否会被安装取决于这个模块是否被添加到PRODUCT_PACKAGES这个变量中。
lunch的内容大致已经讲解完了,接下来就是执行make命令了。
我们看到在源码根目录的Makefile文件中只有一句话:
include build/core/main.mk
这个main.mk就是我们编译过程的入口了。
在接下来讲解一下Android编译框架Make的流程。
网友评论