`
1025250620
  • 浏览: 230002 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AMS启动进程过程~(转)

 
阅读更多

Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1047    
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2459    
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2512    
ActivityThread.access$2200(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 119    
ActivityThread$H.handleMessage(Message) line: 1863    
ActivityThread$H(Handler).dispatchMessage(Message) line: 99    
Looper.loop() line: 123    
ActivityThread.main(String[]) line: 4363    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]    
Method.invoke(Object, Object...) line: 521    
ZygoteInit$MethodAndArgsCaller.run() line: 860    
ZygoteInit.main(String[]) line: 618    
NativeStart.main(String[]) line: not available [native method]    


Dalvik_dalvik_system_Zygote_fork()@dalvik/vm/native/dalvik_system_Zygote.c
Dalvik_dalvik_system_Zygote_forkAndSpecialize()@dalvik/vm/native/dalvik_system_Zygote.c
Dalvik_dalvik_system_Zygote_forkSystemServer()@dalvik/vm/native/dalvik_system_Zygote.c
const DalvikNativeMethod dvm_dalvik_system_Zygote[] = {
{ "fork",            "()I",
Dalvik_dalvik_system_Zygote_fork },
{ "forkAndSpecialize",            "(II[II[[I)I",
Dalvik_dalvik_system_Zygote_forkAndSpecialize },
{ "forkSystemServer",            "(II[II[[I)I",
Dalvik_dalvik_system_Zygote_forkSystemServer },
{ NULL, NULL, NULL },
};



Android Application

    Android提供给开发程序员的概念空间中Application只是一个松散的表征概念,没有多少实质上的表征。在Android实际空间中看不到实 际意义上的应用程序的概念,即使有一个叫Application的类,这个也就是个应用程序上下文状态,是一个极度弱化的概念。Application只 是一个空间范畴的概念,Application就是Activity,Service之类的组件上下文描述。Application并不是Android 的核心概念,而Activity才是Android的核心概念。

    从Android的SDK文档中,我们知道一般情况Android应用程序是由以下四种组件构造而成的:Activity,Broadcast Intent Receiver,服务(Service),内容提供器(Content Provider)。我们可以使用下面的图来表示一下Android的概念空间。这些组件依附于应用程序中,应用程序并不会一开始就建立起来,而是在这些 组件建立起来后,需要运行时,才开始建立应用程序对象。


2.1应用进程名称

    为什么要从应用进程名称开始?作为内核研究,我们还是回到问题的最本质处:不管Activity,Service等组件如何设计和运行,它要提供服务,就 必须要依附在Linux的进程上,建立消息循环,组件才能够真正的运作。Activity实例是如何Hosting在Linux进程上的?这个是我们首先 想要弄明白的。

我们在process="string"这个定义。

allowClearUserData=["true" | "false"] 
android:allowTaskReparenting=["true" | "false"] 
android:backupAgent="string" 

android:label="string resource" 
android:manageSpaceActivity="string" 
android:name="string" 
android:permission="string" 
android:persistent=["true" | "false"] 
android:process="string" 
android:restoreAnyVersion=["true" | "false"] 
android:taskAffinity="string" 
android:theme="resource or theme" > 
. . .

在SDK用已经描述的很清楚到了。

android:process

The name of a process where all components of the application should run. Each component can override this default by setting its own process attribute.

By default, Android creates a process for an application when the first of its components needs to run. All components then run in that process. The name of the default process matches the package name set by the element.

By setting this attribute to a process name that's shared with another application, you can arrange for components of both applications to run in the same process — but only if the two applications also share a user ID and be signed with the same certificate.

为什么要提出这么一个定义?android:process名称。

    默认状态下,Activity Manager Service在应用程序的第一个组件需要运行时将会为应用程序建立一个进程,而这个进程的名字就是android:process=”string”所 指定,缺省的是应用程序包的名字。该进程一旦建立,后面的该应用的组件都将运行在该进程中,他们绑定的根据就是这个Android:Process指定的 名称,因为在他们都在同一个应用程序包里,也就具有了同样的进程名字,于是他们都托管在了同一进程中。组件将通过ClassLoader从Package 中获取到应用程序的信息。

    在建立Actvitiy时,如果在应用进程端没有应用对象,系统在该过程中利用makeApplication建立一个Application对象,实例 化"android.app.Application",建立一个应用程序上下文完成例如资源,package等信息管理。

2.2  ActivityThread运行框架

    在分析中,我们可以看到真正对应应用进程的不是Application而是ActivityThread。我们从实际的应用堆栈可以看到:

NaiveStart.main()

        ZygoteInit.main

           ZygoteInit$MethodAndArgsCall.run

              Method.Invoke

                                       method.invokeNative

                     ActivityThread.main()

                         Looper.loop()

                                                                 ....

    每个应用程序都以ActivityThread.main()为入口进入到消息循环处理。对于一个进程来讲,我们需要这个闭合的处理框架。


    ActivitiyThread是应用程序概念空间的重要概念,他建立了应用进程运行的框架,并提供了一个IActivityThread接口作为与 Activity Manager Service的通讯接口.通过该接口AMS可以将Activity的状态变化传递到客户端的Activity对象。

2.3 ActivitiyThread的建立

为了叙述的方便我将Actvitiy Manager Service简写成AMS。

    在AMS中关于应用程序的概念是ProcessRecord,请求都是从Activity,Service…等开始的,在Activity需要Resume时,此时如果与Activity相关的应用进程没有起来,AM则启动应用进程。

AMS与应用进程的绑定分为两个部分,第一部分就是AM建立应用进程,第二部分就是应用进程Attach到AM,与AM建立通讯通道。

1)创建建立进程:startProcessLocked(processName,Appinfo.uid)。该函数在StartSecificActivityLocked等调用。

(1) 建立ProcessRecord对象app,并将该对象添加到mProcessNames中。应用对象在mProcessNames中使用应用名字和 uid来标识自己。如果在同一个Package中的Activity,如果都使用默认设置,那么这些Activity都会托管在同一个进程中,这是因为他 们在带的ApplicationInfo中的ProcessName都是一样的。


 


mPidsSelfLocked数组记录了PID,这个将会在应用进程跑起来后,将自己Attach到AM时,根据pid找到自己的前世:ProcessRecord.

2)android.app.ActivityThread进程启动

     Android.app.ActivityThread进程建立后,将跳入到ActivityThread的main函数开始运行,进入消息循环。

    应用进程使用thread.attach()发起AMS的AttachApplicationLocked调用,并传递 ActvitiyThread对象和CallingPid。AttachApplicationLocked将根据CallingPid在 mPidsSelfLocked找到对应的ProcessRecord实例app,将ActvitiyThread放置app.thread中。这样应用 进程和AMS建立起来双向连接。AM可以使用AIDL接口,通过app.thread可以访问应用进程的对象。

    应用程序通过ActivityThread提供的框架,建立消息循环Looper和Handler。从前面的相关章节我们知道有Looper和Handler,整个系统就可以运作了。

为了更为系统的了解应用程序的建立时序及其涉及到数据操作,我给出了应用进程的建立过程示意图:

 

分享到:
评论

相关推荐

    AMS启动流程源码分析

    AMS 启动流程源码分析 AMS(Activity Manager Service)是 Android 操作系统中的一...AMS 启动流程是一个复杂的过程,涉及到多个阶段和操作。了解 AMS 启动流程可以帮助我们更好地理解 Android 系统的工作原理和机制。

    AMS EDA安装和Lincese启动方法文档

    AMS EDA安装和Lincese启动方法文档 ...这份文档详细地介绍了AMS EDA安装和启动的过程,涵盖了从下载安装工具包到启动License和AMS EDA软件的所有步骤。通过遵循这些步骤,用户可以成功安装和启动AMS EDA软件。

    AMS_START.pdf

    AMS的时序图通过图形化的方式展现了AMS启动的整个过程,便于开发者理解系统启动时AMS的行为和动作。 根据提供的内容,AMS启动过程中涉及的关键知识点如下: 1. **AMS启动流程概述**: - AMS的启动流程是Android...

    acitivity组件启动过程分析

    7. **Activity 生命周期回调**:新创建的应用程序进程接收到 AMS 发送的信息后,执行 `MainActivity` 的生命周期回调方法,完成启动过程。 #### 三、Activity 组件启动流程图 流程图展示了 Activity 启动的基本...

    Activity启动流程进程启动

    Activity 的启动流程是一个复杂的过程,涉及到多个组件和对象之间的交互。在本文中,我们将详细介绍 Activity 启动流程的整个过程。 ActivityThread 的创建 在 Android 系统中,ActivityThread 是一个非常重要的...

    Activity 启动过程源码+分析过程

    7. **跨进程通信**:在启动过程中,涉及到多个进程间的通信,如应用进程与系统服务进程的Binder通信,这关系到Android系统的架构和安全模型。 8. **多线程考虑**:AMS的调度工作是在系统服务线程中进行的,而应用...

    Rtsp转RTMP之有客户观看才启动模式

    【Rtsp转RTMP之有客户观看才启动模式】是一种高效的流媒体处理策略,尤其适用于需要处理大量网络摄像头或RTSP源的情况。RTSP(Real Time Streaming Protocol)是一种广泛用于网络摄像头的协议,它提供了实时音视频...

    Android 启动过程相关资料

    Android启动过程是一个复杂而有序的系统初始化阶段,涵盖了操作系统内核加载、系统服务启动、用户界面呈现等多个步骤。在这个过程中,Makefile起着至关重要的作用,它是构建Android系统的基石之一。 首先,Android...

    Android Service的启动过程分析

    在AMS内部,`startService()`方法会同步执行,获取调用者的进程ID、用户ID等信息,然后调用`mServices.startServiceLocked()`来真正启动Service。这个过程涉及到了服务的生命周期管理,包括创建Service实例,调用其`...

    Android应用框架之应用启动过程详解

    AMS控制进程的启动,`Process`类负责实际的进程创建,而Zygote则扮演孵化器的角色,为新进程提供基础环境。整个过程涉及到的组件和机制,如`ActivityManagerService`、`ActivityThread`、`Process`、Zygote以及...

    android系统启动原理

    Android系统启动原理是一个复杂而有序的过程,涉及到操作系统内核、硬件初始化、系统服务启动、用户界面呈现等多个层面。本文将全面、系统地解析这一过程,旨在帮助读者深入理解Android系统的运行机制。 首先,...

    2019Android Framework 高频面试题总结.pdf

    AMS启动流程涉及的另一个重点是进程启动。AMS负责应用程序的进程启动和管理,当一个新的应用程序组件(如Activity)需要启动时,AMS会根据应用程序的需要创建新的进程或使用已存在的进程。AMS与进程启动的关系密切,...

    Android Hook AMS 实现统一登录

    AMS是Android系统服务的一部分,运行在System进程,拥有最高的权限。当应用程序请求启动一个新的Activity时,这些请求会被发送到AMS,由AMS来决定如何处理这些请求,包括决定哪个Activity应该被启动。 为了Hook AMS...

    Android代码-android-advanced-decode

    《Android进阶解密》源码 ...第6章介绍ActivityManagerService,包括AMS家族、AMS的启动过程、AMS重要的数据结构和Activity栈管理等内容。 第7章介绍WindowManager,包括WindowManager的关联类、Window的属性和Window

    Android常用组件深入解析1

    1. Launcher进程请求AMS启动根Activity。 2. AMS通知Zygote创建新进程。 3. Zygote通过fork自身生成新的进程,并告知AMS进程创建完成。 4. AMS指示新进程创建根Activity。 理解Activity启动流程的每一个步骤有助于...

    android 开机启动源代码

    Zygote启动后,会孵化出第一个应用进程——SystemServer进程,然后SystemServer会继续初始化其他服务,如AMS(Activity Manager Service)、PMS(Package Manager Service)等。 在服务启动的同时,Android还会进行...

    Android 启动流程分析

    本文将深入探讨Android系统的启动过程,包括Zygote进程的孵化和SystemServer的角色。 首先,我们从Android设备开机说起。当按下电源键启动设备时,硬件初始化完成后,引导加载程序(Bootloader)会加载Linux内核。...

Global site tag (gtag.js) - Google Analytics