前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android系统编译流程详解(三)

Android系统编译流程详解(三)

作者头像
李小白是一只喵
发布2020-04-24 09:25:13
1.1K0
发布2020-04-24 09:25:13
举报
文章被收录于专栏:算法微时光算法微时光

make

首先来看下mma的代码实现(build/envsetup.sh中):

代码语言:javascript
复制
function mma()
{
  local T=$(gettop)
  local DRV=$(getdriver $T)
  if [ -f build/core/envsetup.mk -a -f Makefile ]; then
    $DRV make $@
  else
    if [ ! "$T" ]; then
      echo "Couldn't locate the top of the tree.  Try setting TOP."
      return 1
    fi
    local M=$(findmakefile)
    # Remove the path to top as the makefilepath needs to be relative
    local M=`echo $M|sed 's:'$T'/::'`
    local MODULES_IN_PATHS=MODULES-IN-$(dirname ${M})
    # Convert "/" to "-".
    MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
    $DRV make -C $T -f build/core/main.mk $@ $MODULES_IN_PATHS
  fi
}

代码的最后会调用build/core/main.mk文件.

build/core/main.mk

main.mk文件里定义了整个Android的编译关系.

它主要引入了下列几个重要的mk文件:

其中定义了一个默认的droid,当我们在TOP目录下,敲Make实际上就等同于我们执行make droid。

还有一些编译时需要用到的变量:TOP,TOPDIR.

当Make include所有的文件,完成对所有make文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。

其中,config.mk,envsetup.mk,product_config.mk文件是编译用户指定平台系统的关键文件。

config.mk

main.mk中:

代码语言:javascript
复制
37 BUILD_SYSTEM := $(TOPDIR)build/core
49 include $(BUILD_SYSTEM)/config.mk

文件中定义各种编译使用的变量:

其中: CLEAR_VARS就是用来清除之前定义的环境变量 BUILD_HOST_SHARED_LIBRARY就是用来编译动态库的环境变量

其后有包含了一个重要文件envsetup.mk

代码语言:javascript
复制
181 # ---------------------------------------------------------------
182 # Define most of the global variables.  These are the ones that
183 # are specific to the user's build configuration.
184 include $(BUILD_SYSTEM)/envsetup.mk
envsetup.mk

包含main.mk文件的是envsetup.sh脚本文件,这个叫做envsetup.mk.O(∩_∩)O差点傻傻分不清楚..

其中:

代码语言:javascript
复制
187 # Read the product specs so we can get TARGET_DEVICE and other
188 # variables that we need in order to locate the output files.
189 include $(BUILD_SYSTEM)/product_config.mk

会调用product_config.mk文件.

该文件中:

代码语言:javascript
复制
173 # ---------------------------------------------------------------
174 # Include the product definitions.
175 # We need to do this to translate TARGET_PRODUCT into its
176 # underlying TARGET_DEVICE before we start defining any rules.
177 #
178 include $(BUILD_SYSTEM)/node_fns.mk
179 include $(BUILD_SYSTEM)/product.mk
180 include $(BUILD_SYSTEM)/device.mk

包含了文件product.mk. product.mk文件主要作用是:

  1. 读取指定的目录下所有的AndrodProducts.mk文件中定义的产品信息,其实get-all-product-makefiles返回所有的产品文件xxx.mk
  2. import-products函数去验证这些产品配置文件是否都包含有必须的配置信息,细节后面分析。

定制自己的产品

如果个人想个性定制自己的产品,应该有以下流程: 1. 创建公司目录

代码语言:javascript
复制
mkdir vendor/helloworld

2. 创建一个vendorsetup.sh文件,将当前产品编译项添加到lunch里,让lunch能找到用户个性定制编译项

代码语言:javascript
复制
echo "add_lunch_combo helloworld-eng" > vendor/helloworld/vendorsetup.sh

3. 仿着Android示例代码,在公司目录下创建products目录

代码语言:javascript
复制
mkdir -p vendor/helloworld/products

4. 仿着Android示例代码,在products目录下创建两个mk文件

代码语言:javascript
复制
touch vendor/helloworld/products/AndroidProduct.mk vendor/helloworld/products/helloworld.mk

在AndroidProduct.mk里添加如下内容:

代码语言:javascript
复制
PRODUCT_MAKEFILES := $(LOCAL_DIR)/helloworld.mk

表示只有一个产品helloworld,它对应的配置文件在当前目录下的helloworld.mk。

5. 在产品配置文件里添加最基本信息

参考

Android编译过程详解(二)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • make
  • config.mk
  • 定制自己的产品
  • 参考
  • Android编译过程详解(二)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档