android系统源码--HAL和智能指针

HAL在android系统中,被称为android硬件抽象层模块。

作用:  把android系统分为两层。  它向下屏蔽硬件驱动模块的实现细节,向上提供硬件访问服务。其中一层实现在用户空间中,另一层实现在内核空间中,传统的Linux系统把硬件的支持完全实现在内核空间中。

   主要是用来维护硬件厂家的利益,不需要把源码公开,只需要提供访问路径就可以。

硬件的实现是通过C来写的。个人不懂C代码,具体细节也没有看,大概看了一下流程,应用程序框架层使用java写的,java和C调用通过JNI来调用。

而android系统的硬件访问服务通常运行在系统进程System中,而是用这些硬件访问服务的应用程序运行在另外的进程中,所以应用程序需要通过进程间通信机制来访问这些硬件服务,即在android系统中通过AIDL来实现通信。

 

智能指针:

  android系统的应用程序框架层中,有相当一部分代码是使用C++语言开发的。C++最容易出现错误的就是指针,C++指针使用不当,轻则造成内存泄漏、重则造成系统崩溃。那为什么还要使用C++写呢?全部用java来写不就好了吗?出于性能的考虑,有时候还是不得不使用C++代码。在无法避免使用C++的前提下,Android系统为我们提供了智能指针。

  可以用引用计数来解决C++指针问题,指针指向一个对象时,引用计数+1.指针不在指向对象时,引用计数-1;考虑这样一个场景,两个对象A和B,A引用了B,B引用了A,当A不再引用B的时候,把A回收,但B在引用A,所以A释放不了。反之B也释放不了,这样就导致内存泄露。这个问题也是垃圾收集系统(GC)所遇到的经典问题之一,因为系统不知道对象之间的关系,即无法知道两个对象是否同时不再使用,因为它一次只能收集一个对象所占用的内存。

  此时需要稍微复杂的引用技术来维护对象的生命周期。这种引用技术将对象分为强引用计数和弱引用计数两种。其中,对象生命周期只受强引用计数控制。

  当A和B互相持有引用,类似于“父与子”和”子与父”的关系,在“父-子”关系中,“父”对象通过强引用计数来引用”子“对象,在”子-父“关系中,”子“对象通过弱引用计数来引用”父“对象。B对象是通过弱引用计数来引用A对象的,所以A对象的生命周期不受B对象的影响,此时对象A可以释放;在A对象释放后,同事也会释放它对对象B的强引用计数,所以B对象不再使用时,B对象也可以安全释放。
  由于对象生命周期不受弱引用计数控制,因此,一方面,当对象B想要使用对象A时,对象A可能已经释放了,这个时候对象B不能直接使用A,而是先要成功的将对象A的弱引用计数升级为强引用计数,然后才能使用它;另一方面,如果对象B不能将对象A的弱引用计数升级为强引用计数,那么就说明对象A已经被释放了,因此对象B就不能在使用它。

 

  Android系统提供了三种类型的C++智能指针,分别为轻量级指针、强指针、弱指针,其中,轻量级指针使用了简单的引用计数计数,而强指针和弱指针是用来强引用计数和弱引用计数。

轻量级指针,继承了LightRefBase类,LightRefBase类是一个模板类,其中,模板参数T表示对象的实际类型,它必须是继承了LightRefBase类的,LightRefBase类只有一个成员变了mCount,用来描述一个对象的引用计数值。LightRefBase类同时提供了成员函数incStrong和desStrong来增加和减少它所引用的对象的引用计数。轻量级指针的实现类是sp,它同时也是强指针的实现类。
   注意 : 在成员函数decStrong中,如果对象的引用计数值在减少后变成0,那么就表示需要释放这个对象所占用的内存了。

强指针和弱指针,必须冲RefBase类继承下来,因为RefBase类提供了强引用计数器和弱引用计数器。强指针和弱指针的关系比较密切,他们是配合在一起使用的。

  与LightRefBase类一样,RefBase类也提供了成员函数incStrong和decStrong来维护它所引用的对象的引用计数。不过,RefBase类与LightRefBase类不一样,它不是直接使用一个整数来维护对象的引用计数的,而是使用一个weakref_impl对象,即成员变了mRefs来描述对象的引用计数。  weakerf_impl类同时为对象提供了强引用计数和弱引用计数。

posted @ 2017-08-02 18:32  wlwqnj  阅读(355)  评论(0编辑  收藏  举报