理解Android进程创建流程
理解Android进程启动之全过程

站在GITYUAN大神的肩膀上学习,用一张神图表示进程基本的启动流程.

93730-5121eb1d162d109e.png
上图还需对照源码进行查看,简述一下启动流程


在 Android系统全貌描述到了Zygote孵化了第一个进程是system_server进程,而且孵化第一个App进程是Launcher,也就是桌面App。


当点击 桌面App的时候,发起进程就是 Launcher所在的进程,启动远程进程,利用 Binder发送消息给 system_server进程


system_server进程中启动了N多服务,例如 ActiivityManagerService,WindowManagerService等。启动进程的操作会先调用 AMS.startProcessLocked方法,内部调用 Process.start(android.app.ActivityThread);而后通过 socket通信告知 Zygote进程fork子进程,即app进程。进程创建后将 ActivityThread加载进去,执行 ActivityThread.main()方法。


app进程中, main方法会实例化 ActivityThread,同时创建 ApplicationThread,Looper,Hander对象,调用 attach方法进行 Binder通信, looper启动循环。 attach方法内部获取 ActivityManagerProxy对象,其实现了 IActivityManager接口,作为客户端调用 attachApplication(mAppThread)方法,将 thread信息告知 AMS


system_server进程中, AMS中会调用 ActivityManagerNative.onTransact方法,真正的逻辑在服务端 AMS.attachApplication方法中,内部调用 AMS.attachApplicationLocked方法,方法的参数是 IApplicationThread,在此处是 ApplicationThreadProxy对象,用于跟前面通过 Process.start()所创建的进程中 ApplicationThread对象进行通信。
attachApplicationLocked方法会处理 Provider, Activity, Service, Broadcast相应流程,调用 ApplicationThreadProxy.bindApplication方法,通过 Binder通信,传递给 ApplicationThreadNative.onTransact方法。

app进程中,真正的逻辑在ActivityThread.bindApplication方法中。bindApplication方法的主要功能是依次向主线程发送消息H.SET_CORE_SETTINGS 和H.BIND_APPLICATION。后续创建Application,Context等。Activity的回调也会是通过Binder通信,然后发送不同消息处理。
.

更多相关文章

  1. Android之单元测试
  2. Android开发---为按钮添加事件的三种方法
  3. AndroidStudio 报 Error:Execution failed for task ':app:proce
  4. Android之设置EditText输入类型(setInputType()方法和android:in
  5. Android的异步(Thread、Handler、AsyncTask)
  6. [Android] Android中将一个图片切割成多个图片
  7. Android不完全退出主Activity的方法
  8. Android延长Toast的时间以及自定义Toast
  9. android触摸事件处理流程

随机推荐

  1. 修改eclipse android 默认debug 签名
  2. 《Android开发从零开始》——9.Activity
  3. Android NullPointerException解决方法
  4. 10个android开源项目
  5. 十大Android IDE工具和应用
  6. Android开发平台Android Studio学习之一(
  7. 【原创】Android锁定横竖屏、splash,全屏
  8. Android常用的基本控件
  9. Android -- 图像处理(信息量超大)
  10. Android中Intent习惯用法