您的位置:首页 > 移动开发 > Android开发

Android源码/框架源码分析及Actviity/View等的启动流程

2017-02-04 17:49 393 查看
> Android源码下载以及编译自己的ROM- http://blog.csdn.net/innost/article/details/6885968
白话Android底层- http://blog.csdn.net/dd864140130/article/category/2745273
Android 修改framework实现 全局唯一launcher- http://blog.csdn.net/zhbinary/article/details/7353300
Android Framework- http://blog.csdn.net/a345017062/article/category/758727/2
Android进阶- http://blog.csdn.net/itachi85/article/category/6076559
Android框架层- http://blog.csdn.net/itachi85/article/category/955875
Android进阶- http://blog.csdn.net/itachi85/article/category/6076559
Android系统源码目录- http://blog.csdn.net/itachi85/article/details/54695046
android(lanucher)- http://blog.csdn.net/sdvch/article/category/1825653
Android框架分析- http://blog.csdn.net/jdsjlzx/article/category/1087481
android 通话记录的增删改查-http://blog.csdn.net/jdsjlzx/article/details/12492787

Android 短信模块-http://blog.csdn.net/t12x3456/article/category/1648993

Android Launcher开发- http://blog.csdn.net/t12x3456/article/category/1649039
> 学习源码的执行流程而不纠结于细节.Google是如何在Java的基础上加上Android的特性的,你能够理解Context被叫做“环境”的原因。优秀开源项目的代码风格和设计理念.

有没有必要阅读ANDROID源码- https://zhuanlan.zhihu.com/p/20563936?columnSlug=kaede%E3%80%81
> Android源码分析-Activity的启动过程- http://blog.csdn.net/singwhatiwanna/article/details/18154335
Android内核解读-Android系统的开机启动过程- http://blog.csdn.net/singwhatiwanna/article/details/19302593 SystemServer作为zygote孵化的第一个dalvik进程,其孵化过程在上面已经进行了描述,但是其和普通进程的启动略有不同,普通进程由Zygote.forkAndSpecialize来启动,而SystemServer由Zygote.forkSystemServer来启动,其次是SystemServer内部多创建了一个socket客户端。

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 View系统解析(上)- http://blog.csdn.net/singwhatiwanna/article/details/38168103
Android View系统解析(下)- http://blog.csdn.net/singwhatiwanna/article/details/38426471
Android中MotionEvent的来源和ViewRootImpl- http://blog.csdn.net/singwhatiwanna/article/details/50775201
Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用- http://blog.csdn.net/wirelessqa/article/details/8152658
Android应用框架浅析- http://blog.csdn.net/yanbober/article/category/3206943 使用Android Studio导入源码- http://blog.csdn.net/yanbober/article/details/48846331
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/jingwen3699/article/category/1235730
老罗的Android之旅- http://blog.csdn.net/Luoshengyang/article/list/1
Android系统启动流程(一)解析init进程- http://blog.csdn.net/itachi85/article/details/54783506
android源码解析- http://blog.csdn.net/qq_23547831/article/category/5910787
Android窗口管理服务WindowManagerService - http://blog.csdn.net/luoshengyang/article/details/8462738
》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启动流程- http://blog.csdn.net/qq_23547831/article/details/51112031
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了。

解析Manifest流程:Zygote进程 –> SystemServer进程 –> PackgeManagerService服务 –> scanDirLI方法 –> scanPackageLI方法 –> PackageParser.parserPackage方法;

View的绘制流程包含了测量大小,测量位置,绘制三个流程;

Activty的界面绘制是从mDector即根View开始的,也就是从mDector的测量大小,测量位置,绘制三个流程;

View体系的绘制流程是从ViewRootImpl的performTraversals方法开始的;

View的测量大小流程:performMeasure –> measure –> onMeasure等方法;

View的测量位置流程:performLayout –> layout –> onLayout等方法;

View的绘制流程:onDraw等方法;

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

android源码的地址:https://github.com/android 

在Android中自定义捕获Application全局异常- http://blog.csdn.net/qq_23547831/article/details/41725069
显示控件包括:Dialog/PopupWindow/Toast的加载绘制流程;

Fragment并不是一个显示控件,而只是一个显示组件.

Android framework源码-  https://github.com/android/platform_frameworks_base

android源码解析- http://blog.csdn.net/qq_23547831/article/category/5910787
【Android 系统编译】- http://blog.csdn.net/sbsujjbcy/article/category/5732705
------------------------

> android系统的事件分发流程分为很多部分:

 Native层 –> ViewRootImpl层 –> DecorView层 –> Activity层 –> ViewGroup层 –> View层

> 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返回值一致。

> 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方法。

-------------------------

 Android源码剖析- http://blog.csdn.net/liuxian13183/article/category/2152897
 Android系统启动流程(四)Launcher启动过程与系统启动流程- http://blog.csdn.net/itachi85/article/details/56669808 > 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启动

  用户消息类型指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 是用来接收应用事件的.

Android 动态代理以及利用动态代理实现 ServiceHook- http://blog.csdn.net/self_study/article/details/55050627
> APK启动流程:

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 的实例,并执行它的生命周期函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: