• Android系统以及Activity启动讲解


    一、Android系统启动

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

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

    image

     

    Android系统整个过程如下:

    (一) Init进程的启动

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

    启动过程就是代码init.c中main函数执行过程:systemcoreinitinit.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( )

    代码位置:frameworksasecmdsservicemanagerService_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类中:

    frameworksasecorejniAndroidRuntime.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进程:

    frameworksasecorejavacomandroidinternalosygoteInit.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;

    转载请注明:Android开发中文站 » 【Android高级】Android系统以及Activity启动讲解

  • 相关阅读:
    DOM总结
    BOM总结
    备忘录设计模式
    策略模式
    迭代器模式
    观察者模式
    装饰模式
    脚本工具(获取某个文件夹下的所有图片属性批量生成css样式)
    ajax传输中文乱码解决方法
    java Serialization and Deserializaton
  • 原文地址:https://www.cnblogs.com/zhanganju/p/4801495.html
Copyright © 2020-2023  润新知