3 编译过程讲解
1 系统的编译过程
Android 的编译使用的 Makefile,推荐大家使用《GNU make 中文手册》,这本书有电子版,非常方便,主要是要理解清楚 Makefile 的规则,编译策略,可以通过写简单的编译机制,熟悉下即可。
我们真正学习的时候,只需要记住怎么追踪问题,这个才是我们要掌握的。我们这里先简单来说下编译过程。
还是遵循速战速决,不会把这块细枝末节都去说,但是我这里分享个技巧,就是我们在找问题的时候,可以使用策略,就是 Makefile 中打印 Log 。其实 gcc 里面还有就是-v 参数,可以显示输出的命令。
而安卓编译的过程,都可以在 out 目录下找到。Makefile 主要就是目标,依赖,然后就是编译命令,因为牵扯很多内置方法,所以掌握的时候会麻烦一些,这里建议学习下,把推荐的书籍看完,这个就可以搞定。
build/envsetup.sh 这个会扫描系统的配置文件,同时呢会设置一些内置方法,像随后的 lunch mmm 这些都是在这里面定义的。
Lunch 用来选择具体要编译哪个项目?选定后会设置全局变量,TARGET_PRODUCT,TARGET_BUILD_TYPE,这个怎么找,就是前后的 export 导出来一比对就知道差异是哪些了。
这个里面会进行讲项目相关的 mk 加载进来,依赖加入进来,然后我们经常可以看到的就是vendor 下面也会有一些包,比如 GMS 包。
项目一般可以选择 user 版本,eng 版本,还有个 user-debug,一般我们研发是用的 eng 版本,出版本的时候是 user,这两者一般会出现就是权限相关的问题,要特别注意。
这里简单引用下网络朋友画的图:
这里一般情况下,我是不跟踪记录这块的,因为意义不大,我们经常切换项目,而且依据我之前写的,会调试 Makefile,抓取 Log 非常关键,主要一般情况,相关编译路径为:
device\common 配置项目目录,这里 common 可以是其他。
build\make\core 编译时候一些系统属性处理地方,可以参考这里。
vendor 目录下也经常有 mk,主要是三方客制化的,这个一般都是在 device 里面 include 进去的。
在我们配置 BUILD_SHARED_LIBRARY 时候,我之前写过直接找到这个的具体实现 mk 文件,进行分析,这样子基本上你遇见系统的编译,都知道是什么了。
BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
这才是我们要掌握的技巧,遇见问题知道如何定位,找到代码位置。如果有任何疑问,欢迎找我咨询。
这个编译机制了解原理后,在工作中就是快速定位,找到问题点解决,这个在之前给公司优化过编译机制,梳理出来客制化资源的原理,以及移植一套编译机制。
所以不存在说不知道细节,就不会,因为我们要掌握的是方法,而不是记住在哪里。遇到新问题怎么解决的能力?之前遇见 u 盘无法加载,最后发现我们客制化的 u 盘 label 太长,挂载失败,这个实在 uevent 里面定位到 mount 命令,然后使用 mount 单独测试,发现就是失败,找到的代码查出来原因。
太多新问题会面对,所以记住是错误的处理方式,而应该是记住一套策略,遇见这类问题能够知道怎么解决,而我也着重梳理这块的知识。