2023年6月27日发(作者:)
AndroidNinja实践如果有⾃⼰编译过AOSP的源码,可能⼤家都会遇到这样的⼀个问题:ninja: error: '*******', needed by '*********', missing and no known rule to make it在刚刚开始接触AOSP的时候,我基本上都会直奔主题,⼤概清楚问题后,然后解决问题、重新编译,所以⼀直都没有注意到⼀个关键字:"Ninja",今天我们就⼀起来学习/实践⼀下这个"熟悉的陌⽣⼈",主要介绍⼀下⽬前Android的编译系统,以及以⼀个⼩Demo为例,实践⼀下Ninja的使⽤,如果想了解更多关于Ninja在AOSP中的使⽤,见参考链接。⼀、Android编译系统早期的Android系统采⽤的配置来编译源码,从Android 7.0开始引⼊。⼤体梳理⼀下Android版本相应的发展演变过程:Android 7.0引⼊ninja和katiAndroid 8.0使⽤来替换,引⼊SoongAndroid 9.0强制使⽤oid Build上图就是各个⽂件之间的转化关系,这⾥涉及到Ninja, kati, Soong, bp概念,简单介绍⼀下:1. Ninjaninja是⼀个编译框架,会根据相应的ninja格式的配置⽂件进⾏编译,但是ninja⽂件⼀般不会⼿动修改,⽽是通过将⽂件转换成ninja格⽂件来编译。2. Andr2. 的出现就是为了替换⽂件。bp跟mk⽂件不同,它是纯粹的配置,没有分⽀、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语⾔编写。3. SoongSoong类似于之前的Makefile编译系统的核⼼,负责提供语义解析,并将之转换成Ninja⽂件。Soong还会编译⽣成⼀个androidmk命令,⽤于将⽂件转换为⽂件,不过这个转换功能仅限于没有分⽀、循环等流程控制的才有效。4. BlueprintBlueprint是⽣成、解析的⼯具,是Soong的⼀部分。Soong负责Android编译⽽设计的⼯具,⽽Blueprint只是解析⽂件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项⽬,从Android 7.0,prebuilts/go/⽬录下新增Golang所需的运⾏环境,在编译时使⽤。5. Katikati是专为Android开发的⼀个基于Golang和C++的⼯具,主要功能是把Android中的⽂件转换成Ninja⽂件。代码路径是build/kati/,编译后的产物是ckati。⼆、Ninja的介绍从上⾯我们可以看到,Android最后的编译⼯作都会交给Ninja,那么它到底是个什么东西呢,为什么Google需要在Android引⼊Ninja呢?Ninja is a small build system with a focus on speed. It differs from other build systems in two majorrespects: it is designed to have its input files generated by a higher-level build system, and it is designed torun builds as fast as 是⼀个专注于速度的构建系统,和其他构建系统相⽐,主要有两点不同:Ninja的输⼊⽂件⼀般都是有更⾼级的构建系统产⽣的,⽐如cmake;Ninja设计之初就是为了更快的构建;其实从第⼀点,我们就能看出来Ninja的设计哲学:相⽐Makefile是设计出来给⼈⼿写的,但是Ninja设计出来是给其它程序⽣成的。 如果说Makefile是C语⾔,那么Ninja就是汇编语⾔。 如果说Makefile是⼀个DSL,那么Ninja就是⼀种配置⽂件。 Makefile⽀持分⽀、循环等流程控制,⽽Ninja只⽀持⼀些固定形式的配置。三、Ninja的实践⼯欲善其事,必先利其器,所以我们需要先准备好相关⼯具:CMake,ninja,以Mac OS为例,安装步骤为:brew install cmakebrew install ninja正式开始,以⼀个最简单的Hello,Ninja为例:#include
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687842040a49991.html
评论列表(0条)