欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Aandroid源码编译详解(一)

程序员文章站 2022-07-12 11:48:10
...

        夏至了,又看到满世界的人讨论狗肉节,各位狗肉爱好者以及爱狗人士都别激动啊!好了废话不多说,进入我们的编译过程,在之前已经分享过了源码的下载以及编译环境的配置了,那么接下来就进行源码编译的过程,这里会按照一个正规的流程往下走,并说说某些阶段所做的事情以及一些常见的错误,又问题欢迎各位指点!

一、目录结构

在编译之前,我们先了解了解android源码的目录结构,先看下面的图:

Aandroid源码编译详解(一)

目录解析
abi 应用程序二进制接口,生成libgabi++.so相关库文件
vendor 各个厂商定制的相关文件,如驱动等
boinic Android的C library,即C库文件
bootable Android系统启动引导相关代码
build 存放系统编译规则及generic等基础开发包配置
cts Android兼容性测试套件标准
tool 一些工具的
developers 开发者目录(包含一些事例)
development 应用程序开发相关的工具等
device 设备相关的抽象
docs 指导文档
external android使用到的一些开源的东西
frameworks android核心框架,包含了java代码以及c代码
hardware 硬件相关的HAL代码
libcore 核心库
libnativehelper
JNI调用相关的库
ndk ndk开发相关
out 编译后资源输出文件夹
packges 应用程序包

sdk

sdk以及模拟器存放目录

        其实这些东西大家随意看看就好,因为大部分目录都不需要我们去动,而android开发人员动得比较多的可能也就frameworks跟packges。其他的可以等到有具体需求的时候再去研究。

二、编译过程简介

1、下面的链接是官方的编译过程介绍

网址:http://source.android.com/source/building.html

2、首先这里要说明的是,官方所给出的编译过程仅仅是告诉你如何去编译一个通用型的系统而已,如果你需要根据自己的产品进行定制的话,还是需要对整个编译的过程有比较深入的了解的。

3、google给出的几个编译步骤其实很明确,我们接下来就根据这几个步骤进行,并展开说明

  • source build/envsetup.sh:初始化编译环境,加载相关命令
  •  lunch:选择平台编译选项
  •  make -j8:执行编译(其中-j参数表示指定编译线程数,建议cpu核心数乘2即可)

三、envsetup.sh都做了些什么?

在分析envsetup.sh之前,我们先看看两个小问题:

1、执行该脚本时有些退linux不是很熟悉的朋友经常会碰到envsetup.sh文件无可执行权限问题,使用下面命令加上即可:

      $chmod a+x envsetup.sh

2、还有一个问题是经常出现的build/envsetup.sh: 1: Syntax error: "(" unexpected,别慌,由于我们使用的是Ubuntu,而Ubuntu默认使用的shell环境是dash,而envsetup.sh默认是指定bash的,所以我们只需要将dash切换到bash即可:

     执行$sudo dpkg-reconfigure dash命令,并选择“否”,最好重新打开终端

3、我们先看看,执行了source build/envsetup.sh后有什么效果:

Aandroid源码编译详解(一)

我们很直观的看到,直接includ了很多shell脚本,光看这里看不出什么,我们不妨看看源码!

# Execute the contents of any vendorsetup.sh files we can find.
for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
         `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
do
    echo "including $f"
    . $f
done
unset f

上面的脚本代码依次查找{device, vendor, product}目录下的vendorsetup.sh文件,并分别导入到当前环境中来!至于这些sh到底有什么用,在编译第二阶段的时候再将!

4、我们继续翻envsetup.sh的源码你会发现,一直在定义函数而这些函数有很多我们会是我们后面直接用到的,比如说lunch、mm、mmm等等。

总结:所以综合来说,android源码编译的第一个阶段主要做了两件事,第一就是加载相关的vendorsetup.sh文件,第二就是定义后续编译相关的函数。

今天就到这里了,后续请看android源码编译第二个阶段的文章!android源码编译(二)