`

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核心分析

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

    android 核心分析

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

    Android核心分析-050417421

    7.应用程序框架:Android应用程序框架之无边界设计意图、Android应用框架之AndroidApplication、Android应用框架之Activity。 8.GDI机制:Android GDI之基本原理及其总体框架、Android GDI之显示缓冲管理、Android ...

    Android核心设计思想分析

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

    android核心分析pdf

    **Android核心分析(21):** AndroidApplication是应用程序框架中的核心类,这部分内容详细介绍了它的作用及其在应用程序生命周期中的角色。 **Android核心分析(22):** Activity是Android应用程序中最基本的UI...

    android-ndk(android-ndk-r25b-windows.zip)

    3. **头文件和库**:提供了Android系统API的C/C++头文件,使得开发者可以在原生代码中访问Android框架和系统服务。 4. **Android.mk和Application.mk**:这两个配置文件用于指定构建规则,如源文件路径、编译选项、...

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

    ### Android开发指南中文版——应用程序框架 #### 一、应用程序基础(Application Fundamentals) 在Android开发中,应用程序的基础架构包括以下几个核心部分: ##### 关键类 Android应用的核心是几个关键类: 1. *...

    android-support-multidex-instrumentation.jar.zip

    它包含了对原生 Android 框架的扩展,使得应用能够识别并加载多个.dex文件。具体来说,这个库提供了以下功能: 1. **主 Dex 文件**:在应用安装时,系统会默认将主要的.dex文件(通常称为 classes.dex)加载到内存...

    Android数据库框架-----ORMLite 的基本用法

    ORMLite(Object Relational Mapping Lite)是一个轻量级的ORM框架,它简化了Android应用程序与SQLite数据库之间的交互。下面将详细介绍ORMLite的基本用法。 ### 1. 添加依赖 首先,你需要在项目的`build.gradle`...

    Android-component-application-master.7z

    本文将围绕“Android-component-application-master”这一项目,深入探讨Android组件化的核心理念、实现方式以及相关技术,包括字节码插装和自定义插件。 一、组件化的价值与理念 组件化是将一个大型应用拆分成多...

    Android数据库框架-----GreenDao3的相关使用和版本升级更新

    在Android应用开发中,数据库是不可或缺的一部分,用于存储和管理数据。GreenDao是一个高效、轻量级的对象关系映射(ORM)框架,专为Android设计,使得开发者可以更方便地操作SQLite数据库。本文将深入探讨GreenDao3...

    android核心分析

    - **AndroidApplication**:这是所有Android应用程序的基类,负责初始化应用程序环境。 - **GDI(Graphics Display Interface)**: - Android的图形显示接口涉及显示缓冲管理、共享缓冲区机制、SurfaceFlinger等...

    Android Application Development All-in-One For Dummies

    - **性能分析工具**:教授如何使用Android Studio内置的工具来监控和优化应用性能,例如内存使用情况、CPU占用率等。 - **错误日志记录**:介绍如何利用Logcat工具记录调试信息,帮助开发者快速定位问题所在。 - ...

    Android ---Professional Android Application Development

    探索Android框架的深层次内容,包括自定义View、性能优化技巧等。 #### 三、关键技术点详解 1. **Activity生命周期管理** - Activity是Android应用中最基本的组件之一,理解其生命周期对于正确处理应用状态至关...

    Beginning Android Application Development

    ### 开发Android应用程序的核心知识点概览 #### 一、引言 《Beginning Android Application Development》是一本面向初学者的Android应用开发指南。本书系统地介绍了Android应用开发的基础知识和技术要点,适合希望...

    android-ndk-r16b-windows-x86_64.zip

    Android NDK(Native Development Kit)是谷歌为Android平台提供的一款用于开发原生代码的应用程序工具集,它允许开发者使用C和C++等低级语言编写部分应用程序,从而提高性能、利用硬件加速等功能。"android-ndk-r16...

    android ffmpeg-android-java-2a627f6ecd

    FFmpeg 是一个强大的开源多媒体处理框架,广泛应用于音频和视频的编码、解码、转换以及流媒体处理。在Android平台上,开发者通常会使用FFmpeg库来实现复杂的音视频操作,如裁剪、合并、转码等。这个压缩包"android ...

    Android核心分析 100多页

    ### Android核心分析概览 #### 一、设计意图与方法论探讨 - **设计意图的重要性:** 开发者在深入研究Android系统时,首先要明确设计者的初衷与目标。只有理解了设计者的意图,才能更好地把握整个系统的架构和发展...

    Android Application部分详解

    通过本文的学习,读者应该能够更好地理解和运用Application类,从而提升Android应用程序的开发效率和质量。需要注意的是,随着Android系统的不断更新和发展,相关技术和最佳实践也在不断进步,因此开发者还需要持续...

Global site tag (gtag.js) - Google Analytics