ALog

Android智能指针分析(sp、wp)

筅森魡賤 提交于 2020-02-26 14:06:51
在Android native编写代码时,会经常接触到sp、wp,sp并不是smart pointer的意思,而是strong point;wp就是weak pointer。这两个概念比较像JAVA中的强弱引用,使用sp和wp可以让编程人员不需要再关系内存的释放问题,防止内存泄露。下面先来看它们的类关系图: 要实现内存的自动释放,sp、wp必须结合RefBase这个类来使用,在Android中,大多数类的最上层基类都是RefBase类。我们举个简单的例子,然后顺着这个例子来分析RefBase、sp和wp四种不同的应用,并介绍其实现。 class A : public RefBase { } 上面定义一个类A,继承与RefBase,下面我们首先来看RefBases的构造函数: RefBase::RefBase() : mRefs(new weakref_impl(this)) { } weakref_impl(RefBase* base) : mStrong(INITIAL_STRONG_VALUE) , mWeak(0) , mBase(base) , mFlags(0) { } 在RefBase中,首先构造weakref_impl对象,在weakref_impl对mStong和mWeak进行强弱引用计数赋初始值,INITIAL_STRONG_VALUE是0X10000000

从源码角度分析Android中的Binder机制的前因后果

岁酱吖の 提交于 2019-12-04 21:48:59
为什么在Android中使用binder通信机制? 众所周知linux中的进程通信有很多种方式,比如说管道、消息队列、socket机制等。socket我们再熟悉不过了,然而其作为一款通用的接口,通信开销大,数据传输效率低,主要用在跨网络间的进程间通信以及在本地的低速通信。消息队列和管道都是采用存储-转发模式,效率上面也有点低,因为这种模式的数据传输要经过两次的内存拷贝,先从发送方的缓存区拷贝到内核开辟的缓存区中,然后再从内核拷贝到接受方的缓存区。传统的ipc没有任何的安全措施,两个进程之间没有办法鉴别对方的身份,而在Android中,每个应用在安装后都会被分配一个uid,所以这个身份也有了保障,也更安全。为了保障安全和高效率,Android提供了一套全新的ipc通信机制也就是binder。 binder通信模型 一个进程间通信可以简单理解成为Client-server模式,binder机制在Android系统中的一个模型如下: Client获得到server端的proxy对象。 Client通过调用proxy对象的方法向server发送请求。 proxy对象通过binder设备节点,把Client请求信息发送到linux内核空间,由binder驱动获取并发送到服务进程。 服务进程处理Client请求,通过linux内核的binder驱动把结果返回给proxy对象。