Android手机开机流程,Launcher/App/Activity启动流程,UI绘制流程,AMS/PMS,apk打包流程

 1.Android的三大核心功能:ams.java;wms.java;view.java。
 2.Android手机先开机,init/Zygote/SystemServer,然后启动Framework,然后启动Launcher;【安装APP(PMS),】然后启动APP(AMS)。所有的Android应用进程都是有Zygote进程fork出来的.

> Android手机开机流程,init/Zygote/SystemServer
## Android手机开机流程:
 1.启动电源以及系统启动,当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。 
 2.引导程序BootLoader,引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。 
 3.Linux内核启动,内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置,它首先在系统文件中寻找init.rc文件,并启动init进程。 
 4.init进程启动,初始化和启动属性服务,并且启动Zygote进程。 
 5.Zygote进程启动,创建JavaVM并为JavaVM注册JNI,创建服务端Socket,启动SystemServer进程。 
 6.SystemServer进程启动,启动Binder线程池和SystemServiceManager,并且启动各种系统服务。 
 7.Launcher启动,被SystemServer进程启动的ActivityManagerService会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。

— Android从Linux系统启动有4个步骤;
(1) init进程启动
(2) Native服务启动
(3) System Server,Android服务启动
(4) Home启动.

《Android手机开机流程,Launcher/App/Activity启动流程,UI绘制流程,AMS/PMS,apk打包流程》

## Android的init/Zygote/SystemServer

  Android手机先开机,init/Zygote/SystemServer,然后启动Framework,然后启动Launcher;【安装APP(PMS),】然后启动APP(AMS)。所有的Android应用进程都是有Zygote进程fork出来的。

Android系统启动流程(一)解析init进程- http://blog.csdn.net/itachi85/article/details/54783506
Android系统进程Zygote启动过程的源代码分析- http://blog.csdn.net/luoshengyang/article/details/6768304
Framework启动过程浅析- https://blog.csdn.net/xsf50717/article/details/47167989
Android系统默认Home应用程序(Launcher)的启动过程源代码分析- http://blog.csdn.net/luoshengyang/article/details/6767736
Android应用程序安装过程(PMS)源代码分析- http://blog.csdn.net/luoshengyang/article/details/6766010
Android应用程序进程启动过程(AMS)的源代码分析- http://blog.csdn.net/luoshengyang/article/details/6747696

PackageManagerService启动流程源码解析- http://blog.csdn.net/u012124438/article/details/54882771
Android内核解读-应用的安装过程- http://blog.csdn.net/singwhatiwanna/article/details/19578947
Android apk动态加载机制的研究- http://blog.csdn.net/singwhatiwanna/article/details/22597587

Android源码分析-资源加载机制- http://blog.csdn.net/singwhatiwanna/article/details/24532419
Android窗口管理服务WindowManagerService – http://blog.csdn.net/luoshengyang/article/details/8462738

— Android Fork进程,Fork Android App进程,Android 之 zygote 与进程创建。
  Android 的开机流程:init-> zygote-> system_service,这个很重要,学习这个过程,你可以学习到 Android 是一个分层的系统,对 Android 的整体架构会有了解。
  1. init->Zygote->SystemServer->启动App Activity;
  2. init-> Zygote->SystemServer-> AMS PMS等。

— 在android运行环境中,Zygote进程是所有虚拟机进程的父亲,Zygote进程在开机初始化的时候会创建一个虚拟机,AMS发消息给Zygote创建的时候实际上是copy一份虚拟机的实例在子进程中。同时在初始化的时候还会注册一些android核心Jni的库放在虚拟机实例内提供上层api调用。fork出的虚拟机会共享这些jni类库。 那么实际上XPosed就是在root后对替换/system/bin/app_process并将注入XposedBridge.jar。app_process是用来控制Zygote的,通过替换成修改后的 app_process可以使Zygote进程加载到我们的XposedBridege.jar。而这个库就是用来做动态Hook java代码造成劫持的。

认识Zygote- https://blog.csdn.net/xsf50717/article/details/51607176
  zygote主要用来孵化system_server进程和应用程序进程。在孵化出第一个进程system_server后通过runSelectLoopMode等待并处理消息,分裂应用程序进程仍由system_server控制。
  init 是 zygote的父进程, 而system_server和其他所有的com.xxx结尾的app应用程序都是从zygote fork 而来
  系统中的两个重要服务PackageManagerService和ActivityManagerService,都是由SystemServer进程来负责启动的,而SystemServer进程本身是Zygote进程在启动的过程中fork出来的。
  在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。
  Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制。

— 在android中,大部分的应用程序进程都是由zygote来创建的,为什么用大部分,因为还有一些进程比如系统引导进程、init进程等不是有zygote创建的。 在android中提到zygote,主要两块,一个是C/C++编写的zygote,主要用来为应用和SystemService fork进程的。一个是java编写的zygote接口,负责为应用和service调用C/C++ zygote的接口执行fork,从而创建VM进程。说明:在android中,service主要有NativeService和SystemService。SystemService主要是指系统中service,比如,InputMethodService、ActivityManagerService等。

— Android fork process
 1.在android中SystemService的启动是在Zygote进程创建好后进行的,并且由Zygote进程建立好DVM运行环境,加载ZygoteInit的main函数,最终调用Zygote的本地方法forkSystemServer,并执行linux的fork方法创建SystemServer进程。
 2.应用程序的进程也是由Zygote创建的,在ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用Zygote的native方法forkAndSpecialize,执行fork任务。
 3.应用进程和服务进程位于不同的进程中,他们之间是通过IPC进行数据传递的。

— Android内核解读-Android系统的开机启动过程- http://blog.csdn.net/singwhatiwanna/article/details/19302593
  SystemServer作为zygote孵化的第一个Dalvik进程,其孵化过程在上面已经进行了描述,但是其和普通进程的启动略有不同,普通进程由Zygote.forkAndSpecialize来启动,而SystemServer由Zygote.forkSystemServer来启动,其次是SystemServer内部多创建了一个socket客户端。

— Android源码解析之(八)–>Zygote进程启动流程- http://blog.csdn.net/qq_23547831/article/details/51104873
 init进程 –> Zygote进程 –> SystemServer进程 –>各种应用进程:
 1.init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程;
 2.Zygote进程:android系统的根进程,主要作用:可以作用Zygote进程fork出SystemServer进程和各种应用进程;
 3.SystemService进程:主要是在这个进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等等;
 4.各种应用进程:启动自己编写的客户端应用时,一般都是重新启动一个应用进程,有自己的虚拟机与运行环境;
 android系统中进程之间通讯的方式是Binder,但是有一个例外是SystemService进程与Zygote进程之间是通过Socket的方式进行通讯的。

  SystemServer进程主要的作用是启动各种系统服务,比如ActivityManagerService,PackageManagerService,WindowManagerService等服务,我们平时熟知的各种系统性的服务其实都是在SystemServer进程中启动的,而当我们的应用需要使用各种系统服务的时候其实也是通过与SystemServer进程通讯获取各种服务对象的句柄的进而执行相应的操作的。

> Android Launcher启动过程
Android系统启动流程(四)Launcher启动过程与系统启动流程- http://blog.csdn.net/itachi85/article/details/56669808
Android应用框架浅析- http://blog.csdn.net/yanbober/article/category/3206943
Launcher启动流程- http://blog.csdn.net/qq_23547831/article/details/51112031

《Android手机开机流程,Launcher/App/Activity启动流程,UI绘制流程,AMS/PMS,apk打包流程》

## Launcher的启动流程:
 1.Zygote进程 –> SystemServer进程 –> startOtherService方法 –> ActivityManagerService的systemReady方法 –> startHomeActivityLocked方法 –> ActivityStackSupervisor的startHomeActivity方法 –> 执行Activity的启动逻辑,执行scheduleResumeTopActivities()方法。。。。
 2.因为是隐士的启动Activity,所以启动的Activity就是在AndroidManifest.xml中配置catogery的值为:
 public static final String CATEGORY_HOME = “android.intent.category.HOME”;
可以发现android M中在androidManifest.xml中配置了这个catogory的activity是LauncherActivity,所以我们就可以将这个Launcher启动起来了
 3.LauncherActivity中是以ListView来显示我们的应用图标列表的,并且为每个Item保存了应用的包名和启动Activity类名,这样点击某一项应用图标的时候就可以根据应用包名和启动Activity名称启动我们的App了。

> 安装APP包的流程
PMS 解析Manifest流程:Zygote进程 –> SystemServer进程 –> PackgeManagerService服务 –> scanDirLI方法 –> scanPackageLI方法 –> PackageParser.parserPackage方法;

> UILoop消息线程
  UI线程的ActivityTread中的Main方法已经使用Looper.prepareMainLooper为该线程添加了Looper对象,即已经为该线程创建了消息队列MQ,而普通线程Thread只是一个裸线程而已(可以联想一下AsyncTask将普通线程变为LOOP线程的过程)。从ActivityThread的Main()——>ActivityThread—– UILoop循环处理:
(1)首先ActivityThread的Main()执行,调用调用prepareMainLooper()为UI线程创建消息队列(MessageQueue),
(2)然后创建一个ActivityThread对象,期间会创建俩个对象Handler(处理消息队列),ApplicationThread(Binder)对象(接收远程Ams的IPC调用)
(3)UI主线程调用Looper.loop()进入消息循环体,当接收到Ams发送start某个Activity后将会创建指定的Activity对象,Actvity又会依次创建创建PhoneWindow类,DécorView类,创建View/ViewGroup
(4)最后调用WindowManager类(创建好的界面显示到屏幕)

> 点击Logo启动APP(AMS,ActivityThrad)
   ActivityThrad创建进程,fork进程的复制,SystemThread? ActivityThread和ApplicationThread?
 在android.app包下有Instrumentation这个类,这个类没有继承和实现其它的任何类,也没被其它的类继承.会在应用的任何代码执行前被实列化,用来监控系统组件与应用的交互过程,其实就是很多操作封装一下,由它来完成实现. Instrumentation另一个重要作用是提供Android组件单元测试.   
 每一个应用进程中只有唯一的Instrumentation, 在ActivityThread中成员变量Instrumentation mInstrumentation,通过方法public Instrumentation getInstrumentation()来获得.

— Binder
 ActivityManagerProxy与ActivityManagerService是一对Binder;ApplicationThread与ActivityThreadProxy是一对Binder.
 App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信。
 在Android系统中,任何一个Activity的启动都是由AMS和应用程序进程(主要是ActivityThread)相互配合来完成的。AMS服务统一调度系统中所有进程的Activity启动,而每个Activity的启动过程则由其所属的进程具体来完成。 

## App启动流程
 1.通过 Launcher 启动应用时,点击应用图标后,Launcher 调用 startActivity 启动应用。
 2.Launcher Activity 最终调用 Instrumentation 的 execStartActivity 来启动应用。
 3.Instrumentation 调用 ActivityManagerProxy (ActivityManagerService 在应用进程的一个代理对象) 对象的 startActivity 方法启动 Activity。
 4.到目前为止所有过程都在 Launcher 进程里面执行,接下来 ActivityManagerProxy 对象跨进程调用 ActivityManagerService (运行在 system_server 进程)的 startActivity 方法启动应用。
 5.ActivityManagerService 的 startActivity 方法经过一系列调用,最后调用 zygoteSendArgsAndGetResult 通过 socket 发送给 zygote 进程,zygote 进程会孵化出新的应用进程。
 6.zygote 进程孵化出新的应用进程后,会执行 ActivityThread 类的 main 方法。在该方法里会先准备好 Looper 和消息队列,然后调用 attach 方法将应用进程绑定到 ActivityManagerService,然后进入 loop 循环,不断地读取消息队列里的消息,并分发消息。
 7.ActivityManagerService 保存应用进程的一个代理对象,然后 ActivityManagerService 通过代理对象通知应用进程创建入口 Activity 的实例,并执行它的生命周期函数。

《Android手机开机流程,Launcher/App/Activity启动流程,UI绘制流程,AMS/PMS,apk打包流程》
 
— Android应用程序启动过程:
 1.Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;
 2.ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
 3.Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;
 4.ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
 5.ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。

— App启动流程,Android应用内多进程分析和研究
图文浅析APK程序运行的过程- https://blog.csdn.net/xsf50717/article/details/47214173

— Android Application与其他移动平台有两个重大不同点:
 1.每个Android App都在一个独立空间里, 意味着其运行在一个单独的进程中, 拥有自己的VM, 被系统分配一个唯一的
user ID.
 2.Android App由很多不同组件组成, 这些组件还可以启动其他App的组件. 因此, Android App并没有一个类似程序入口
的main()方法.

ActivityStackSupervisor->ActivityManagerService:startProcessLocked(.)
ActivityManagerService->ActivityManagerService:startProcessLocked(..)
ActivityManagerService->Process:start()

Process->Process:startViaZygote()
Process->Process:zygoteSendArgsAndGetResult()
Process->ZygoteInit:socket

ZygoteInit->ZygoteInit:runSelectLoop()
ZygoteInit->ZygoteConnection:runOnce()
ZygoteConnection->ZygoteConnection:handleChildProc()
ZygoteConnection->RuntimeInit:zygoteInit()

RuntimeInit->RuntimeInit:applicationInit()
RuntimeInit->RuntimeInit:invokeStaticMain()
RuntimeInit->ActivityThread:main()

ActivityThread->ActivityThread:attach()
ActivityThread->ActivityManagerService:attachApplication()
ActivityManagerService->ActivityManagerService:attachApplicationLocked()
ActivityManagerService->ActivityStackSupervisor:attachApplicationLocked()
ActivityStackSupervisor->ActivityManagerService:realStartActivityLocked()

《Android手机开机流程,Launcher/App/Activity启动流程,UI绘制流程,AMS/PMS,apk打包流程》

> Activity启动过程全解析- https://blog.csdn.net/tenggangren/article/details/50925740
 App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信。一个App的程序入口到底是什么?是ActivityThread.main()。
 1.ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期
 2.ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作
 3.ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。
 4.ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该ApplicationThreadProxy代理与ActivityThread进行通信的
 5.Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
 6.ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
 7.ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
 8.TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。

> UI绘制流程,Activity、Dialog、PopupWindow等
— android系统的事件分发流程分为很多部分:
 Native层 –> ViewRootImpl层 –> DecorView层 –> Activity层 –> ViewGroup层 –> View层。

    其实Toast窗口和Activity、Dialog、PopupWindow有一个不太一样的地方,就是Toast窗口是属于系统级别的窗口,他和输入框等类似的,不属于某一个应用,即不属于某一个进程,所以自然而然的,一旦涉及到Toast的加载绘制流程就会涉及到进程间通讯,看过前面系列文章的同学应该知道,Android间的进程间通讯采用的是Android特有的Binder机制,所以Toast的加载绘制流程也会涉及到Binder进程间通讯。Toast的显示流程其实内部还是通过Window的窗口机制实现加载绘制的,只不过由于是系统级别的窗口,在显示过程中涉及到了进程间通讯等机制。显示控件包括:Dialog/PopupWindow/Toast的加载绘制流程;
  Fragment并不是一个显示控件,而只是一个显示组件.  

Android中MotionEvent的来源和ViewRootImpl- http://blog.csdn.net/singwhatiwanna/article/details/50775201
ActivityManager.RunningServiceInfo的使用- http://blog.csdn.net/wirelessqa/article/details/8152658
Android 源码解析 之 setContentView- http://blog.csdn.net/lmj623565791/article/details/41894125
Android LayoutInflater深度解析,给你带来全新的认识- http://blog.csdn.net/lmj623565791/article/details/38171465
Android AsyncTask 源码解析- http://blog.csdn.net/lmj623565791/article/details/38614699
android源码解析- http://blog.csdn.net/qq_23547831/article/category/5910787
老罗的Android之旅- http://blog.csdn.net/Luoshengyang/article/list/1

> Android消息类型及事件分发流程
## 消息类型
  用户消息类型指Wms将硬件物理消息转化成统一格式消息,分为三类:按键消息、触摸消息和轨迹球消息(此消息API的Demo中可见,游戏中比较常见)。而消息的组成由以下三项:Action(上和下)、KeyCode(键代码0-9a-z)、Repeat(重复次数)。
  消息先由DecorView处理,如果不处理,则分发到下面的ViewGroup和View;如果还没处理则上传给PhoneWindow,最后给Activity.
  另外关于消息传递,通过InputDispatcherThread来执行,由InputReader读取,通过InputChannel,由InputDispatcher来传递,
  最后调用ViewRoot的dispatchMotion和dispatchKey来传递给页面。
  Binder传输性能高、安全性高、CS架构,通信由Client、ServiceManger、Binder驱动和Server组成,只有驱动在内核空间,其他均在用户空间。Android 系统是事件驱动的,所以这个 Looper 是用来接收应用事件的.

## Acitivty中的事件分发流程:
 1.ViewRootImpl层的事件分发会首先调用Activity的dispatchTouchEvent方法;
 2.Activity的dispatchTouchEvent方法中会通过Window.superDispatchTouchEvent方法将事件传递给DecorView即ViewGroup。
 3.若window的superDispatchTouchEvent方法返回true,则事件分发完成,Activity的dispatchTouchEvent直接返回为true,否则的话调用Activity的onTouchEvent方法,并且Acitivty的dispatchTouchEvent返回值与Activity的onTouchEvent返回值一致。

Android View系统解析(上)- http://blog.csdn.net/singwhatiwanna/article/details/38168103
Android View系统解析(下)- http://blog.csdn.net/singwhatiwanna/article/details/38426471

 — View的绘制流程包含了测量大小,测量位置,绘制三个流程;
Activty的界面绘制是从mDector即根View开始的,也就是从mDector的测量大小,测量位置,绘制三个流程;
View体系的绘制流程是从ViewRootImpl的performTraversals方法开始的;
View的测量大小流程:performMeasure –> measure –> onMeasure等方法;
View的测量位置流程:performLayout –> layout –> onLayout等方法;
View的绘制流程:performDraw –> draw –> onDraw等方法;

 — View组件分发触摸事件的时候:
 1.View控件会首先执行dispatchTouchEvent方法。
 2.View控件在dispatchTouchEvent方法中先执行onTouch方法,后执行onClick方法。
 3.View的onTouch返回false或者mOnTouchListener为null(控件没有设置setOnTouchListener方法)或者控件不是enable的情况下会调运onTouchEvent,dispatchTouchEvent返回值与onTouchEvent返回一样。
 4.View控件不是enable的,那么即使设置了onTouch方法也不会执行,只能通过重写控件的onTouchEvent方法处理,dispatchTouchEvent返回值与onTouchEvent返回一样。
 5.如果控件(View)是enable且onTouch返回true情况下,dispatchTouchEvent直接返回true,不会调用onTouchEvent方法。
> apk打包流程

Android 打包过程- https://www.jianshu.com/p/7c288a17cda8

流程: aapt-> aidl -> javac-> dx(dex)-> apkbuilder-> jarsigner-> zipalign 

《Android手机开机流程,Launcher/App/Activity启动流程,UI绘制流程,AMS/PMS,apk打包流程》

    原文作者:desaco
    原文地址: https://blog.csdn.net/ShareUs/article/details/54864684
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞