Android源码剖析之Framework层升级版(窗口、系统启动)


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

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

Android源码剖析之Framework层基础版

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

一、窗口的创建

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


此步骤优先启动Launcher,即桌面App,包含功能:HomeScreen、Widgets、壁纸、Apps、快捷方式、
文件夹,区别于其他应用在于它的intent-filter有一个android.intent.category.home
有很多公司也做这块的优化,相当于Window的桌面不好看,自己再做一个,如Nova、TouchWiz,以及
以华为为代表的桌面美图屏保等程序,主要用来更好的展示和管理手机应用,通过开启新Task启动应用程
序,即常见的将Intent装入程序包名,通过AMS判断的方法先生成ActvityThread,再生成ApplicationT
read,根据App资源的加载情况,由AMS判断并确定Activity的生命周期,由WMS将窗口绘制出来,两
者通过 Binder通信,即每个 Activity都有一个Token,可能是父类的,可能是自己的,反正它是Window
的,即ViewRoot。而Binder的优点,前两期也已经讲过,也可以看“Android进程通信方式”了解。

最终声明一个新的

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.javaSystemServer.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包


注:一个新进程的启动,是由Ams通过IPC调用,向SystemSever请求,调用Zygote进程fork出一个新进程。

 

 

 

 

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/597805

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。