安卓笔记--系统架构

                                                安卓系统架构

1,Linux内核层:

 主要功能:

  ①,硬件驱动

  •  显示驱动(displayDriver):基于linux的帧缓冲(FrameBuffer)驱动。
  • 键盘驱动(KeyBoardDriver):作为输入设备的键盘驱动
  • Flash内存驱动(FlashMemoryDriver):基于MTD的flash驱动程序
  • 照相机驱动(CameraDriver):常用的基于Linux的v4l2(VideoforLinux)驱动。
  • 音频驱动(AudioDriver):常用的基于ALSA(AdvancedLinuxSoundArchitecture)的高级Linux声音体系驱动。
  • 蓝牙驱动(BluetoothDriver):基于IEEE802.15.1标准的无线传输技术。
  • WiFi驱动:基于IEEE802.11标准的驱动程序
  • Binder IPC驱动:Android的一个特殊的驱动程序,具有单独的设备节点,提供进程间通信的功能。
  • PowerManagement(电源管理):比如电池电量等。

 ②,内存管理

  1.     安卓内存管理机制                    

  •  Android系统内存分配和回收

            一个APP通常就是一个进程对应一个虚拟机:

                    GC只有在Heap剩余空间不够时才触发垃圾回收
                    GC触发时,所有线程都会被暂停(可能导致内存抖动)

  •     APP内存限制机制

                    不同设备分配的内存限制不同
                        吃内存大户:图片

                    切换应用时后台APP清理机制
                    APP切换的LRU cache:最近使用的APP最不可能被清理,onTrimMemory()回调

  •   监控内存的方法
                    Android方法
                    AS monitor工具 

    2.      Android内存优化方法      

  •  数据结构优化
            字符串拼接使用StringBuilder:时间和空间性能都极大优于String
            ArrayMap、SparseMap替换HashMap:时间和空间优化
            内存抖动:重复大量申请对象         

           注:再小的class会耗费0.5kb
                HashMap一个entry需要额外占用32b

  •  对象复用

            复用系统自带的资源
            listview、GridView复用
            避免在onDraw中创建对象(因为onDraw经常会调用,如果创建对象耗时、耗内存,会造成卡顿)

  • 避免内存泄漏:内存泄漏会导致可用内存越来越少,频繁造成GC

  1. 单例模式使用了Activity的context(单例对象常驻内存),应该使用Application的context
  2. 静态变量引用Activity、view等对象没有及时释放(静态变量常驻内存)
  3. 非静态内部类和匿名内部类会持有外部类(Activity)对象,因此内部类里不能有静态引用或耗时任务。否则不能用这两种内部类。
  4. Handler:message可能等待很长时间,在处理之前,message都持有handler引用,而handler持有Activity引用。导致泄漏。解决方式是将handler声明为静态,并将Activity的弱引用传给它。或者在Activity结束时同时移除message。
  5. 资源未关闭造成的内存泄漏,对于使用了BraodcastReceiver,ContentObserver,File,游标 Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。参考http://waylenw.github.io/Android/android-bitmap-memory-yh/

  • OOM优化

            当APP申请的内存空间大于系统为APP分配的空间时会出现OOM
            调整图像大小后再放入内存
            采用强引用+软引用2级缓存,提高加载性能
            及时回收图像
            不要创建过多的静态变量

③,系统进程管理       

       实现管理进程的创建与销毁,管理进程间的通信,解决与避免死锁问题等。
     Android系统的进程间通信基于Binder机制实现,一个进程可以非常方便地实现跨进程调用一个进程所提供的       功能,并获取返回的执行结果。

④,文件系统管理

        Android平台采用Yaffs2作为MTD nand flash文件系统,Yaffs2使用更小的内存来保存它的运行状态,其垃         圾回收机制非常简单快速,在大容量的NAND Flash上性能表现尤为突出。

⑤,电源管理

        Android电源管理,一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备           做了很多优化。

⑥,USB管理

        Android的USB驱动是基于Gaeget框架的,USB Gadget驱动是一个基于标准Linux USB gadget驱动框架           的设备驱动。

2,系统运行库层:官方的系统架构图中,位于Linux内核层之上的系统运行库层是应用程序框架的支撑,为Android系统中的各个组件提供服务。系统运行库层由系统类库和Android运行时构成。

  • 系统类库:系统类库大部分由C/C++编写,所提供的功能通过Android应用程序框架为开发者所使用。

  1. Surface Manager:执行多个应用程序时,管理子系统的显示,另外也对2D和3D图形提供支持
  2. MediaFramework:基于PacketVideoOpenCore的多媒体库,支持多种常用的音频和视频格式的录制和回放,所支持的编码格式包括MPEG4,MP3,H264,AAC,ARM
  3. SQLite:本地小型关系数据库,Android提供了一些新的SQLite数据库API,以替代传统的耗费资源的JDBC API
  4. OpenGL|ES:基于OpenGL ES 1.0API标准实现的3D跨平台图形库
  5. FreeType:用于显示位图和矢量字体
  6. WebKit:Web浏览器的软件引擎
  7. SGL:底层的2D图形引擎
  8. Libc(bionic l ibc):继承自BSD的C函数库bionic libc,更适合基于嵌入式Linux的移动设备
  9. SSL:安全套接层,是为网络通信提供安全及数据完整性的一种安全协议

        注:除上表列举的主要系统类库之外,Android NDK(Native Development Kit),即Android原生库,也十分重要。NDK为开发者提供了直接使用Android系统资源,并采用C或C++语言编写程序的接口。因此,第三方应用程序可以不依赖于Dalvik虚拟机进行开发。实际上,NDK提供了一系列从C或C++生成原生代码所需要的工具,为开发者快速开发C或C++的动态库提供方便,并能自动将生成的动态库和java应用程序一起打包成应用程序包文件,即.apk文件。
注意,使用原生库无法访问应用框架层API,兼容性可能无法保障。而且从安全性角度考虑,Android原生库用非类型安全的程序语言C,C++编写,更容易产生安全漏洞,原生库的缺陷(bug)也可能更容易直接影响应用程序的安全性

  • 运行时:Android运行时包含核心库和Dalvik虚拟机两部分。

  1. 核心库:核心库提供了Java5seAPI的多数功能,并提供Android的核心API,如android.os,android.net,android.media等。
  2. Dalvik虚拟机:Dalvik虚拟机是基于apache的java虚拟机,并被改进以适应低内存,低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离与线程调试管理,安全和异常管理,垃圾回收等重要功能。

Dalvik和标准Java虚拟机有以下主要区别:

  • Dalvik基于寄存器,而JVM基于栈。一般认为,基于寄存器的实现虽然更多依赖于具体的CPU结构,硬件通用性稍差,但其使用等长指令,在效率速度上较传统JVM更有优势。
  • Dalvik经过优化,允许在有限的内存中同时高效地运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,都拥有一个独立的Dalvik虚拟机实例。Android这种基于Linux的进程“沙箱”机制,是整个安全设计的基础之一。
  • Dalvik虚拟机从DEX(DalvikExecutable)格式的文件中读取指令与数据,进行解释运行。DEX文件由传统的,编译产生的CLASS文件,经dx工具软件处理后生成
  • Dalvik的DEX文件还可以进一步优化,提高运行性能。通常,OEM的应用程序可以在系统编译后,直接生成优化文件(.ODEX); 第三方的应用程序则可在运行时在缓存中优化与保存,优化后的格式为DEY(.dey文件)。

Dalvik与ART的工作原理差别

  • Dalvik在程序运行的过程中,dalvik虚拟机不断将字节码编译成机器码的工作。而ART是在应用程序安装的过程中,已经将字节码编译成机器码。
  • ART提高了应用程序的运行速率,同时也减少了手机电量的消耗,提高移动设备的续航能力,在垃圾回收机制也有了较大的提升。
  • ART模式安装需要消耗更多的时间,占更多的存储空间;

3,应用程序框架层

应用程序框架层提供开发Android应用程序所需的一系列类库,使开发人员可以进行快速的应用程序开发,方便重用组件,也可以通过继承实现个性化的扩展。

具体包括的模块如下:

  • 活动管理器(Activity Mananger):管理各个应用程序生命周期并提供常用的导航回退功能,为所有程序的窗口提供交互的接口
  • 窗口管理器(Window Manager):对所有开启的窗口程序进行管理
  • 内容提供器(Content Provider):提供一个应用程序访问另一个应用程序数据的功能,或者实现应用程序之间的数据共享
  • 视图系统(View System):创建应用程序的基本组件,包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons),还有可嵌入的web浏览器。
  • 通知管理器(Notification Manager):使应用程序可以在状态栏中显示自定义的客户提示信息
  • 包管理器(Package Manager):对应用程序进行管理,提供的功能诸如安装应用程序,卸载应用程序,查询相关权限信息等。
  • 资源管理器(Resource Manager):提供各种非代码资源供应用程序使用,如本地化字符串,图片,音频等
  • 位置管理器(Location Manager):提供位置服务
  • 电话管理器(Telephony Manager):管理所有的移动设备功能
  • XMPP服务:是Google在线即时交流软件中一个通用的进程,提供后台推送服务

4,应用层

Android平台的应用层上包括各类与用户直接交互的应用程序,或由java语言编写的运行于后台的服务程序。例如,智能手机上实现的常见基本功能 程序,诸如SMS短信,电话拨号,图片浏览器,日历,游戏,地图,web浏览器等程序,以及开发人员开发的其他应用程序。





猜你喜欢

转载自blog.csdn.net/qq_32329745/article/details/80647353