Android四大组件与进程启动的关系摘要

startActivity启动过程分析

Activity启动发起后,通过Binder最终交由system进程中的AMS来完成

start_activity

启动流程

startActivity
-startActivityForResult
--mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(),mToken...);
---ActivityManagerNative.getDefault().startActivity(...)
----mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0)
-----AMN.onTransact
------startActivity(app...)
-------startActivityAsUser
--------mStackSupervisor.startActivityMayWait(caller...)
caller = ApplicationThreadProxy, 用于跟调用者进程ApplicationThread进行通信的binder代理类.	
resultTo = Activity.mToken, 其中Activity是指调用者所在Activity, mToken对象保存自己所处的ActivityRecord信息	
---------resolveActivity
----------AppGlobals.getPackageManager().resolveIntent	
-----------queryIntentActivities(intent...)
--mMainThread.sendActivityResult(mToken...)	
---new ActivityRecord(mService, callerApp...)
---------+startActivityLocked(caller...)	
------------resumeTopActivitiesLocked
--------------resumeTopActivityLocked
----------------resumeTopActivityInnerLocked
ATP.scheduleLaunchActivity//ApplicationThreadProxy.java
-ATN.onTransact//ApplicationThreadNative.java
--scheduleLaunchActivity//ApplicationThread.java
---sendMessage(H.LAUNCH_ACTIVITY, r);
----handleMessage//ActivityThread.java ::H
-----handleLaunchActivity
------performLaunchActivity//最终回调目标Activity的onCreate
-------r.intent.resolveActivity+ mInstrumentation.newActivity+ r.packageInfo.makeApplication//makeapplication
+activity.attach(appContext..)+mInstrumentation.callActivityOnCreate(activity...)+activity.performStart()
-------mInstrumentation.callActivityOnPostCreate(activity, r.state)+ mActivities.put(r.token, r);
------handleResumeActivity(r.token,最终回调目标Activity的onStart,onResume

mAppThread: 数据类型为ApplicationThread,通过mMainThread.getApplicationThread()方法获取.
mToken: 数据类型为IBinder.
AMP经过binder IPC,进入ActivityManagerNative(简称AMN)。接下来程序进入了system_servr进程,开始继续执行。
主要分支功能:
当找不到需要resume的Activity,则直接回到桌面;
否则,当mResumedActivity不为空,则执行startPausingLocked()暂停该activity;
然后再进入startSpecificActivityLocked环节,接下来从这里继续往下说。

本文详细startActivity的整个启动流程,
流程[2.1 ~2.4]:运行在调用者所在进程,比如从桌面启动Activity,则调用者所在进程为launcher进程,launcher进程利用ActivityManagerProxy作为Binder Client,进入system_server进程(AMS相应的Server端)。
流程[2.5 ~2.18]:运行在system_server系统进程,整个过程最为复杂,核心的过程,下面其中部分步骤:
流程[2.7]:会调用到resolveActivity(),借助PackageManager来查询系统中所有符合要求的Activity,当存在多个满足条件的Activity则会弹框让用户来选择;
流程[2.8]:创建ActivityRecord对象,并检查是否运行App切换,然后再处理mPendingActivityLaunches中的activity;
流程[2.9]:为Activity找到或创建新的Task对象,设置flags信息;
流程[2.13]:当没有处于非finishing状态的Activity,则直接回到桌面; 否则,当mResumedActivity不为空则执行startPausingLocked()暂停该activity;然后再进入startSpecificActivityLocked()环节;
流程[2.14]:当目标进程已存在则直接进入流程[2.17],当进程不存在则创建进程,经过层层调用还是会进入流程[2.17];
流程[2.17]:system_server进程利用的ATP(Binder Client),经过Binder,程序接下来进入目标进程
流程[2.19 ~2.18]:运行在目标进程,通过Handler消息机制,该进程中的Binder线程向主线程发送H.LAUNCH_ACTIVITY,最终会通过反射创建目标Activity,然后进入onCreate()生命周期

start_activity_process

启动流程:

  1. 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求
  2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  3. Zygote进程fork出新的子进程,即App进程;
  4. App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
  5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
  6. App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
  7. 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。

到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。 启动Activity较为复杂,后续计划再进一步讲解生命周期过程与系统是如何交互,以及UI渲染过程,敬请期待

在这里插入图片描述

startService启动过程分析

本例是start remote service,所以这是一个启动进程的过程。 不是

activity_manager_classes

流程图 

在app中启动一个service,就一行语句搞定,

startService(); //或 binderService()

 该过程如下:start_servicestart_service

 

当App通过调用Android API方法startService()或binderService()来生成并启动服务的过程,主要是由ActivityManagerService来完成的。

  1. ActivityManagerService通过Socket通信方式向Zygote进程请求生成(fork)用于承载服务的进程ActivityThread。此处讲述启动远程服务的过程,即服务运行于单独的进程中,对于运行本地服务则不需要启动服务的过程。ActivityThread是应用程序的主线程;
  2. Zygote通过fork的方法,将zygote进程复制生成新的进程,并将ActivityThread相关的资源加载到新进程;
  3. ActivityManagerService向新生成的ActivityThread进程,通过Binder方式发送生成服务的请求
  4. ActivityThread启动运行服务,这便于服务启动的简易过程,真正流程远比这服务

启动服务的流程图: 

Seq_start_service

首先getService获取ActivityManagerProxy对象,然后ActivityManagerProxy.startService()方法。

流程说明

在整个startService过程,从进程角度看服务启动过程

  • Process A进程:是指调用startService命令所在的进程,也就是启动服务的发起端进程,比如点击桌面App图标,此处Process A便是Launcher所在进程。
  • system_server进程:系统进程,是java framework框架的核心载体,里面运行了大量的系统服务,比如这里提供ApplicationThreadProxy(简称ATP),ActivityManagerService(简称AMS),这个两个服务都运行在system_server进程的不同线程中,由于ATP和AMS都是基于IBinder接口,都是binder线程,binder线程的创建与销毁都是由binder驱动来决定的,每个进程binder线程个数的上限为16。
  • Zygote进程:是由init进程孵化而来的,用于创建Java层进程的母体,所有的Java层进程都是由Zygote进程孵化而来;
  • Remote Service进程:远程服务所在进程,是由Zygote进程孵化而来的用于运行Remote服务的进程。主线程主要负责Activity/Service等组件的生命周期以及UI相关操作都运行在这个线程; 另外,每个App进程中至少会有两个binder线程 ApplicationThread(简称AT)和ActivityManagerProxy(简称AMP),当然还有其他线程,这里不是重点就不提了。

start_service_process

启动流程:

  1. Process A进程采用Binder IPC向system_server进程发起startService请求;
  2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  3. zygote进程fork出新的子进程Remote Service进程;
  4. Remote Service进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
  5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向remote Service进程发送scheduleCreateService请求;
  6. Remote Service进程的binder线程在收到请求后,通过handler向主线程发送CREATE_SERVICE消息;
  7. 主线程在收到Message后,通过发射机制创建目标Service,并回调Service.onCreate()方法。

到此,服务便正式启动完成。当创建的是本地服务或者服务所属进程已创建时,则无需经过上述步骤2、3,直接创建服务即可。

生命周期

startService的生命周期为onCreate, onStartCommand, onDestroy,流程如下图:

service_lifeline

bindService启动过程分析

bind_service

  1.  图中蓝色代表的是Client进程(发起端), 红色代表的是system_server进程, 黄色代表的是target进程(service所在进程);
  2. Client进程: 通过getServiceDispatcher获取Client进程的匿名Binder服务端,即LoadedApk.ServiceDispatcher.InnerConnection,该对象继承于IServiceConnection.Stub; 再通过bindService调用到system_server进程;

  3. system_server进程: 依次通过scheduleCreateService和scheduleBindService方法, 远程调用到target进程;
  4. target进程: 依次执行onCreate()和onBind()方法; 将onBind()方法的返回值IBinder(作为target进程的binder服务端)通过publishService传递到system_server进程;
  5. system_server进程: 利用IServiceConnection代理对象向Client进程发起connected()调用, 并把target进程的onBind返回Binder对象的代理端传递到Client进程;
  6. Client进程: 回调到onServiceConnection()方法, 该方法的第二个参数便是target进程的binder代理端. 到此便成功地拿到了target进程的代理, 可以畅通无阻地进行交互.

notes: BindService作用是获取目的进程binder. client->system_server->target onbind->system_server connected->client  onServiceConnection

Android Broadcast广播机制分析

send_broadcast

理解ContentProvider原理

想要操作ContentProvider,则需要先获取其相应的ContentResolver,再利用ContentResolver类来完成对数据的增删改查操作

理解Application创建过程

system_server进程

public final class SystemServer {
    private void run() {
        ...
        createSystemContext(); //[见2.2]
        startBootstrapServices(); //开始启动服务
        ...
    }
}
ActivityThread.systemMain
-ActivityThread thread = new ActivityThread()
--ApplicationThread mAppThread = new ApplicationThread()+Looper mLooper = Looper.myLooper+H mH = new H()
-thread.attach
-- mInstrumentation = new Instrumentation()+makeApplication(Application app = mActivityThread.mInstrumentation.newApplication)

System_server 是一个进程。AMS etc是它的线程. system_server 负责启动这些线程,然后启动Looper无限循环(for+epoll).
空闲block在epoll,有消息则循环从queue读取并处理.

App进程

这是运行在app进程,当进程由zygote fork后执行ActivityThread的main方法。
经过binder调用,进入system_server进程。
system_server收到attach操作, 然后再向新创建的进程执行handleBindApplication()过程:

(一)system_server进程 

其application创建过程都创建对象有ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application。 流程图如下:

system_application

app进程

其application创建过程都创建对象有ActivityThread,ContextImpl,LoadedApk,Application。 流程图如下

app_application

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值