本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

看本篇文章之前,建议先查看:

Android源码剖析之Framework层基础版

前面讲了framework的整体层次和基础定义与服务,接下来我们讲讲窗口的创建,底层与应用层界面的交互和管理。

一、窗口的创建

上一篇我们讲了三种窗口的类型,本篇接着讲窗口的创建过程,拿Activity创建窗口为例

最终声明一个新的

ViewRootImpl来承载新的View,

执行setView方法,将给mPanelParentWindowToken赋值(窗口

是接收用户消息的最小单元,窗口可能是

Acitivity,也可能是一个单独的view,每个窗口都有一个单独的windowManager,实现类是LocalWindowManager,

而Activity的window也会有父window存在,仅限于tabActivity

),

然后重绘

默认窗口会从配置文件中获取theme信息和其他底层设置信息,以及xml信息,默认构造一个decorView,所有应用

类窗口的最顶层View都是DecorView

子窗口:如上所述,例tabActivity

Dialog:如上所述,在show方法执行时,才完成窗口创建,Wms控制显示,避免加载过多资源,超过5秒出现ANR

PopupWindow:子窗口,依赖父类,执行showAtLocation和showAsDropDown展示到界面上

Toast:系统窗口,一般不可由应用窗口创建(三者除外,type_toast、type_inputmethod、type_wallpaper),

因为PhoneWindowManger调用checkAddPermission方法里,将三者除去

只有实现PhoneWindow的窗口,默认会监听物理按键,否则需要自己再进行定义和实现

要添加一个手机屏幕上的按钮如腾讯手机管理的小火箭,需要系统窗口权限(一般要在Service中完成)

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW">

第二,需要指定一个合适的token。如果是acitivty的父类,则页面关闭就直接关闭浮层,mWindowToken也一样,

理论上添加一个手机页面token或空token(无父类),则直接展示而不受外界影响。

二、Framework的启动过程-系统启动过程

图片已经在上一篇放过,过程展示的也比较详细,本篇再讲一些细节。此时有必要再贴几张图,以Nexus5为例

可以结合上篇文章,查看手机系统展示出来的内存卡和SD卡上的文件,使用工具:Resource Explorer

在上图可以看到init.rc文件,linux系统启动时,主要的配置指令就是在它里面,包括把zygote程序加入系统

每个应用都是一个虚拟机

每个虚拟机都会加载系统早已加载的共享类和资源

虚拟机中有一些可执行文件,举例三种:

1、dalvikvm:dalvik目录下,创建一个虚拟机,并执行参数指定的Java类

2、dvz:dalvik目录下,从zygote进程孵化出一个新的进程,已然共享资源(PS:应用入口是ActivityThread)

3、app_process:frameworks目录下,使用dalvikvm来启动ZygoteInit.java和SystemServer.java两个类

而虚拟机执行的方法,基本都以c语言的方式实现,例获得进程id

socket触发数据读操作有两种办法,一是监听某端口,二是监听某文件,android默认是后者

虚拟机栈大小默认512M,超过报栈溢出异常

preload-classes(预装app)封装在framework.jar中,使用classloader加载

preload-resources(预装资源)同样在上面jar里,使用preloadResources完成,子方法是drawable和color

进程启动包括3个过程

1、内核创建进程数据结构-代表要启动的123……顺序执行以及前后置条件

2、调用程序装载器,读取代码到预定地址

3、装载完毕,内核运行指定进程-如执行launcher加载桌面

启动SystemServer

执行ZygoteInit.java里的init方法初始化数据之后,即执行startSystemServer方法,关键代码有三

1、定义启动进程相关信息,用数据承载,并装载SystemServer.java

2、调用forkSystemServer从zygote进程孵化新进程

3、执行SystemServer.java类

SystemServer类中包括大量系统服务,可谓神经中枢,举例几个

PowerManagerService、ActivityManagerService、TelephonyRegistry(注册响应电话)、PackageManagerService、AccountManagerService(联系人账户)、ContentService(contentProvider)、

BatteryService、LightsService(光感应器)、VibratorService(震动感应器)、AlarmManagerService、

WindowManagerService、BluetoothService、DevicePolicyManagerService(系统设置)、ClipboardService、

StatusBarManagerService(状态栏)、InputMethodManagerService、NetStatService(网络状态4G、wifi)、

NetworkManagerSerivce、ConnectivityService(网络连接)、LocationManagerService、SerachManagerService、

WallpaperManagerService、AudioSerive、BackupManagerService、AppWidgetService等;还可以将厂商开发的软件服务写入底层,这也就是厂商固件

当然这些都常见而且重要,接下来我们先讲WMS和AMS,其他慢慢再讲;启动服务的方式有3种:

1、使用构造函数

2、单例模式

3、从服务类main方法开启

最后一句,启动Activity,因为所有的资源已经初始化,apk已经装载,其信息也已经注册,如果自启动一个应用的话,系统可以写入,通过Ams发一个intent请求包含CATEGORY_HOME这样的action,差异化来的请求系统默认页面。

举例:

$ adb push E:\Door\3.4\Che\build\outputs\apk\che_manager@anzhi.apk /data/local/tmp/com.che.manager

代表将apk安装包从电脑push到手机的过程
$ adb shell pm install -r "/data/local/tmp/com.che.manager"

代表将apk安装包安装(解压)到目录的过程

$ adb shell am start -n "com.che.manager/com.che.manager.activity.SplashActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHERI

代表启动apk包中主类的过程
/InstantRun: Instant Run Runtime started. Android package is com.che.manager, real application class is com.che.manager.application.Application.

代表启动应用Application的过程

I/MultiDex: VM with version 2.1.0 has multidex support
I/MultiDex: install
I/MultiDex: VM has multidex support, MultiDex support library is disabled.

代表build已经支持multiDex,则不需要再导入com.android.support:multidex包

Android源码剖析之Framework层升级版(窗口、系统启动)的更多相关文章

  1. Android源码剖析之Framework层基础版(窗口、linux、token、Binder)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMang ...

  2. Android源码剖析之Framework层进阶版(Wms窗口管理)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 上一篇我们主要讲了Ams,篇幅有限,本篇再讲讲Wms,即WindowManagerService,管 ...

  3. Android源码剖析之Framework层实战版(Ams管理Activity启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 讲到实战,就不得不拿两个例子来说明,本篇想拿的是应用最广泛的两个:Ams和Wms,一个管理activ ...

  4. Android源码剖析之Framwork层后记篇(硬件消息传递、apk管理、输入法框架、编译过程)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 既然写到后记篇,就代表本系列到此为止,暂时告一段落:其他一些Manager随后有时间再补,就像源码的 ...

  5. Android源码剖析之Framwork层消息传递(Wms到View)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 前面讲过Wms.Ams与Activity的一系列交互,包括创建过程.消息传递.窗口展示等,紧接上篇介 ...

  6. android 源码编译及其运行模拟器相关问题记录

    最近一直在看android源码相关的文档,包括编译源码,还有framework层的代码,本人很懒,一直没有写博客,今天想自己在编译一下源码,并且运行在模拟器中. 源码的版本不同,需要的jdk可能也有所 ...

  7. Android源码解析系列

    转载请标明出处:一片枫叶的专栏 知乎上看了一篇非常不错的博文:有没有必要阅读Android源码 看完之后痛定思过,平时所学往往是知其然然不知其所以然,所以为了更好的深入Android体系,决定学习an ...

  8. android源码framework下添加新资源的方法

    编译带有资源的jar包,需要更改frameworks层,方法如下: 一.增加png类型的图片资源 1.将appupdate模块所有用到的png格式图片拷贝到framework/base/core/re ...

  9. Android源码分析(五)-----如何从架构师的角度去设计Framework框架

    一 : 架构与程序 软件架构是一种思维方式,而程序只是实现思维方式的一种手段,代码固然重要,但是若没有整体的思维架构,一切程序都如水中浮萍. 二 : 框架如何设计 暂时抛开Android Framew ...

随机推荐

  1. JavaScript------事件委托(event delegation)

    简单的说,事件委托(event delegation)是在DOM上层(也就是在触发事件的元素的父元素上)定义事件的处理程序,而不是定义在触发事件的元素本身上. 首先我们来举这样一个例子:我有N个li元 ...

  2. 使用C#导出MSSQL表数据Insert语句,支持所有MSSQL列属性

    在正文开始之前,我们先看一下MSSQL的两张系统表sys.objects . syscolumnsMSDN中 sys.objects表的定义:在数据库中创建的每个用户定义的架构作用域内的对象在该表中均 ...

  3. 简单几何(凸包+枚举) POJ 1873 The Fortified Forest

    题目传送门 题意:砍掉一些树,用它们做成篱笆把剩余的树围起来,问最小价值 分析:数据量不大,考虑状态压缩暴力枚举,求凸包以及计算凸包长度.虽说是水题,毕竟是final,自己状压的最大情况写错了,而且忘 ...

  4. Html - a标签如何包裹Div

    a标签如何包裹Div? 其实应该将思路转变为将a标签作为一个遮罩来覆盖div. 做法是将a标签放置在该div下,通过将div进行相对定位[position:relative] 将a标签进行绝对定位[p ...

  5. 是否采用Sybase形式的自动字符串转义(用 '' 表示 ')

    ;; 关于php.ini ;; ; 这个文件必须命名为'php.ini'并放置在httpd.conf中PHPINIDir指令指定的目录中. ; 最新版本的php.ini可以在下面两个位置查看: ; h ...

  6. 利用openSSL 生成RSA公钥和密钥

    安装openssl for Windows. 之后开管理员控制台,打开openSSL 我的是 C:\OpenSSL-Win32\bin\openssl.exe 生成1024位的私钥,不指定的话默认20 ...

  7. Java类型相互转换byte[]类型,blob类型

    在我们的程序开发当中,经常会用到java.sql.Blob.byte[].InputStream之间的相互转换,但在JDK的API当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们 ...

  8. OpenCV学习笔记——多种Smooth平滑处理

    opencv库提供了好几种模糊平滑Smooth操作的类型作为cvSmooth的参数传入,从而达到不同的平滑效果,另外复习了一下如何复制一份图像和重新调整图像大小. 调整图像大小目前是按照一下步骤进行: ...

  9. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  10. spring boot结合thymeleaf

    1.在pom文件中加入thymeleaf相关的依赖 spring-boot-starter-thymeleaf 2.在resource文件夹下创建 template文件夹,在template文件夹中创 ...