这阶段主要研究的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. Google Android操作系统内核编译图文教程
  2. Android核心模块内容概述
  3. Android多模块构建合并aar解决方案
  4. Android(安卓)4 游戏高级编程(第2版)
  5. Ubuntu 10.10从零开始建立android 2.2 froyo开发环境
  6. Android核心模块及相关技术
  7. android反编译工具(ApkDec-Release-0.1)-正式版
  8. Android(安卓)APK反编译查看源码及资源文件
  9. Android(安卓)Sensor详解(5)搭建adsp firmware的环境

随机推荐

  1. JQuery系列(7) - JQuery最佳实践
  2. 在HTML上绘制画布并在屏幕大小上保留Aspe
  3. 有没有办法阻止使用类似Firebug的工具在
  4. Javascript Ajax Call总是返回readyState
  5. 屏蔽标签的href跳转功能
  6. 将大型阵列传输到客户端
  7. JavaScript 字符串函数 之查找字符方法(
  8. jQuery通过igorescobar jQuery掩码插件验
  9. 客户端处理和服务器端处理,哪个比较快?
  10. 剑道级联 - 过早发射?