您的位置:首页 > 移动开发 > Android开发

Android 开机动画源码分析1

2014-03-10 10:17 736 查看

Android 开机动画源码分析1

Android系统在启动SystemServer进程时,通过两个阶段来启动系统所有服务,在第一阶段启动本地服务,如SurfaceFlinger,SensorService等,在第二阶段则启动一系列的Java服务。开机动画是在什么时候启动的呢?通过查看源码,Android开机动画是在启动SurfaceFlinger服务时启动的。SystemServer的main函数首先调用init1来启动本地服务,init1函数通过JNI调用C语言中的system_init()函数来实现服务启动。

  java代码

extern "C" status_t system_init()

  {

  sp proc(ProcessState::self());

  sp sm = defaultServiceManager();

  sp grim = new GrimReaper();

  sm->asBinder()->linkToDeath(grim, grim.get(), 0);

  char propBuf[PROPERTY_VALUE_MAX];

  property_get("system_init.startsurfaceflinger", propBuf, "1");

  if (strcmp(propBuf, "1") == 0) {

  // Start the SurfaceFlinger

  SurfaceFlinger::instantiate();

  }

  ...

  return NO_ERROR;

  }

复制代码
  通过调用SurfaceFlinger::instantiate()函数来启动SurfaceFlinger服务,SurfaceFlinger类继承于BinderService模板类,BinderService类的instantiate()函数就是构造对应类型的服务对象,并注册到ServiceManager进程中。

  java代码

static void instantiate() { publish(); }

  static status_t publish(bool allowIsolated = false) {

  sp sm(defaultServiceManager());

  return sm->addService(String16(SERVICE::getServiceName()), new

SERVICE(), allowIsolated);

  }

复制代码
  对于SurfaceFlinger服务来说,就是首先构造SurfaceFlinger对象,然后通过调用ServiceManger的远程Binder代理对象的addService函数来注册SurfaceFlinger服务。这里只介绍SurfaceFlinger的构造过程,对于服务注册过程,在Android服务注册完整过程源码分析中已经介绍的非常详细。

  java代码

SurfaceFlinger::SurfaceFlinger()

  : BnSurfaceComposer(), Thread(false),

  mTransactionFlags(0),

  mTransationPending(false),

  mLayersRemoved(false),

  mBootTime(systemTime()),

  mVisibleRegionsDirty(false),

  mHwWorkListDirty(false),

  mElectronBeamAnimationMode(0),

  mDebugRegion(0),

  mDebugDDMS(0),

  mDebugDisableHWC(0),

  mDebugDisableTransformHint(0),

  mDebugInSwapBuffers(0),

  mLastSwapBufferTime(0),

  mDebugInTransaction(0),

  mLastTransactionTime(0),

  mBootFinished(false),

  mSecureFrameBuffer(0)

  {

  init();

  }

复制代码
  SurfaceFlinger对象实例的构造过程很简单,就是初始化一些成员变量值,然后调用init()函数来完成初始化工作

  java代码

void SurfaceFlinger::init()

  {

  char value[PROPERTY_VALUE_MAX];

  property_get("debug.sf.showupdates", value, "0");

  mDebugRegion = atoi(value);

  #ifdef DDMS_DEBUGGING

  property_get("debug.sf.ddms", value, "0");

  mDebugDDMS = atoi(value);

  if (mDebugDDMS) {

  DdmConnection::start(getServiceName());

  }

  #endif

  property_get("ro.bootmode", value, "mode");

  if (!(strcmp(value, "engtest")

  && strcmp(value, "special")

  && strcmp(value, "wdgreboot")

  && strcmp(value, "unknowreboot")

  && strcmp(value, "panic"))) {

  SurfaceFlinger::sBootanimEnable = false;

  }

  }

复制代码
  在SurfaceFlinger的init函数中,也并没有做任何复杂工作,只是简单读取系统属性得到开机模式,来相应设置一些变量而已,比如是否显示开机动画变量sBootanimEnable。由于SurfaceFlinger继承于RefBase类,并重写了该类的onFirstRef()函数,我们知道,RefBase类的子类对象在第一次创建时,会自动调用onFirstRef()函数,因此在SurfaceFlinger对象构造完成时,将调用onFirstRef()函数。

  java代码

void SurfaceFlinger::onFirstRef()

  {

  mEventQueue.init(this);//事件队列初始化

  run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);//运行SurfaceFlinger线程

  mReadyToRunBarrier.wait();

  }

复制代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: