现在的位置: 首页 > 综合 > 正文

Android Application分析

2017年12月24日 ⁄ 综合 ⁄ 共 2316字 ⁄ 字号 评论关闭

Application是Activity,Service之类的组件上下文描述。

Application并不是Android的核心概念,而Activity才是Android的核心概念。

2.1 应用进程名称
不管Activity,Service等组件如何设计,它要提供服务,就必须要依附在Linux 的进程上,
建立消息循环,组件才能够真正的运作。
Activity实例是如何Hosting在Linux 进程上的?
android:process="string"定义。
在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.
默认状态下,Activity Manager Service 在应用程序的第一个组件需要运行时将会为应用程序建立一个进程,而这个进程的名字就是android:process=”string”所指定,缺省的是应用程序包的名字。该进程一旦建立,后面的该应用的组件都将运行在该进程中,他们绑定的根据就是这个Android:Process 指定的名称,因为在他们都在同一个应用程序包里,也就具有了同样的进程名字,于是他们都托管在了同一进程中。组件将通过ClassLoader从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的建立
请求都是从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将根据CallingPidmPidsSelfLocked找到对应的ProcessRecord实例app,将ActvitiyThread放置app.thread中。
应用程序通过ActivityThread提供的框架,建立消息循环Looper和Handler。
应用进程的建立过程示意图:

抱歉!评论已关闭.