重庆生活网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 生活 重庆
查看: 1087|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-25 20:00:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近在学习安卓,我所使用的是芯灵思的开发板,核心板是全志的A31S,感觉这一期呢主要讲的是Android编译过程及脚本的分析,主要包括三个方面(执行完之后我们会发现他include的了一些文件,这些文件在device这个就是我们的lunch函数,进来之后他首先会做出一个判断,如果lunc这里有个lunch_menu,他所做的就是把所有的分支全部列举出来,lu我们再次执行.build/envsetup.sh这个命令,然后我们打开我现在我们就知道了这些分支是在什么时候加载进来的,就是在我们在执行那个命令我们把最后两行给屏蔽掉,我们再来执行一下.build、envsetup.不管是硬件需求还是软件需求,都是在主线版本上进行修改的,当我们需要添加或下面我们来看一下fiber-a31st目录下的fiber_a31st.m当我们的代码编译完成之后,我们对某一个模块进行了修改,我们可以使用mm或我们再来使用mmm命令来进行编译,这时我们就对这个模块进行了单独的编译,当我们执行build/envsetup.sh时,我们首先要加载命令和分支




最近在学习安卓,我所使用的是芯灵思的开發板,核心板是全志的A31S,感觉性能挺好,而且老板還给了很多的资料,而且还帶學习的視频,下面是我在学习完第三期之后的一个经验,希望能跟大家分享一下,也希望各位大神能多多的帮助小弟,小弟在此謝过了。有兴趣的朋友可以去芯灵思官網看一下。
这一期呢主要讲的是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时,我们选择了分支,并且配置了编译的環境变量,而且设置了我们编译目标码的输出目录。


上面呢就是我在第三期视频上学到的一些东西,希望对想学安卓的朋友有一定的帮助。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|联系我们|重庆生活网

GMT+8, 2024-5-7 08:50 , Processed in 0.171875 second(s), 17 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表