Android应用开发之应用程序进程与SurfaceFlinger的连接过程
白羽 2018-08-10 来源 :网络 阅读 1235 评论 0

摘要:本文将带你了解Android应用开发之应用程序进程与SurfaceFlinger的连接过程,希望本文对大家学Android有所帮助

        本文将带你了解Android应用开发之应用程序进程与SurfaceFlinger的连接过程,希望本文对大家学Android有所帮助


我们从SurfaceComposerClient对象的创建开始分析应用程序与SurfaceFlinger的连接过程.每一个需要SurfaceFlinger渲染的应用程序都会创建一个SurfaceComposerClient对象,是这样么,我不确定,需要验证.
 SurfaceComposerClient类的声明(在SurfaceComposerClient.h文件中)如下:
 class SurfaceComposerClient : public RefBase
 SurfaceComposerClient类的构造函数定义如下:
SurfaceComposerClient::SurfaceComposerClient()
    : mStatus(NO_INIT), mComposer(Composer::getInstance())
{
}
 关于SurfaceComposerClient类的构造函数的详细分析可以参考page2文件.
 因为SurfaceComposerClient继承自RefBase,那么当只能指针第一次被引用时,就会调用onFirstRef函数, 我们就来看一下SurfaceComposerClient的onFirstRef函数的实现:
 1void SurfaceComposerClient::onFirstRef() {
 2    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
 3    if (sm != 0) {
 4 sp<ISurfaceComposerClient> conn = sm->createConnection();
 5 if (conn != 0) {
 6     mClient = conn;
 7     mStatus = NO_ERROR;
 8 }
 9    }
 10}
 关于SurfaceComposerClient的onFirstRef函数的实现的分析,可以参考page3文件.
 
 当调用完onFirstRef函数之后, SurfaceComposerClient对象的成员变量mClient就被初始化指向一个ISurfaceComposerClient的Binder代理对象,这样SurfaceComposerClient对象就能通过这个ISurfaceComposerClient接口来请求SurfaceFlinger的服务了.
 
 以上就是应用程序与SurfaceFlinger服务的连接过程的分析, 通过以上的分析, 我们可以得出以下结论:
  No.1 每一个需要渲染UI的应用程序都会创建一个SurfaceComposerClient对象. 这是正确的么?
 No.2 每一个需要SurfaceFlinger服务的应用程序都会在SurfaceFlinger这一侧创建一个Client对象, 并在应用程序这一侧拿到一个ISurfaceComposerClient类型的Binder代理对象.

 SurfaceComposerClient类的构造函数定义如下:
 SurfaceComposerClient::SurfaceComposerClient()
     : mStatus(NO_INIT), mComposer(Composer::getInstance())
 {
 }
 在SurfaceComposerClient类中一个成员变量mComposer, 类型为Composer类的一个引用, 定义如下:
 Composer&                   mComposer;
 那么这个mComposer的作用是什么呢?且慢, 我们一点点的来分析.
 我们先来看一下Composer类的定义, 
  Composer类的声明如下:
 class Composer : public Singleton<Composer>
 由此可见Composer是一个单例的.
 Composer的构造函数定义如下:
 Composer() : Singleton<Composer>(),
        mForceSynchronous(0), mTransactionNestCount(0),
        mAnimation(false)
     { 

 }
 
 我们还是不知道mComposer是干什么的啊?那日后在分析吧.^-^

  
 SurfaceComposerClient的onFirstRef函数的实现如下
 1void SurfaceComposerClient::onFirstRef() {
 2    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
 3    if (sm != 0) {
 4 sp<ISurfaceComposerClient> conn = sm->createConnection();
 5 if (conn != 0) {
 6     mClient = conn;
 7     mStatus = NO_ERROR;
 8 }
 9    }
 10}
 第一行(SurfaceComposerClient::onFirstRef)首先调用ComposerService::getComposerService()来获得一个ISurfaceComposer的Binder代理对象.
 我们首先看一下ComposerService类的声明,位于frameworks/native/include/private/gui/ComposerService.h文件中:
 class ComposerService : public Singleton<ComposerService>
 由此可见, ComposerService是一个单例的.
 分析完ComposerService类的声明, 我们看一下ComposerService的getComposerService函数的实现, 位于frameworks/native/libs/gui/SurfaceComposerClient.cpp文件中, 定义如下:
 1sp<ISurfaceComposer> ComposerService::getComposerService() {
 2    ComposerService& instance = ComposerService::getInstance();
 3    Mutex::Autolock _l(instance.mLock);
 4    if (instance.mComposerService == NULL) {
 5 ComposerService::getInstance().connectLocked();
 6 assert(instance.mComposerService != NULL);
 7 ALOGD("ComposerService reconnected");
 8    }
 9    return instance.mComposerService;
 10}
 ComposerService的getComposerService函数的主要逻辑是得到ComposerService实例,并判断ComposerService实例的mComposerService是否为null, 如果是则表示还没有得到SurfaceFlinger服务,那么就会调用ComposerService实例的connectLocked函数来得到SurfaceFlinger服务, 如果不为null, 表示已经获得了SurfaceFlinger服务,那么直接返回SurfaceFlinger.
 所以我们接下来看一下ComposerService的connectLocked函数的实现, 位于frameworks/native/libs/gui/SurfaceComposerClient.cpp文件中, 定义如下:
 void ComposerService::connectLocked() {
     const String16 name("SurfaceFlinger");
     while (getService(name, &mComposerService) != NO_ERROR) {
  usleep(250000);
     }
     assert(mComposerService != NULL);

     // Create the death listener.
     class DeathObserver : public IBinder::DeathRecipient {
  ComposerService& mComposerService;
  virtual void binderDied(const wp<IBinder>& who) {
      ALOGW("ComposerService remote (surfaceflinger) died [%p]",
            who.unsafe_get());
      mComposerService.composerServiceDied();
  }
      public:
  DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
     };

     mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
     IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
 }
 在ComposerService的connectLocked函数中, 主要完成了两件事: 第一,不断地从ServiceManager中获取SurfaceFlinger服务. 第二, 注册一个Binder死亡通知.

 我们回到SurfaceComposerClient::onFirstRef函数的分析中, 当得到SurfaceFlinger服务之后, 第4-8行(SurfaceComposerClient::onFirstRef)会调用SurfaceFlinger的createConnection函数,createConnection函数的定义如下:
 1sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()
 2{
 3 sp<ISurfaceComposerClient> bclient;
 4 sp<Client> client(new Client(this));
 5 status_t err = client->initCheck();
 6 if (err == NO_ERROR) {
 7  bclient = client;
 8 }
 9 return bclient;
 10}
 createConnection函数的详细分析可以参考page4文件。
 
 第6行(SurfaceComposerClient::onFirstRef)就把createConnection函数返回的ISurfaceComposerClient的Binder接口保存起来,这样以后就能通过这个接口来请求SurfaceFlinger服务了。

 SurfaceFlinger的createConnection函数的实现如下:
 1sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()
 2{
 3 sp<ISurfaceComposerClient> bclient;
 4 sp<Client> client(new Client(this));
 5 status_t err = client->initCheck();
 6 if (err == NO_ERROR) {
 7  bclient = client;
 8 }
 9 return bclient;
 10}
 第4行(SurfaceFlinger::createConnection)首先创建了一个Client类型的对象,传入的参数就是SurfaceFlinger对象。
 Client类的声明如下,位于frameworks/native/services/surfaceflinger/Client.h文件中:
 class Client : public BnSurfaceComposerClient
 由此可见Client是一个Binder的本地对象。
 Client类的构造函数定义如下, 位于frameworks/native/services/surfaceflinger/Client.cpp:
 1Client::Client(const sp<SurfaceFlinger>& flinger)
    2: mFlinger(flinger), mNameGenerator(1)
 3{
 4}
 Client的构造函数只是将Client的成员变量mFlinger指向SurfaceFlinger服务。
 当构造完Client对象之后, 会在第5行(SurfaceFlinger::createConnection)调用Client的initCheck函数,initCheck的函数的定义如下:
 status_t Client::initCheck() const {
  return NO_ERROR;
 }
 可以看到initCheck函数只是简单的返回了NO_ERROR。
 最后会返回这个Client对象。
 由此可见, 每一个与SurfaceFlinger连接的应用程序在SurfaceFlinger这一侧都会有一个Client对象,也就是ISurfaceComposerClient的Binder本地对象。
 最后将这个ISurfaceComposerClient的Binder接口返回给应用程序,这样应用程序就可以用这个Binder接口来请求SurfaceFlinger为其服务了,这样应用程序就和SurfaceFlinger建立了连接。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程