快捷搜索:

Android核心分析(21)----Android应用框架之AndroidA

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进程上的?这个是我们首先想要弄明白的。

我们在的项目中看到android: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.2ActivityThread运行框架

在阐发中,我们可以看到真正对应利用进程的不是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,全部系统就可以运作了。

为了更为系统的懂得利用法度榜样的树马上序及其涉及到数据操作,我给出了利用进程的建立历程示意图:

您可能还会对下面的文章感兴趣: