android分析,android研究

Android 系统概览

本篇内容主要目的在从整体上了解Android 庞大的系统架构,根据系统架构中的不同模块和分层找到和梳理一条学习路径,这样能更好的切入到不同的模块学习,直到最后全部打通。

成都创新互联是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,微信平台小程序开发,十余年建站对成都木托盘等多个方面,拥有多年的网站推广经验。

接下来我们从两个角度来分析

下面这张图是Android官方提供的一张Android系统的预览图。

从上面这个图中我们可以知道,Android系统一共有5部分组成,他们分别是

从纵向层级架构的角度来看,我们了解了android系统经典5层结构,他们如垒砖一般纵向堆叠在一起。但是其实每一层都包含了大量的子模块子系统,并不能体现出Android整个系统的内部架构、运行机理,以及各个模块之间是如何衔接与配合工作的。接下来借鉴了gityuan总结的一张系统进程图,从系统进程的角度来看Android系统的工作原理。

Loader层: 引导kernel启动

Kernel层: Android内核空间

Native层: 进入用户空间

Framework层: 给app层提供api以及系统服务,

App层: 各种各样的应用程序apk

参考文献:

Android进阶 - 视图层级实时分析

在App运行过程中,我们的视图层级可能会由于用户的操作一直在发生改变,甚至可能会有一些出乎预料的变化,本文将会介绍 如何进行Android视图实时分析,分析View的视图层级及属性变化。

首先,笔者先来一个简单的Demo实例。我们使用Android Studio新建一个Empty Android工程,跑一下程序,界面如下图所示:

接下来,我们要对视图层级进行分析,但分析之前先给各位介绍两个视图分析工具。

1. Android SDK 中 tools 包下的 hierarchyviewer ,最终展现的视图效果如下:

2. Android Studio 也有自带的视图分析工具 Layout Inspector(布局检查器) ,打开方式如下图所示:

可以看到Layout Inspector最右侧的属性栏可以查看 每一个View的所附带的属性及属性值 。

从根视图开始分析视图层级,如下图所示:

DecorView的第一个子View(LinearLayout), 如下图所示:

DecorView的第二个子View(View),如下图所示:

DecorView的第三个子View(View),如下图所示:

至此,DecorView的最外层View全部分析完毕。

接下来,分析DecorView的第一个子View(LinearLayout),如下图所示:

ViewStub的属性信息,如下图所示:

FrameLayout的属性信息,如下图所示:

接下来,继续分析FrameLayout的子View,如下图所示:

ContentFrameLayout的视图属性,如下图所示:

ActionBarContainer的视图属性,如下图所示:

不过,还有个问题需要提醒一下, 不同机型,不同系统主题设置 生成的视图结构可能会不一样,举两个例子:

例一:笔者把使用的模拟器换成自己的手机(360N5 Android 6.0.1) ,运行后视图布局如下:

可以看到 笔者的手机是没有NavigationBar(底部导航栏)的 。

例二:笔者把Activity的主题"Theme.AppCompat.Light.DarkActionBar"换成无标题栏主题"Theme.AppCompat.Light.NoActionBar" ,运行后视图布局如下:

可以看到视图结构与我们之前分析的相比,发生了一些变化。

最后,还有个细节给各位补充下: Layout Inspector 只能分析出Android Studio当前 “正在运行的APP” 的视图布局结构,其他应用的视图布局结构是无法显示的。

如果我们想要分析一个第三方应用(如:微信、QQ)的视图结构可以使用 Android Device Monitor(安卓设备监视器) ,具体打开步骤如下图所示:

以QQ为例,我们先打开手机QQ,显示出QQ主界面,然后按照下图的 "红色圈选" ,依次点击,当前的视图结构就出来了,但是相比于 Layout Inspector 工具,视图属性信息提供的较少...

视图层级分析 到此结束,有时间再补篇源码,分析一下布局加载的流程。

写这篇文章的时候被IOS同事嘲讽了,它们吐槽Android的视图分析工具太渣,最后对比看了下,Android的视图分析工具确实没有IOS的高大上......╮(╯▽╰)╭

最后,秀一下IOS的视图分析工具 Reveal ,如下图所示:

Android 内核分析 bindler

上一次说了android的启动原理,这次说下android的进程间的通信。

linux 本身是提供了通信机制的。大概有7种左右。然后但是为什么android不用。反而要自己搞一套。主要分析到2个方面: 安全性 和性能。因为前期的移动手机性能不高。还有就是绕开Linux内核的开源限制。

总结就是----避免内核空间到数据接受端的直接的数据拷贝;数据接受端接收数据的时候,由于数据大小不确定,要么分配一个很大的空间装数据,要么动态扩容;两种方式都有问题;Binder使用mmap直接把接受端的内存映射到内存空间,避免了数据的直接拷贝;另外通过data_buffer等方式让数据仅包含定长的消息头,解决了接受端内存分配的问题.

android内部的进程间的通信都是通过binlder 来实现的。这个是很重要的一点。

我们面试问道的 aild Content Provider 调用拨打电话 Intent跳转 其底层都是调用的bindler机制.

关于binlder的运行原理 我只写一个大概。

在其底层的Linux中 /etc/bindler/ 有这个c 文件 就是binlder 的程序文件了。其内部是采用的引用计数器来为何对象。要知道 我们的bindler是支持多进程。如何一个service端要对应多个客户端 也就是说要实现多对多。在看内部源码的时候我发现其内部是用2个红黑树来维持 一个service 对专门提供一个客户端调用。如果还有其他的客户端调用就在生成一个servicebindler 对象来提供调用 然后根据内存管理的引用计数器来回收掉不需要的servicebindler对象。

如果你想深究 我推荐这个

Android UI 布局分析三大工具

一: HierarchyView 

老牌分析工具,在早期的SDK中是有快捷方式的,新版的找不到快捷方式了,后来找了很久才找到入口

首先找到Android Device Monitor

可以进入到sdk的安装目录下 从tools目录下点击monitor.bat 启动 Android Device Monitor

然后找到下图红框位置 点击 HierarchyView 按钮就可以打开 如果没有HierarchyView 按钮就点击DDMS按钮左边的更多按钮,里面会列出来HierarchyView 按钮

HierarchyView 最大的好处是以这种结构树图的方式展示ViewTree 能够一目了然的看清结构,并且可以评估绘制时间

但是在新的android版本里面 HierarchyView会提示找不到Service 遇到这种情况 参照如下文章解决

二:UI Automator

比较常见的工具,在很长一段时间内,找不到HierarchyView用的就是他,但是这个工具不是很好用,有时候显示的层级也不准,可能是我不太会用

入口如下图

点击红框处进入

三:Layout Inspector

入口

打开之后是这个样子

三种工具各有各的特点,大家可以根据自己的需求进行选择


当前标题:android分析,android研究
URL网址:http://ybzwz.com/article/dsschpe.html