- 浏览: 843108 次
- 性别:
- 来自: 哈尔滨
-
文章分类
最新评论
-
doloveme:
$sudo cp MONACO_Linux.ttf /usr/ ...
terminator 的配置 -
腾讯rep:
lowser
RSA加密算法c++简单实现 -
csuhanyong:
好YD啊,好YD
一图流:机械键盘各轴区别 -
doloveme:
1。其中:extman ,extmail下载http://ww ...
Ubuntu下安装postfix+extmail邮件服务器 -
doloveme:
repo sync出现“fatal: '../platform ...
Android 编译环境配置搭建(Ubuntu 12.04)及环境导致编译错误QA
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 theelement.
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()为入口进入到消息循环处理。对于一个进程来讲,我们需要这个闭合的处理框架。
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,整个系统就可以运作了。
为了更为系统的了解应用程序的建立时序及其涉及到数据操作,我给出了应用进程的建立过程示意图:
发表评论
-
JAVA代码混淆
2016-05-05 18:24 1494JAVA代码混淆 <!--[if !supportL ... -
android 监听状态栏被下拉
2015-12-25 17:23 3524Activity的onWindowFocusChange()方 ... -
android使用mount挂载/system/app为读写权限,删除或替换系统应用
2015-11-27 14:13 4076注意:以下代码中#开头的则为需要执行的shell命令,其他的 ... -
Ubuntu 14.04 文件服务器--samba的安装和配置
2015-11-10 10:49 661jingyan.baidu.com/album/00a07f ... -
intellij 打开工程在每个java文件上 有个红色的无效符
2015-07-24 13:52 1807说明该类不是可编译文件。在project Structure中 ... -
logcat命令详解
2015-07-22 16:34 1007Android日志系统提供了记录和查看系统调试信息的功能。日 ... -
gradle打包遇到的错误汇总
2015-07-21 11:32 0错误1:A problem occurred ... -
Android读写XML(下)——创建XML文档
2015-04-29 11:02 636在前面的2篇文章Android读写XML(上)—— pack ... -
Android读写XML(中)——SAX
2015-04-29 10:54 643在Android读写XML(上)� ... -
Android读写XML(下)——创建XML文档
2015-04-29 10:52 719在前面的2篇文章Android读写XML(上)—— pack ... -
android:configChanges locale 改语言后,该配置不起作用的原因
2015-03-23 14:38 2575@Override public void on ... -
android.app.Fragment$InstantiationException 解决办法
2015-03-23 13:46 1448android.app.Fragment$Instantia ... -
linux 查看内存
2015-02-10 13:08 7631、free监控内存使用情况 #free 2、watc ... -
android fastboot 刷机 指令
2015-01-19 18:31 1556原生bootloader:bootloader-gro ... -
[Android实例] android中进行https连接的方式的详解 (转发)
2015-01-09 15:50 715x 如果不需要验证服务器端证书, ... -
编译android源码apk是否生成odex方法
2014-10-20 17:19 1682其实Android系统默认的配置是,如果没有指定DISABL ... -
关于android源码中的APP编译时引用隐藏的API出现的问题
2014-10-20 15:36 880今天在编译android源码中的计算器APP时发现,竟然无法 ... -
Android系统进程Zygote启动过程的源代码分析
2014-09-17 10:09 544在Android系统中,� ... -
Handler和HandlerThread
2014-09-16 16:58 7161.什么是Handler? SDK中关于Handler的说 ... -
怎样识别三洋18650锂电池电芯
2014-09-01 09:52 1158浏览:20384 | 更新:2011-03 ...
相关推荐
### Android Application部分详解 #### 一、Android运行机制与Application类的作用 Android作为一个移动操作系统的代表,其背后的技术体系和架构十分复杂而精妙。在深入理解Android的运行机制之前,我们首先需要...
Android application structure 12 Application signing 15 Data storage on the device 15 Crypto APIs 16 Device Administration 17 Summary 17 Chapter 2: Application Building Blocks 19 Application ...
在Android平台上,应用程序(Application)是用户与操作系统交互的核心组件,它是所有功能和界面的起点。Android应用由多个组件构成,包括活动(Activity)、服务(Service)、广播接收者(BroadcastReceiver)以及...
标题"androidapplication"暗示我们讨论的是一个基础的Android应用项目,而描述指出这是一个模仿登录界面的程序,特别为搜狐微博开放平台设计。在这个项目中,我们可以看到以下几个核心的Android开发知识点: 1. **...
本书名为《Android Application Programming with OpenCV》,是一本关于如何使用OpenCV库进行Android应用开发的英文教程。OpenCV是一个开源的计算机视觉和机器学习软件库,最初由英特尔公司创建,现在由非营利组织**...
Android应用程序安全研究的核心目的在于保障在日益增长的移动应用市场中用户的隐私和数据安全。本研究针对Android智能手机应用的安全属性进行了广泛的研究,重点分析了在大规模流行应用中可能存在的安全缺陷。 研究...
Android Application Development: Programming with the Google SDK 电子书 Rick Rogers (Author), John Lombardo (Author), Zigurd Mednieks (Author), G. Blake Meike (Author) Paperback: 336 pages Publisher: ...
《专业Android应用开发》是Android开发领域的一本权威指南,旨在帮助读者从初学者到熟练开发者,逐步掌握Android应用程序的设计、实现与优化技巧。这本书详细介绍了Android开发的各个方面,包括环境搭建、UI设计、...
No matter your level of programming experience, Android Application Development For Dummies is an ideal guide for getting started with developing applications for the Android platform.
### 专业Android应用开发知识点概览 #### 一、书籍简介 《专业Android应用开发》是一本详尽介绍如何利用Android SDK构建移动应用程序的专业指南。本书由Reto Meier撰写,由Wiley Publishing出版,全面覆盖了Android...
Introduction to Android Application Development(5th) 英文epub 第5版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Android的`Application`类是每个Android应用的顶级组件,它是所有Activity、Service等的父类。开发者可以创建自定义的`Application`子类,并在其中存储全局变量,以达到在应用程序的各个组件之间共享数据的目的。...
深入理解Android应用框架 在移动应用开发领域,Android操作系统凭借其开放性和灵活性赢得了广大开发者和用户的青睐。Android不仅仅是一个简单的框架,它实际上是一套完整的操作系统,由Google开发并维护,旨在为...
本文将深入探讨Android Application插件化的概念、工作原理以及如何实现一个基本的例子程序。 一、Android插件化概述 1.1 插件化定义 插件化是指将应用程序的功能拆分为多个独立的部分,即插件。每个插件都可以...
【Android Application】 Android应用开发是移动开发领域的重要部分,主要使用Java或Kotlin语言进行编程。"第一个Android Application"通常是指开发者初次接触Android平台时创建的简单应用,旨在理解和熟悉基本的...