Android进程的知识补充

  下图是标准的Android 架构图

  其中我们可以看到在“Android本地库 & Java运行环境层”中,Android 运行时中,

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

  所有java类经过java编译器编译,然后通过SDK中的dx工具转成.dex格式交由虚拟机执行。

  Android系统进程

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

  ——-> /system/bin/sh

  ——-> /system/bin/mediaserver

  ——-> zygote

  —————–> system_server

  —————–>com.android.phone

  —————–>android.process.acore(Home)

  … …

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

  Android的单线程模型

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

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

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

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

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