`

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

阅读更多

原文地址:http://blog.csdn.net/maxleng/article/details/5621345

 

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的概念空间。这些组件依附于应用程序中,应用程序并不会一开始就建立起来,而是在这些 组件建立起来后,需要运行时,才开始建立应用程序对象。

image

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.2  ActivityThread运行框架

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

NaiveStart.main()

        ZygoteInit.main

           ZygoteInit$MethodAndArgsCall.run

              Method.Invoke

                                       method.invokeNative

                     ActivityThread.main()

                         Looper.loop()

                                                                 ....

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

image

    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都是一样的。

image  

image

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

2)android.app.ActivityThread进程启动

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

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

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

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

 image

分享到:
评论

相关推荐

    android核心分析pdf

    Android核心分析(21)----Android应用框架之AndroidApplication. Android核心分析(22)----Android应用框架之Activity Android核心分析(23)----Andoird GDI之基本原理及其总体框架 Android核心分析(24)----...

    Android核心分析(pdf)

    Android核心分析(21)----Android应用框架之AndroidApplication. Android核心分析(22)----Android应用框架之Activity Android核心分析(23)----Andoird GDI之基本原理及其总体框架 Android核心分析(24)----...

    [经典文档]Android核心分析

    核心分析之二十一 ----- Android 应用框架之Android Application 核心分析之二十二 ----- Android 应用框架之Activity 核心分析之二十三 ----- Android GDI之显示缓冲管理 核心分析之二十四 ----- Android GDI之共享...

    android 核心分析

    Android 核心分析(21)----Android 应用框架之 AndroidApplication....................... 88 Android 核心分析(22)-----Android 应用框架之 Activity..........................................93 Android 核心...

    Android核心设计思想分析

    Android核心分析(21)----Android应用框架之AndroidApplication.......................88 Android核心分析(22)-----Android应用框架之Activity..........................................93 Android核心分析...

    Android核心分析

    Android 核心分析( 21 ) ----Android 应用框架之 AndroidApplication ....................... 88 Android 核心分析( 22 ) -----Android 应用框架之 Activity .......................................... 93 ...

    Android主要机制深入分析

    Android 核心分析(21)----Android 应用框架之AndroidApplication....................... 88 Android 核心分析(22)-----Android 应用框架之Activity..........................................93 Android 核心...

    Android开发指南中文版-----应用程序框架

    应用程序基础Application Fundamentals 4 关键类 4 应用程序组件 5 激活组件:intent 7 关闭组件 7 manifest文件 8 Intent过滤器 8 Activity和任务 10 Affinity(吸引力)和新任务 11 加载模式 12 清理堆栈 13 启动...

    Android高级编程--源代码

     由于Android构建在开源代码的框架之上,而且提供了强大的SDK库和开放的理念,所以它为广大的没有任何移动应用程序开发经验的新手开辟了一条开发完美的移动应用程序的康庄大道。而富有经验的移动开发人员现在也可以...

    Android代码-一款用心去做的Android 换肤框架

    Android-skin-support: 一款用心去做的Android 换肤框架, 极低的学习成本, 极好的用户体验. 只需要两行代码, 就可以实现换肤, 你值得拥有!!! 第一行: 在Application的onCreate中初始化 SkinCompatManager.init(this)...

    新版Android开发教程.rar

    Android Android Android Android 应用现状 � 设备商: lenovo 、琦基、戴尔、三星、摩托罗拉、华为、英特尔、 Kogan 、索爱、华硕、多普达、爱可 视 、 Archos 等。 � 制造商: HTC 、 Telstra 等。 � 手机设计...

    Android代码-Android-Skin

    Android-Skin:极简单的android换肤框架,无缝支持第三方控件,一行代码即可换肤,集成成本极低, 提供丰富的API支持拓展,对业务代码几乎无入侵。 AndroidSkin.getInstance().saveSkinAndApply(skinFilePath, ...

    Android代码-Android-ServiceManager

    Android-ServiceManager 简化android跨进程调用,无需aidl、service、messenger等,只需定义任意接口,并实现接口即可。 利用此框架可以轻松实现跨进程调用。 使用方法: 1、项目中引入libray工程, 另请关注libray...

    Android代码-android

    Android Demo By ttdevs 这是一个关于Android的Demo,主要用于记录日常使用的代码。仅供参考! 项目结构 Android |--app |--apps |----bolts |----sqlcipher |----things |--doc |----image |--modules |----...

    android-application-plug-ins-frame-work:从 code.google.compandroid-application-plug-ins-frame-work 自动导出

    android-application-plug-ins-frame-work ...框架的思想,主要是通过apk清单文件中的sharedUserId属性来吧多个apk融合为单一的dalvik虚拟机,也就是融合为一个进程,这样就变相逾越了android框架中不同apk权限不同无法

    深入理解Android:卷I--详细书签版

     结合实际应用开发需求,以情景分析的方式有针对性地对Android的源代码进行了十分详尽的剖析,深刻揭示Android系统的工作原理  机锋网、51CTO、开源中国社区等专业技术网站一致鼎力推荐 内容简介  《深入理解...

    Android课程设计---基于Android系统的音乐播放器设计与实现.doc

    根据Android的软件框图,其软件层次结 构自下而上分为以下几个层次: 第一、操作系统层(OS) 第二、各种库(Libraries)和Android 运行环境(RunTime) 第三、应用程序框架(Application Framework) 第四、应用...

Global site tag (gtag.js) - Google Analytics