Android系统启动流程
一,序言
Android是谷歌开发的一款基于Linux的开源操作系统,下图所示为 Android 平台的主要组件
Linux 内核
Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。
使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。
more >>Android是谷歌开发的一款基于Linux的开源操作系统,下图所示为 Android 平台的主要组件
Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。
使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。
more >>1 | system\core\roodir\init.rc: |
分析Android启动流程可知,Android启动时会解析init.rc,servicemanager 服务的孵化器的目录为/system/bin/servicemanager,在此目录下有service_manager.c、binder.c
more >>zygote是由init进程通过解析 init.zygote.rc 文件而创建的,zygote所对应的可执行程序app_process,所对应的源文件是 app_main.cpp ,进程名为zygote。
1 | // system/core/rootdir/init.zygote32.rc |
定义 | 作用 | |
---|---|---|
从机制、模型角度 | Binder是一种Android的实现跨进程通信(IPC)的方式(即Binder机制模型) | 在Android中实现跨进程通信 |
从模型的结构、组成角度 | Binder是一种虚拟的物理设备驱动(即Binder驱动) | 连接Service、Client和Service Manager进程 |
从Android代码的实现角度 | Binder是一个类,实现了IBinder接口(即Binder类) | 将Binder机制模型以代码的形式具体是现在Android中 |
Activity:只有分发dispatchTouchEvent和消费onTouchEvent两个方法。 事件由ViewRootImpl中DecorView dispatchTouchEvent分发Touch事件->Activity的dispatchTouchEvent()- DecorView。superDispatchTouchEvent->ViewGroup的dispatchTouchEvent()。 如果返回false直接掉用onTouchEvent,true表示被消费
拥有分发、拦截和消费三个方法。:对应一个根ViewGroup来说,点击事件产生后,首先会传递给它,dispatchTouchEvent就会被调用,如果这个ViewGroup的onInterceptTouchEvent方法返回true就表示它要拦截当前事件, 事件就会交给这个ViewGroup的onTouchEvent处理。如果这个ViewGroup的onInterceptTouchEvent方法返回false就表示它不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素的dispatchTouchEvent方法就会被调用。
more >>在前面Android-UI绘制流程及原理中我们了解到View的绘制流程三大步骤:测量,布局,绘制,我们接着去看他们每一步又干了什么事情
测量performMeasure
view.measure —> view.onMeasure —> view.setMeasuredDimension
—>setMeasuredDimensionRaw
布局performLayout
view.layout —> view.onLayout
绘制performDraw
ViewRootImpl.draw(fullRedrawNeeded) —> ViewRootImpl.drawSoftware
—>view.draw(Canvas)
对于基于栈的虚拟机来说,每一个运行时的线程,都有一个独立的栈。栈中记录了方法调用的历史,每有一次方法调用,栈中便会多一个栈桢。最顶部的栈桢称作当前栈桢,其代表着当前执行的方法。基于栈的虚拟机通过操作数栈进行所有操作。
more >>当前商业虚拟机的垃圾收集器,大多遵循“分代收集”的理论来进行设计,这个理论大体上是这么描述的:
1、 绝大部分的对象都是朝生夕死
2、 熬过多次垃圾回收的对象就越难回收。
根据以上两个理论,朝生夕死的对象放一个区域,难回收的对象放另外一个区域,这个就构成了新生代和老年代。
1、 新生代回收(Minor GC/Young GC):指只是进行新生代的回收。
2、 老年代回收(Major GC/Old GC):指只是进行老年代的回收。目前只有CMS垃圾回收器会有这个单独的收集老年代的行为。(Major GC定义是比较混乱,有说指是老年代,有的说是做整个堆的收集,这个需要你根据别人的场景来定,没有固定的说法)
3、 整堆收集(Full GC):收集整个Java堆和方法区(注意包含方法区)
more >>tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true