定制产品的编译和烧录
- 在device或vendor文件夹下创建公司命名的文件夹,并在该文件夹下新建各个产品文件夹,每个产品的文件就优先放在产品文件夹下(厂商–>产品)
- 在产品文件夹下新建一个vendorsetup.sh脚本,将产品添加到lunch选单中。
- 添加AndroidProducts.mk文件,该文件只是做一个转向的功能,每个产品的具体编译会有相应的mk文件
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/aosp_toro.mk \
$(LOCAL_DIR)/full_toro.mk
- 编写某产品专用的makefile文件
- 添加BoardConfig.mk文件,该文件用于填写目标架构、硬件设备属性、编译器的条件标志、分区布局、boot地址等一系列参数,可以将其他厂商的该文件复制过来进行简单的修改
- 添加Android.mk文件,该文件是Android系统下编译某个模块的标准makefile。因为一个产品可能由多个模块共同完成。
- 接下来就是原生系统的编译流程。。。
原生Android系统编译
- 执行envsetup.sh脚本。该脚本中定义了编译过程中各种函数实现,如lunch、m、mm等
- 选择编译的目标,不知道有哪些编译目标可以使用lunch命令来显示目标列表
- 开始编译,输入make -j4命令
Android内核设计思想
应用层(最终的app)
框架层(开发app过程中调用的接口)
应用框架层是系统的核心部分,一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库以及硬件抽象层等进行衔接。 应用框架层的主要实现代码在/frameworks/base和/frameworks/av目录下
c++库层+art(Java框架层中通过jni调用到该层)
c/c++k库
C/C++程序库能被Android系统中的不同组件所使用,并通过应用程序框架为开发者提供服务
art虚拟机
运行时库又分为核心库和ART(5.0系统之后,Dalvik虚拟机被ART取代)。核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用。相较于JVM,Dalvik虚拟机是专门为移动设备定制的,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。而替代Dalvik虚拟机的ART 的机制与Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用
hal层(hal层之上称为android系统)
硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化,为了保护硬件厂商的知识产权,它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。通俗来讲,就是将控制硬件的动作放在硬件抽象层中。
内核层(基于Linux驱动的可扩展性)
references: