其他
Android应用启动过程详解
第一个公开选择出售股权的股东出现了。4月24日,申通快递一纸公告披露菜鸟出售股权计划,涉资7073.8万美元,折合约5.13亿人民币。随着回购计划陆续实施,那些曾经押注菜鸟“暴富”的梦想或许将一一回落到现实。
https://mp.weixin.qq.com/s/0YUe8z86NXB8x2RTtQJCuQ
当用户在启动器上点击应用图标时,启动器会发起启动请求。这通常通过调用startActivity()方法实现,该方法的参数包括一个Intent对象,表示要启动的Activity。此时,启动器会将启动请求传递给系统的ActivityManagerService(AMS)进行处理。
startActivity()方法最终会调用系统服务ActivityManagerService(AMS)的同名方法。AMS负责管理系统中所有的Activity,包括启动、暂停、停止等操作。在这一步,AMS会检查启动请求的合法性,如权限和Intent过滤器等。如果启动请求合法,AMS会继续执行后续操作;否则,启动过程将被终止。
AMS将启动请求添加到消息队列中,等待调度。消息队列由主线程(UI线程)处理,确保所有UI操作按顺序执行。这有助于避免因多线程操作导致的UI渲染问题和性能问题。
在主线程处理启动请求时,AMS会检查目标Activity所属的应用进程是否已经运行。如果没有运行,AMS会通过Zygote进程创建一个新的应用进程。Zygote是一个特殊的进程,包含预加载的Android框架类和资源,用于快速创建新的应用进程。这一机制可以显著提高应用启动速度,提升用户体验。
新的应用进程启动后,会创建一个Application对象和目标Activity的实例。这涉及到调用Activity的构造函数、onCreate()方法和onStart()方法等生命周期回调。在这些回调方法中,开发者可以对Activity进行初始化操作,如设置布局文件、初始化视图等。
在Activity实例创建完成后,系统会调用onResume()方法,使Activity变为可见状态。这时,Activity可以创建和显示其界面,如设置布局、初始化视图和处理用户输入等。此外,开发者还可以在onResume()方法中执行一些与界面相关的更新操作,以确保界面始终保持最新状态。
当Activity界面显示完成后,应用启动过程结束。用户可以与应用互动,进行各种操作。此时,应用已经处于运行状态,可以响应用户的各种操作和处理后台任务。
在Android操作系统中,Zygote进程是一个非常重要的系统进程,它是所有Android应用进程的父进程,负责为新的应用进程提供预加载的环境和资源。
在Android操作系统中,ActivityManagerService(简称AMS)是一个非常重要的系统服务,它负责管理系统中的所有应用进程和Activity,包括启动、暂停、停止以及生命周期管理等。
管理应用进程:AMS维护了一个运行进程列表,用于跟踪和管理所有正在运行的应用进程。当一个新的应用需要启动时,AMS会检查其所需的进程是否已经存在,如果不存在,AMS会通过Zygote进程创建一个新的进程。同时,AMS还负责处理应用进程的结束,如当应用退出或系统内存不足时,AMS会结束不需要的进程以释放资源。 管理Activity生命周期:AMS负责调度和管理Activity的生命周期,包括启动Activity(startActivity())、暂停Activity(pauseActivity())、停止Activity(stopActivity())等。AMS通过调用Activity的生命周期回调方法(如onCreate()、onStart()、onResume()等)来控制Activity的状态。 管理任务和返回栈:AMS维护了一个任务列表和返回栈,用于管理用户的操作历史和Activity的导航。任务列表记录了用户的操作序列,每个操作对应一个Activity实例。返回栈则用于管理Activity的返回行为,当用户按下返回键时,AMS会从返回栈中弹出当前Activity,回到上一个Activity。 处理系统广播:AMS还负责处理系统广播,包括发送广播(sendBroadcast())和注册广播接收器(registerReceiver())。这使得应用可以接收到系统或其他应用发送的广播,响应各种系统事件或应用间的通信。
在Android操作系统中,System Server进程是一个非常关键的系统进程。它负责启动和管理一系列的系统服务(SystemService),以提供各种系统级功能和资源。System Server进程在系统启动过程中由Zygote进程创建,随后在整个系统运行期间保持活跃。
启动系统服务:在系统启动过程中,System Server进程会创建并启动一系列系统服务,如ActivityManagerService(AMS)、WindowManagerService(WMS)、PackageManagerService(PMS)等。这些服务负责管理系统中的应用进程、窗口、包管理等核心功能。 管理系统服务:System Server进程负责维护系统服务的生命周期,包括服务的创建、初始化、运行和销毁。它确保系统服务在整个系统运行期间始终处于活跃状态,以便随时响应应用和系统的请求。 提供系统服务接口:System Server进程通过Binder机制向应用提供系统服务的接口。应用可以通过Context类的getSystemService()方法获取系统服务的引用,然后调用服务提供的API来访问和控制系统功能。例如,要获取LocationManager服务,可以调用context.getSystemService(Context.LOCATION_SERVICE)。 处理系统事件:System Server进程还负责处理各种系统事件,如设备状态变化、电源管理、网络连接等。通过监听和响应这些事件,System Server进程可以确保系统资源得到合理分配,提高系统性能和稳定性。
上述各个角色在跨进程调用的过程中,使用了Android系统中的一个重要跨进程通信机制——Binder机制。Binder机制是Android系统中的核心组件之一,它为应用提供了访问系统服务和其他应用服务的途径。接下来我们就阐述一下Binder机制的原理和特点。
基于对象的通信:与其他IPC方式(如管道、消息队列、共享内存等)不同,Binder机制采用基于对象的通信模式。这意味着客户端和服务端可以通过引用和调用远程对象的方法来进行通信,就像在本地进程中操作对象一样。 代理模式:Binder机制使用代理模式来实现跨进程通信。在客户端进程中,Binder框架会创建一个远程对象的代理(Proxy),用于将客户端的请求转发到服务端。在服务端进程中,Binder框架会创建一个远程对象的实现(Stub),用于接收和处理客户端的请求。 引用计数和垃圾回收:Binder机制支持引用计数和垃圾回收,以确保远程对象在不再被使用时被正确释放。当客户端获取远程对象的引用时,Binder框架会自动为该对象增加引用计数;当客户端释放远程对象的引用时,Binder框架会自动为该对象减少引用计数。当引用计数为零时,远程对象将被垃圾回收。 安全性:Binder机制提供了一定程度的安全性保障,通过UID(User ID)识别客户端和服务端的身份,并允许服务端对客户端的访问进行权限控制。此外,Binder通信过程中的数据传输是在内核空间完成的,这有助于减少数据泄露的风险。
以下是结合Android源码阐述Binder机制的关键组件和实现过程:
Binder Native Framework:Binder机制底层依赖于Android的本地框架(C++实现),包括IBinder接口、BpBinder(代理对象)、BBinder(本地实现对象)等。这些类位于frameworks/native/libs/binder目录下,负责实现Binder通信的基本功能。 Binder Java Framework:在Android Java框架层,Binder机制通过IBinder接口、BinderProxy(Java代理对象)和Binder(Java本地实现对象)等类实现。这些类位于frameworks/base/core/java/android/os目录下,它们封装了底层Binder Native Framework,为上层应用提供了易于使用的API。 AIDL(Android Interface Definition Language):AIDL是一种用于定义跨进程接口的语言,位于frameworks/base/tools/aidl目录下。通过AIDL,开发者可以定义远程接口并自动生成对应的Java代理类和实现类。这些生成的类继承自IInterface接口和Stub抽象类,实现了客户端和服务端的通信逻辑。 ServiceManager:ServiceManager是Android系统中的全局服务注册表,位于frameworks/base/cmds/servicemanager目录下。它负责管理所有系统服务和第三方服务,允许客户端通过名称查找和获取服务实例。ServiceManager本身也是一个Binder服务,它在System Server进程中运行。
以下是一个简单的Binder通信过程:
服务端创建一个远程对象(例如,一个系统服务),并将其注册到ServiceManager中。 客户端通过ServiceManager获取远程对象的引用,并创建一个代理对象(BinderProxy)。 客户端通过代理对象调用远程对象的方法。 代理对象将方法调用转换为Binder事务(Parcel对象),并通过Binder驱动(/dev/binder设备)将事务发送到服务端。 服务端的Binder驱动接收到事务后,将其转发给远程对象的实现(Binder对象)。 远程对象的实现处理事务,并将结果返回给客户端。