一、Android系统启动

Android框架架构图:(来自网上,我觉得这张图看起来很清晰)

  

Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用。启动的过程如下图所示:(图片来自网上,后面有地址)

   




Android系统整个过程如下:

(一) Init进程的启动

  init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。

 启动过程就是代码init.c中main函数执行过程:system\core\init\init.c

在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听……

(二) ServiceManager启动

在.rc脚本文件中zygote的描述:

service servicemanager /system/bin/servicemanager   class core   user system   group system   critical   onrestart restart zygote   onrestart restart media   onrestart restart surfaceflinger   onrestart restart drm

ServiceManager用来管理系统中所有的binder service,不管是本地的c++实现的还是java语言实现的都需要

这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的Service使用前都必须先在servicemanager中进行注册。

  do_find_service( )

  do_add_service( )

  svcmgr_handler( )

  代码位置:frameworks\base\cmds\servicemanager\Service_manager.c

(三) Zygote进程的启动

  Zygote这个进程是非常重要的一个进程,Zygote进程的建立是真正的Android运行空间,初始化建立的Service都是Navtive service.

(1) 在.rc脚本文件中zygote的描述

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server   class main   socket zygote stream 666   onrestart write /sys/android_power/request_state wake   onrestart write /sys/power/state on   onrestart restart media   onrestart restart netd 参数:--zygote --start-system-server

代码位置:frameworks/base/cmds/app_process/app_main.cpp

上面的参数在这里就会用上,决定是否要启动和启动那些进程。

int main( ){ AppRuntime runtime; if (zygote) { runtime.start("com.android.internal.os.ZygoteInit", startSystemServer ? "start-system-server" : ""); } } class AppRuntime : public AndroidRuntime{};

(2) 接着到了AndroidRuntime类中:

frameworks\base\core\jni\AndroidRuntime.cpp

void start(const char* className, const char* options){ // start the virtual machine Java在虚拟机中运行的 JNIEnv* env; if (startVm(&mJavaVM, &env) != 0) { return; } //向刚刚新建的虚拟机注册JNI本地接口 if (startReg(env) < 0) { return; }     // jni 调用 java 方法,获取对应类的静态main方法     jmethodID startMeth = env->GetStaticMethodID(startClass,   "main","([Ljava/lang/String;)V"); // jni调用 java方法,调用到ZygoteInit类的main函数  jclass startClass = env->FindClass(className); env->CallStaticVoidMethod(startClass, startMeth, strArray); }

  到了ZygoteInit.java中的静态main函数中,从C++ ——》JAVA

(3)ZygoteInit

真正Zygote进程:

frameworks\base\core\java\com\android\internal\os\ZygoteInit.java

public static void main(String argv[]) { //Registers a server socket for zygote command connections registerZygoteSocket(); //Loads and initializes commonly used classes and //used resources that can be shared across processes preload(); // Do an initial gc to clean up after startup gc(); if (argv[1].equals("start-system-server")) { startSystemServer(); }
/** * Runs the zygote process's select loop. Accepts new connections as * they happen, and reads commands from connections one spawn-request's * worth at a time. */ runSelectLoopMode(); //loop中 /** * Close and clean up zygote sockets. Called on shutdown and on the * child's exit path. */ closeServerSocket(); }

Zygote就建立好了,利用Socket通讯,接收请求,Fork应用程序进程,进入Zygote进程服务框架中。

(四) SystemServer启动

(五) Home界面启动

二、Activity启动

最近学习Android相关知识,感觉仅仅了解Activity几个生命周期函数基本上没有任何意义的;

于是想深入了解一下Activity到底是怎么一回事怎么运行来的;里面的东东真是叫个庞大;

现在只能简单的了解其框架性的概念和流程;

一Activity概念

  Android的核心不是Application而是Activity,至少在我们开发的时候是这样的;

  Activity就是被用来进行与用户交互和用来与android内部特性交互的组件,

在应用程序中用到的所有activity都需要在manifest.xml文件中进行注册;

那么Activity又是怎样一种组件,怎么样进行显示交互的,一个activity实例是如何被管理和运行起来的,activity生命周期又是怎么一回事。

二Activity框架和管理结构

Activity管理的核心是AcitivityManagerService,是一个独立的进程;

ActiveThread是每一个应用程序所在进程的主线程,循环的消息处理;

ActiveThread与AcitivityManagerService的通信是属于进程间通信,使用binder机制;

    

三Activity启动过程

以启动一个应用程序startActivity为例看一下代码执行的大概流程:

    

可将其分为6个过程:

1使用代理模式启动到ActivityManagerService中执行;

2创建ActivityRecord到mHistory记录中;

3通过socket通信到Zgote相关类创建process;

4通过ApplicatonThread与ActivityManagerService建立通信;

5 ActivityManagerService通知ActiveThread启行;动Activity的创建;

6 ActivityThread创建Activity加入到mActivities中并开始调度Activity执

请看下图:

  

          

并不是所有启动一个Activity都是这样的过程:一个应用程序中所有Activity只有一个ActivityThread属于一个Process;

ActivityStack并不是每次都需要创建一个Stack来管理Activities;

下面看看adnroid系统中四个重要概念:

Application:由多个相关的松散的与用户进行交互Activity组成,通常被打包成apk后缀文件中;

Activities:应用程序的主要组成部分,是应用程序的核心;

ActivityStack:将应用程序中打开的Activity保存在历史栈中,按照栈的先进后出的原则;Start Activity时入栈,返回时出栈;

Task:将一系列相关的Activity组合,完成某个应用程序完整操作;不管activity属于哪个Application的;

例如:写信息—调用—文件管理,都属于一个Task,但属于两个Application;





更多相关文章

  1. Android(IPC)进程间通讯1:详解Binder由来?
  2. Android应用程序注冊广播接收器(registerReceiver)的过程分析
  3. Android编程之manifest上遇到的错误
  4. Android系统的架构
  5. Android设置启动界面
  6. Android(安卓)使用【AIDL】调用外部服务
  7. android应用开发入门
  8. android 安卓系统
  9. Android多线程系统概述(sundy深入浅出)之进程和线程

随机推荐

  1. Jquery-如何使用prop方法更改backgroundC
  2. JQuery选择器和操作得到的元素
  3. less 转css 实现有问题的笔记
  4. 如何在Angular js制作水平手风琴?
  5. 是否有更快的方法来遍历HTMLDocument中的
  6. Java applet错误…怎么了?
  7. HTML中的select下拉框内容显示不全的解决
  8. 在Paragraph标记中添加“名称”以使用POS
  9. 千呼万唤 HTML 5 (2) - 区块元素
  10. 从下拉列表中获取复选框的值