卓底层开发学习经验 第三期

这一期呢主要讲的是 Android 编译过程及脚本的分析,主要包括三个方面1 .build/envsetup.sh  的分析  ( 2 lunch 做了什么,如何增加或者删除 lunch
[size=10.5000pt](3)Android 编译命令使用
首先呢我们先来看一下Android 的编译过程:
[size=10.5000pt]1.初始化参数设置
[size=10.5000pt]2.检查环境变量与目标环境
[size=10.5000pt]3.选择 lunch 并读取目标配置和平台信息
[size=10.5000pt]4.清空输出目录
[size=10.5000pt]5.编译
[size=10.5000pt]6.生成升级包
.build/envsetup.sh  的分析
当我们执行.build/envsetup.sh  这条命令时我们做了两件事情,第一就是加载编译命令,第二就是加载平台信息
现在我们来看一下执行 .build/envsetup.sh  命令前后有什么区别,首先我们先来看一下这个脚本,他就是把一些命令加载到我们的终端上

现在我们来执行上边的lunch 命令,你会发现这里并没有lunch 命令,相同的来执行 mmm 命令得到的结果是一样的,现在我们来执行一下这个脚本

执行完之后我们会发现他include 的了一些文件,这些文件在 device 目录下, device 目录下的这些脚本文件其实就是当我们选择 lunch 时,他要在这里面找平台信息,我们执行完之后我们会发现里面多了 mm mma mmm 、命令
当我们执行完这个脚本之后就可以执行 lunch 命令了

这时就会出现所有的lunch ,而这些 lunch 信息就是从刚才 include 的那些文件中加载过来的
然后我们来看一下我们在 lunch 时做了些什么,打开我们的 envsetup.sh,找到lunch函数

这个就是我们的 lunch 函数,进来之后他首先会做出一个判断,如果 lunch 后面跟了参数,那么就会直接找到了答案,直接使用哪一个分支,否则的话就会列出所有的的分支,那么这个分支是在什么时候加入的呢?

这里有个lunch_menu ,他所做的就是把所有的分支全部列举出来, lunch 分支保存的变量是 lunch_menu_choose ,那么他是怎么被添加的呢?我们再次寻找,会找到一个 add_lunch_combo 函数,他所做的就是添加 lunch 分支

我们再次执行.build/envsetup.sh 这个命令,然后我们打开我们使用的一个脚本,也就是 ........fiber_a31st....... 这个脚本,当我们执行时,他就会把 fiber_a31st-eng user 加载到环境变量中

现在我们就知道了这些分支是在什么时候加载进来的,就是在我们在执行那个命令时加载进来的,当加载完之后我们就可以把他们打出来了,打出来以后我们就可以从里边进行选择了,当我们选择一个函数时,我们的lunch 函数就会帮我们把所选择的分支记录下来,然后做一系列的初始化工作,,这样我们就完成了环境变量的配置。
现在我们再来执行一下 lunch 函数我们现在选择 fiber_a31st-eng, 这样我们就得到了一些安卓的平台信息

我们可以看一下我们当前的环境变量,用 export 命令来查看,我们可以看到多了很多安卓的一些配置
接下来我们来减少一些脚本,执行.build envsetup.sh 命令,然后我们把我们所使用的脚本进行更改

我们把最后两行给屏蔽掉,我们再来执行一下.build envsetup.sh 命令,然后执行 lunch 命令,我们可以看到,我们所屏蔽掉的 a31st 的分支就不会再出现了


所以说我们可以通过修改刚才的脚本来减少我们的分支,但是当我们想要添加一个真正的分支的时候,我们必须参考现有的分支,比如:

我们为什么要添加分支呢?
不管是硬件需求还是软件需求,都是在主线版本上进行修改的,当我们需要添加或者减少一些应用和功能时,就可以通过添加分支来解决,当我们的硬件增强时,我们也可以通过添加分支来解决,这样我们的源代码就只有一份,我们维护起来也就更加方便了

下面我们来看一下fiber-a31st 目录下的 fiber_a31st.mk 做了哪些事情,他所做的就是当我们的系统编译完之后,我们会把当前这个 fiber-a31st 下面的某些文件覆盖到我们 out 目录下(也就是我们编译目标目录下的文件)这样我们打包时才能生成我们这个分支所需要的升级包

当我们的代码编译完成之后,我们对某一个模块进行了修改,我们可以使用 mm 或者 mmm 命令对他单独进行编译,我们来对 externnal 下面的 libpng 进行编译,我们首先使用 mmm 命令

由于我们没有进行更新,所以他会告诉我们并没有什么可进行编译的,那么我们来对这个目录下的某一个文件进行更新,
+
我们再来使用 mmm 命令来进行编译,这时我们就对这个模块进行了单独的编译,编译之后他会生成一个库文件,这个库文件就会替换到我们得 out/taeget/product/fiber-a31st/ 的目录下。
当我们想要使用 mm 命令就必须进入到 external/linpng 的目录下

我们touch 一个文件,然后直接 mm 就能进行编译了
这些就是 mm mmm 的使用过程。
最后我们来看一下当我们执行完 build/envsetup.sh lunch 之后我们得到了哪些东西

当我们执行build/envsetup.sh 时,我们首先要加载命令和分支,并且得到了 mm mmm 编译命令,当我们执行 lunch 时,我们选择了分支,并且配置了编译的环境变量,而且设置了我们编译目标码的输出目录。

上面呢就是我在第三期视频上学到的一些东西,希望对想学安卓的朋友有一定的帮助。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值