美文网首页Android编译
Android编译系统-中

Android编译系统-中

作者: 董成鹏 | 来源:发表于2017-10-09 23:25 被阅读0次

上一篇我们讲到了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的流程。

相关文章

网友评论

    本文标题:Android编译系统-中

    本文链接:https://www.haomeiwen.com/subject/usemyxtx.html