这阶段主要研究的android的开机启动流程,以及启动流程的优化,编译的过程。
开机启动的流程主要为:
1.系统引导bootloader
2.内核kernel
3.文件系统及应用init
4.重要的后台程序zygote
a)建立Java Runtime,建立虚拟机
b)建立Socket接收ActivityManangerService的请求,用于Fork应用程序
c)启动System Server
5.系统服务system server
6.桌面launcher
7.解锁
8. 开机自启动的第三方应用程序
********************************************************************************************************************************************************
在研究开机启动流程之后,做的是开机启动的优化。
在经过讨论之后,决定使用blcr的方式加速android的开机速度。
BLCR 的全称为BerkeleyLab Checkpoint/Restart,它是应用于linux下的check point/restore软件。
它的作用是可以将正在运行于linux上的应用当前的运行点保存成为一个文件并且在以后的时间可以按照需要将该程序直接恢复到保存时候的状态。
尽管有部分限制,只要在使用时候注意这些限制,利用其保存和恢复程序运行点和内存的能力完全可以避免程序每次不必要的初始化动作。Zygote在加载公共类前时候除了堆外其他资源使用很少,通过仔细的调整/恢复BLCR无法恢复的一些状态,是可以用check point形式来跳过类加载以缩短启动时间。
BLCR 包括内核驱动和应用库两部分,外部应用通过链接应用库和内核驱动进行交换实现应用的保存和恢复。
********************************************************************************************************************************************************
编译过程中需要注意的一些问题:
1)关于NDK的一些说明:
a.NDK是一系列工具的集合;
b.NDK提供了一份稳定,功能有限的API头文件声明;
c.使“JAVA+C”的开发方式终于转正,成为官方支持的开发方式;
d.NDK是Android平台支持C开发的开端。
********************************************************************************************************************************************************
2)Android.mk
1.不需要在Android.mk中列出头文件和依赖文件,NDK编译系统将会为你自动处理这些问题。
2.相关的语法点
LOCAL_PATH := $(call my-dir) my-dir由编译系统提供,用于返回当前的路径;
include $(CLEAR_VARS) CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(除了LOCAL_PATH)。因为所有的编译控制文件都在同一个GNU MAKE执行环境中,
所有的变量都是全局的。
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := helloworld.c 这个变量必须包含将要编译打包模块中的C或C++源代码文件。
include $(BUILD_SHARED_LIBRARY) 负责收集自从上次调用include $(CLEAR_VARS)以来定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确的去做。
PS:在include $(BUILD_SHARED_LIBRARY) 之前必须定义LOCAL_MODULE和LOCAL_SRC_FILES,生成的库文件为 lib$(LOCAL_MODULE).so文件。
********************************************************************************************************************************************************
3)关于交叉编译的说明
定义:交叉编译就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序。
LINUX上的使用:在linux平台上,ARM的交叉编译器是arm-linux-gcc。
举例:
交叉编译linux内核的步骤:
Step1: 下载并解压内核源码。
Step2: 修改内核目录下的Makefile,修改CROSS_COMPILE ?= arm-linux-
Step3: 执行make menuconfig,并保存,如果有问题,以root权限执行
#make menuconfig
Step4: 编译内核
#make
PS: 在做移植的时候,通常需要修改顶层的MAKEFILE
arch := arm 设置体系结构。 默认为当前环境体系结构。 ?=表示如果环境变量不存在再赋值。
CROSS_COMPILE := arm-linux- 设置交叉编译环境,默认不交叉编译。
EXTRA_VERSION := 设置用户自己的内核标示。
********************************************************************************************************************************************************
4)生成的.ko的文件
linux内核模块是一种可以被内核动态加载和卸载的可执行程序。
通过内核模块可以扩展内核的功能能。
内核模块的主要特征:
1、可以访问系统几乎所有的软硬件资源。
2、内核模块是为其他内核模块以及应用程序服务的,通常提供的是通用的功能。
3、内核模块只能调用内核提供的参数,访问其他的函数会导致运行异常。
从代码的角度看,内核模块是一组可以完成某种功能的函数集合。
从执行的角度看,内核模块可以看作是一个已经编译但是没有连接的程序。
从用户的角度看,内核模块是一个外挂组件,在需要的时候挂在到内核,不需要的
时候可以被删除。
内核模块的命令:
加载的命令: insmod ./*.ko
卸载的命令: rmmod (一次内核模块被其他的内核模块调用时,自身的引用计数器会加1.当卸载模块的时候,要查看引用计数器是否为0)
查看的命令: lsmod
***************************************************************************************
开机启动的流程主要为:
1.系统引导bootloader
2.内核kernel
3.文件系统及应用init
4.重要的后台程序zygote
a)建立Java Runtime,建立虚拟机
b)建立Socket接收ActivityManangerService的请求,用于Fork应用程序
c)启动System Server
5.系统服务system server
6.桌面launcher
7.解锁
8. 开机自启动的第三方应用程序
********************************************************************************************************************************************************
在研究开机启动流程之后,做的是开机启动的优化。
在经过讨论之后,决定使用blcr的方式加速android的开机速度。
BLCR 的全称为BerkeleyLab Checkpoint/Restart,它是应用于linux下的check point/restore软件。
它的作用是可以将正在运行于linux上的应用当前的运行点保存成为一个文件并且在以后的时间可以按照需要将该程序直接恢复到保存时候的状态。
尽管有部分限制,只要在使用时候注意这些限制,利用其保存和恢复程序运行点和内存的能力完全可以避免程序每次不必要的初始化动作。Zygote在加载公共类前时候除了堆外其他资源使用很少,通过仔细的调整/恢复BLCR无法恢复的一些状态,是可以用check point形式来跳过类加载以缩短启动时间。
BLCR 包括内核驱动和应用库两部分,外部应用通过链接应用库和内核驱动进行交换实现应用的保存和恢复。
********************************************************************************************************************************************************
编译过程中需要注意的一些问题:
1)关于NDK的一些说明:
a.NDK是一系列工具的集合;
b.NDK提供了一份稳定,功能有限的API头文件声明;
c.使“JAVA+C”的开发方式终于转正,成为官方支持的开发方式;
d.NDK是Android平台支持C开发的开端。
********************************************************************************************************************************************************
2)Android.mk
1.不需要在Android.mk中列出头文件和依赖文件,NDK编译系统将会为你自动处理这些问题。
2.相关的语法点
LOCAL_PATH := $(call my-dir) my-dir由编译系统提供,用于返回当前的路径;
include $(CLEAR_VARS) CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(除了LOCAL_PATH)。因为所有的编译控制文件都在同一个GNU MAKE执行环境中,
所有的变量都是全局的。
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := helloworld.c 这个变量必须包含将要编译打包模块中的C或C++源代码文件。
include $(BUILD_SHARED_LIBRARY) 负责收集自从上次调用include $(CLEAR_VARS)以来定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确的去做。
PS:在include $(BUILD_SHARED_LIBRARY) 之前必须定义LOCAL_MODULE和LOCAL_SRC_FILES,生成的库文件为 lib$(LOCAL_MODULE).so文件。
********************************************************************************************************************************************************
3)关于交叉编译的说明
定义:交叉编译就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序。
LINUX上的使用:在linux平台上,ARM的交叉编译器是arm-linux-gcc。
举例:
交叉编译linux内核的步骤:
Step1: 下载并解压内核源码。
Step2: 修改内核目录下的Makefile,修改CROSS_COMPILE ?= arm-linux-
Step3: 执行make menuconfig,并保存,如果有问题,以root权限执行
#make menuconfig
Step4: 编译内核
#make
PS: 在做移植的时候,通常需要修改顶层的MAKEFILE
arch := arm 设置体系结构。 默认为当前环境体系结构。 ?=表示如果环境变量不存在再赋值。
CROSS_COMPILE := arm-linux- 设置交叉编译环境,默认不交叉编译。
EXTRA_VERSION := 设置用户自己的内核标示。
********************************************************************************************************************************************************
4)生成的.ko的文件
linux内核模块是一种可以被内核动态加载和卸载的可执行程序。
通过内核模块可以扩展内核的功能能。
内核模块的主要特征:
1、可以访问系统几乎所有的软硬件资源。
2、内核模块是为其他内核模块以及应用程序服务的,通常提供的是通用的功能。
3、内核模块只能调用内核提供的参数,访问其他的函数会导致运行异常。
从代码的角度看,内核模块是一组可以完成某种功能的函数集合。
从执行的角度看,内核模块可以看作是一个已经编译但是没有连接的程序。
从用户的角度看,内核模块是一个外挂组件,在需要的时候挂在到内核,不需要的
时候可以被删除。
内核模块的命令:
加载的命令: insmod ./*.ko
卸载的命令: rmmod (一次内核模块被其他的内核模块调用时,自身的引用计数器会加1.当卸载模块的时候,要查看引用计数器是否为0)
查看的命令: lsmod
***************************************************************************************