Android 进程和线程模型-1

上一篇 / 下一篇  2012-10-09 11:04:16 / 个人分类:杂谈

TYSuSNiv){)b0  Android进程模型

%H'\9Q,cBF OL051Testing软件测试网']^ ^ d:Zj[%y3WB

  在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了。51Testing软件测试网4v.rV[.i

51Testing软件测试网_alZ I(AK0w

  在 Linux 中,一个用户ID 识别一个给定用户;在 Android 上,一个用户ID 识别一个应用程序。应用程序在安装时被分配用户 ID,应用程序在设备上的存续期间内,用户ID 保持不变。

qi9g QS051Testing软件测试网5{6Ci.W"c]9? JP

  默认情况下,每个apk运行在它自己的Linux进程中。当需要执行应用程序中的代码时,Android会启动一个jvm,即一个新的进程来执行,因此不同的apk运行在相互隔离的环境中。51Testing软件测试网|`E]I:WE:G

fa ?} O0  下图显示了:两个 Android 应用程序,各自在其自己的基本沙箱或进程上,他们是不同的Linux user ID。

wz'i,umjM iD {0

'Hw e7mQh0

  开发者也可以给两个应用程序分配相同的linux用户id,这样他们就能访问对方所拥有的资源。

V'FDy@'Fw0

  为了保留系统资源,拥有相同用户id的应用程序可以运行在同一个进程中,共享同一个jvm。51Testing软件测试网n!H'LD$\*znN

  如下图,显示了两个 Android 应用程序,运行在同一进程上。

o@ x&cb&x0

&i1@1Zm4E2_RX)l0

   不同的应用程序可以运行在相同的进程中。要实现这个功能,首先必须使用相同的私钥签署这些应用程序,然后必须使用 manifest 文件给它们分配相同的 Linux 用户 ID,这通过用相同的值/名定义 manifest 属性 android:sharedUserId 来做到。

.qq*?9?fcN3P7Y0

%W7lz Be0  Android进程的知识补充51Testing软件测试网k2~ a jxYn6k,Q

51Testing软件测试网`c#w-xTmb

  下图是标准的Android 架构图51Testing软件测试网6y!w(WA { R

51Testing软件测试网]rQix|3Jb?

  其中我们可以看到在“Android本地库 & Java运行环境层”中,Android 运行时中,51Testing软件测试网`8Ug%w#p#q+NP2|

  Dalvik是Android中的java虚拟机,可支持同时运行多个虚拟机实例;每个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例;

0ssLHg0

  所有java类经过java编译器编译,然后通过SDK中的dx工具转成.dex格式交由虚拟机执行。51Testing软件测试网/g})cWC,_

  Android系统进程51Testing软件测试网K T;f#j*FS-`

  init进程(1号进程),父进程为0号进程,执行根目录底下的init可执行程序,是用户空间进程

c,\pXpR \0

  ——-> /system/bin/sh51Testing软件测试网1D1Ho*Z9_![

  ——-> /system/bin/mediaserver

b k-w4N9K(H0f$I0

  ——-> zygote

}fTH~0

  —————–> system_server

,F [3xc5g0

  —————–>com.android.phone51Testing软件测试网;gP h\'s K7U

  —————–>android.process.acore(Home)51Testing软件测试网 QU1C6BY z WN%i

  … …

c F&aR!V W0

  kthreadd进程(2号进程),父进程为0号进程,是内核进程,其他内核进程都是直接或者间接以它为父进程

TXu7c#V h(XgP-lU0

  Android的单线程模型

~9LO*K&H2W(i7Rl0

  当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处 理。所以主线程通常又被叫做UI线程。

;x'hIY gf0

  在开发Android 应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。

g@kY V z1T7o0

  如果在非UI线程中直接操作UI线程,会抛出 android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views,这与普通的java程序不同。

B/xSX1j+~#?!h0

  由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒用户终止应用程序。51Testing软件测试网#eS(V F{(q(a5c I

  如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,因此android采用一种复杂的Message Queue机制保证线程间通信

z1c#{#d MU0

TAG:

 

评分:0

我来说两句

Open Toolbar