Android4.4深入浅出之SurfaceFlinger(一)

           同样还是surfaceflinger,最近有点进展,特地分享!

一 开门见山

     android 源代码中的类名真的是乱的一塌糊涂,经过一周多的研读The Fucking Source Code,终于有点眉头。首先surfaceflinger(以后简称SF),负责管理渲染UI的,他是个service,一直跟application交互,实时刷新surface。

     

知道这个,我从service这个点入手,之前尝试过直接看SF类等等,但是都搞不清楚头绪,所以改道service。

二 SF这个service的起源诞生

     在源码frameworks/native/service/surfaceflinger/main_surfaceflinger.cpp 中,让我们扒一扒是啥玩意。。

 

    

int main(int argc, char** argv) {
    // When SF is launched in its own process, limit the number of
    // binder threads to 4.
    ProcessState::self()->setThreadPoolMaxThreadCount(4); //忽略。。

    // start the thread pool
    sp<ProcessState> ps(ProcessState::self());//忽略
    ps->startThreadPool(); // instantiate surfaceflinger 
    sp<SurfaceFlinger> flinger = new SurfaceFlinger();//好戏从这里开始,得到一个SF对象
    #if defined(HAVE_PTHREADS) 
    setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
    #endif set_sched_policy(0, SP_FOREGROUND); // initialize before clients can connect 
    flinger->init();//SF的初始化 
    //publish surface flinger 
    sm(defaultServiceManager()); //得到一个ServiceManager对象 
    sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false); // // run in this thread 
    flinger->run();//服务开始运行了!!! }

 

    是不是无语了。。。对就是这么简单粗暴。但是丫的没这么简单吧。好了我们开始从

sp<IServiceManager> sm(defaultServiceManager()); 开始,这里有个sp,简单介绍</span>

一下,这是c++中为了防止指针出现段错误而设计的一种智能指针,smart pointer!用法是怎样的呢,其实很简单。sp<XXXX>  等同于 XXXX* ,比如 sp<char> == char* 很粗暴吧。。。
       回归正题,这里定义了一个IServiceManage的对象,sm(xx)就是把sm初始化为xx,所以现在看看sm被初始化成什么。我们跟踪下deafaultServieManager()。
     
sp<IServiceManager> defaultServiceManager()
{
    if (gDefaultServiceManager != NULL) return gDefaultServiceManager;//忽略</span>
    
    {
        AutoMutex _l(gDefaultServiceManagerLock); //这个就是上锁的意思</span>
        while (gDefaultServiceManager == NULL) {
            gDefaultServiceManager = interface_cast<IServiceManager>(    //重头戏在这                                                          ProcessState::self()->getContextObject(NULL));
            if (gDefaultServiceManager == NULL)
                sleep(1);
        }
    }
    
    return gDefaultServiceManager;
}
gDefaultServiceManager是怎么来的。
gDefaultServiceManager = interface_cast<IServiceManager>(    //重头戏在这                                                          ProcessState::self()->getContextObject(NULL));
我FTSC!!又调用了函数,我们乖乖跟踪下 interface_cast<IServiceManager>(   ProcessState::self()->getContextObject(NULL)) 这个函数。。首先看一下它那吓死人的参数:
   首先是一个self():

sp<ProcessState> ProcessState::self()
{
    Mutex::Autolock _l(gProcessMutex);
    if (gProcess != NULL) {
        return gProcess;
    }
    gProcess = new ProcessState;
    return gProcess;
}

他其实就是返回一个初始化好的 ProcessState类对象,然后接着看getContextObject(NULL),这个函数在ProcessState中,是成员函数,注意了,传进去的是null,我们看下实体:
 
sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& caller)
{
    return getStrongProxyForHandle(0);
}

不多说了,继续跟踪 getStrongProxyForHandle(0);

sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)
{
    sp<IBinder> result; 

    AutoMutex _l(mLock);//上锁

    handle_entry* e = lookupHandleLocked(handle);//
    if (e != NULL) { 
        IBinder* b = e->binder;
        if (b == NULL || !e->refs->attemptIncWeak(this)) //刚开始b肯定为NULL                                                                if (handle == 0) {//刚刚传进来的handle是0!                                                                                            Parcel data;         //下面做了什么我也不知道估计不影响
                status_t status = IPCThreadState::self()->transact(
                        0, IBinder::PING_TRANSACTION, data, NULL, 0);
                if (status == DEAD_OBJECT)
                   return NULL;
            }                                                                                                                                //这是重头戏啊 又来了个BpBinder?是啥玩意待会再说  	                                                                             b = new BpBinder(handle); 
            e->binder = b;
            if (b) e->refs = b->getWeakRefs();
            result = b;
        } else {
            
            result.force_set(b);
            e->refs->decWeak(this);
        }
    }


    return result;//总之返回的是一个BpBinder类。}
BpBinder是个强大深奥的东西,下面会专门讲一下,先接着看吧。
参数是BpBinder类的,接下俩看函数是怎么定义的。。
这里我们不妨留意一下 它的参数?函数的形参是IBinder类的,查了下才知道BpBinder继承了IBinder,所以形参是IBinder也不会有什么大问题。。。这这。。难道有一场阴谋??
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
    return INTERFACE::asInterface(obj);
}	

好吧,这是模板的使用,再看看原函数的调用在函数名后面有个尖括号<>,这下知道他的作用了吧,对!尖括号内的东西是用来代替    sp<INTERFACE> 中的 INTERFACE,也就是 IServiceManager代替INTERFACE
再看看函数体。。。。shit!!又是一个函数。我们继续跟踪
asInterface(obj);       
     好吧,我找了好半天,发现没有找到定义。。。但是看到了一个奇怪的东西。。就是发现他在宏定义里面申明的然后又在宏定义里面实现的!!是在IInterface.h中的定义的。
      
#define DECLARE_META_INTERFACE(INTERFACE)                               \
    static const android::String16 descriptor;                          \
    static android::sp<I##INTERFACE> asInterface(                       \
            const android::sp<android::IBinder>& obj);                  \
    virtual const android::String16& getInterfaceDescriptor() const;    \
    I##INTERFACE();                                                     \
    virtual ~I##INTERFACE();                                            \
这是声明。。。。接下来是实现的宏定义:
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       \
    const android::String16 I##INTERFACE::descriptor(NAME);             \
    const android::String16&                                            \
            I##INTERFACE::getInterfaceDescriptor() const {              \
        return I##INTERFACE::descriptor;                                \
    }                                                                   \
    android::sp<I##INTERFACE> I##INTERFACE::asInterface(                \
            const android::sp<android::IBinder>& obj)                   \
    {                                                                   \
        android::sp<I##INTERFACE> intr;                                 \
        if (obj != NULL) {                                              \
            intr = static_cast<I##INTERFACE*>(                          \
                obj->queryLocalInterface(                               \
                        I##INTERFACE::descriptor).get());               \
            if (intr == NULL) {                                         \
                intr = new Bp##INTERFACE(obj);                          \
            }                                                           \
        }                                                               \
        return intr;                                                    \
    }                                                                  \
    I##INTERFACE::I##INTERFACE() { }                                    \
    I##INTERFACE::~I##INTERFACE() { }                                   \
脑袋瓜表示不够用了,好一个乱七八糟,乱八九糟,乱九十糟。。。。。红色部分分别是asInterface的声明和定义。这个时候我在想这是两个宏而已,到底他在哪里被调用了。
    好!这里我们回到前一步 interface_cast 函数实体是 return IServiceManage::asInterface(obj);这个函数应该定义在
IServiceManage类中才是啊,于是我去跟踪了下IServiceManage这个类:
   
class IServiceManager : public IInterface

{
public:

    DECLARE_META_INTERFACE(ServiceManager);

     virtual status_t   addService( const String16& name,

                                            const sp<IBinder>& service) = 0;
      // 。。。。。。
};

好吧,看到这个类的第三行顿时感觉世界有救了,这不就是之前的宏定义吗,原来着这里调用了。。。好,我们在穿越时空到那个宏定义。。。。
  发现了什么?他的参数是个INTERFACE 跟刚刚的模板很像吧,不管了把所有的INTERFACE换成  ServiceManager, 宏定义中还有类似 I##INTERFACE ,其实即使翻译成 IINTERFACE,看看上面那个 ServiceManager类中的调用他的参数就是 ServiceManager,所以 在宏定义里面就变成 I ServiceManager,好吧!我把他翻译一下。声明翻译成以下:

static const android::String16 descriptor; 

static android::sp< IServiceManager > asInterface(const android::sp<android::IBinder>&

obj) 
virtual const android::String16& getInterfaceDescriptor() const; 

IServiceManager ();                                                     \
virtual ~IServiceManager();

实现翻译如下:
const android::String16 IServiceManager::descriptor(“android.os.IServiceManager”);

const android::String16& IServiceManager::getInterfaceDescriptor() const

 {  return IServiceManager::descriptor;//返回上面那个android.os.IServiceManager

   }                                                                      android::sp<IServiceManager> IServiceManager::asInterface(

            const android::sp<android::IBinder>& obj)

    {

        android::sp<IServiceManager> intr;

        if (obj != NULL) {                                             

            intr = static_cast<IServiceManager *>(                         

                obj->queryLocalInterface(IServiceManager::descriptor).get());              

            if (intr == NULL) {                                         

                intr = new BpServiceManager(obj);                         

            }                                                          

        }                                                               

        return intr;                                                   

    }                                                                 

    IServiceManager::IServiceManager () { }                                   

    IServiceManager::~ IServiceManager() { }
  好我们重点看下  asInterface 这个函数体,妈的绕了这么久终于可以接下去走了。简单分析下,程序走到第一个if进去了,然后第一次intr还是null所以又走到第二个if,对intr被初始化成一个 BpServiceManager对象。。。。
     问题来了,BpServiceManager是什么东西,暂且不管,携带着这个坑爹的结果然我们一步步退出苦海,来到最开始的
sp<IServiceManager> sm(defaultServiceManager());
 发现,实质上也没做什么事啊,不行,我们再回去研究一下 BpServiceManager。。

三  关于BpServiceManager

   之前一篇文章说过Bp 中p是proxy的意思,也就是代理。B其实就是传说中的叱咤江湖的 ”Binder“。。。。有点阴谋了,记得之前提过的那个大阴谋?我们接下去看。先找到这个类的相关定义(在IServiceManager.h中):

class BpServiceManager : public BpInterface<IServiceManager>
{
public:
    BpServiceManager(const sp<IBinder>& impl)
        : BpInterface<IServiceManager>(impl)
    {
//构造函数的形参是IBinder参数,但是实际上传进来的是new BpBinder(0) (ps:为什么呢?之前最开始的时候传进来的参数就是BpBinder类的,只是形参一直写成IBinder又是BpBinder,而且参数名是impl,敏感吗,不就是implement的缩写,实现?难道有猫腻?接着看。    }

    virtual sp<IBinder> getService(const String16& name) const
    {
        //忽略
    }

    virtual sp<IBinder> checkService( const String16& name) const
    {
      。。。。。忽略
    }
//这是个重要的函数 不能忽略先把他记在心里,待会会解释                                                                                     virtual status_t addService(const String16& name, const sp<IBinder>& service,
            bool allowIsolated)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
        data.writeString16(name);
        data.writeStrongBinder(service);
        data.writeInt32(allowIsolated ? 1 : 0);
        status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);
        return err == NO_ERROR ? reply.readExceptionCode() : err;
    }

    virtual Vector<String16> listServices()
    {
       //忽略
    }
};
   好了,我们知道上一环节有提到 BpServiceManager的是这行代码  intr = new BpServiceManager(obj);传进去的obj参数是IBinder类的,构造函数是 BpServiceManager(const sp<IBinder>& impl) : BpInterface<IServiceManager>(impl)
传进去的参数 直接进入BpInterface()这个函数,内容如下:
template<typename INTERFACE>
inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
    : BpRefBase(remote)
{
}
我了个cacaca,传进来的impl改名为 remote,又来个 BpRefBase(remote),android元老们,你爸妈造你这么吊吗。。。。继续跟踪这个函数:

BpRefBase::BpRefBase(const sp<IBinder>& o)
    : mRemote(o.get()), mRefs(NULL), mState(0)
{
    extendObjectLifetime(OBJECT_LIFETIME_WEAK);

    if (mRemote) {
        mRemote->incStrong(this);           // Removed on first IncStrong().
        mRefs = mRemote->createWeak(this);  // Held for our entire lifetime.
    }
}

好吧,他的名字又变了,是 o,对参数是o,记住是BpBinder类的。看他做了什么。o.get();返回的是一个sp<XXX> 也就是返回一个XXX*的指针,也就是说 mRemote被初始化成 BpBinder类对象,看他做了什么?shit?看不懂啊 。。。。不管了忽略掉!

   好好现在我们重新回到 BpServiceManager,再回一步 sp<IServiceManager>sm(defaultServiceManager());
//简单说返回的实际是BpServiceManager,它的remote对象是BpBinder,传入的那个handle参数是0。

四  添加service

 我们再回到之前最开始的main函数,继续往下走
int main(int argc, char** argv) {
    // When SF is launched in its own process, limit the number of
    // binder threads to 4.
    ProcessState::self()->setThreadPoolMaxThreadCount(4); //忽略。。

    // start the thread pool
    sp<ProcessState> ps(ProcessState::self());
//忽略。。

    ps->startThreadPool();

    // instantiate surfaceflinger
    sp<SurfaceFlinger> flinger = new SurfaceFlinger();//好戏从这里开始,得到一个SF对象

#if defined(HAVE_PTHREADS)
    setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
#endif
    set_sched_policy(0, SP_FOREGROUND);

    // initialize before clients can connect
    flinger->init();//SF的初始化

    // publish surface flinger
    sp<IServiceManager> sm(defaultServiceManager()); //得到一个ServiceManager对象
    sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);  //
    // run in this thread
    flinger->run();//服务开始运行了!!!

 }
这个时候走到 sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
  看函数明就知道,刚刚创建的服务要开始添加了,这是个怎样的机制了,其实ServiceManage是一个服务管理员,所有的service都要在这边登记信息,然后申请创建,有条不紊,便于管理。
  看一下addService的函数实体:
   
 virtual status_t addService(const String16& name, const sp<IBinder>& service,
            bool allowIsolated)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
        data.writeString16(name);
        data.writeStrongBinder(service);
        data.writeInt32(allowIsolated ? 1 : 0);
        status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);
        return err == NO_ERROR ? reply.readExceptionCode() : err;
    }

先看它的三个参数,第一个是一个字符串服务的名字,第二个就是这个service ,是IBinder类的,虽然传进来的是flinger 是SF类的,但是SF继承了IBinder,所以这里是可以的。
       Parcel的对象data,顾名思义是个数据包吧or缓冲区,接下去的四行都是把相关的一些信息比如interface描述信息,服务名称,本身service的binder都写到data里,然后通过transact()进行处理,这里的remote()是不是很眼熟,对,他其实就是BpBinder::remote(),接着往下看看到他返回的不是什么好东西,算了忽略掉,我们研究的是SF,这些在深入就是Binder机制的问题了。总结说,这个函数就是向管理者注册了SF这个service的一些基本信息。
        到这里我们是不是忽略了一行程序,flinger->init(); 这行说是SF的一些初始化,但是也是有很多的内容的。好,从此刻开始 ,我们终于开始进军SF的敌军大营,看看它内部到底是怎么回事。

 



     
     
      













  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值