Android 开机动画源码分析1

Android 开机动画源码分析1



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

  1. extern "C" status_t system_init()

  2.   {
  3.   sp proc(ProcessState::self());
  4.   sp sm = defaultServiceManager();
  5.   sp grim = new GrimReaper();
  6.   sm->asBinder()->linkToDeath(grim, grim.get(), 0);
  7.   char propBuf[PROPERTY_VALUE_MAX];
  8.   property_get("system_init.startsurfaceflinger", propBuf, "1");
  9.   if (strcmp(propBuf, "1") == 0) {
  10.   // Start the SurfaceFlinger
  11.   SurfaceFlinger::instantiate();
  12.   }
  13.   ...
  14.   return NO_ERROR;
  15.   }
复制代码
  通过调用SurfaceFlinger::instantiate()函数来启动SurfaceFlinger服务,SurfaceFlinger类继承于BinderService模板类,BinderService类的instantiate()函数就是构造对应类型的服务对象,并注册到ServiceManager进程中。
  java代码
  1. static void instantiate() { publish(); }

  2.   static status_t publish(bool allowIsolated = false) {
  3.   sp sm(defaultServiceManager());
  4.   return sm->addService(String16(SERVICE::getServiceName()), new
  5. SERVICE(), allowIsolated);
  6.   }
复制代码
  对于SurfaceFlinger服务来说,就是首先构造SurfaceFlinger对象,然后通过调用ServiceManger的远程Binder代理对象的addService函数来注册SurfaceFlinger服务。这里只介绍SurfaceFlinger的构造过程,对于服务注册过程,在Android服务注册完整过程源码分析中已经介绍的非常详细。
  java代码
  1. SurfaceFlinger::SurfaceFlinger()

  2.   : BnSurfaceComposer(), Thread(false),
  3.   mTransactionFlags(0),
  4.   mTransationPending(false),
  5.   mLayersRemoved(false),
  6.   mBootTime(systemTime()),
  7.   mVisibleRegionsDirty(false),
  8.   mHwWorkListDirty(false),
  9.   mElectronBeamAnimationMode(0),
  10.   mDebugRegion(0),
  11.   mDebugDDMS(0),
  12.   mDebugDisableHWC(0),
  13.   mDebugDisableTransformHint(0),
  14.   mDebugInSwapBuffers(0),
  15.   mLastSwapBufferTime(0),
  16.   mDebugInTransaction(0),
  17.   mLastTransactionTime(0),
  18.   mBootFinished(false),
  19.   mSecureFrameBuffer(0)
  20.   {
  21.   init();
  22.   }
复制代码
  SurfaceFlinger对象实例的构造过程很简单,就是初始化一些成员变量值,然后调用init()函数来完成初始化工作
  java代码
  1. void SurfaceFlinger::init()

  2.   {
  3.   char value[PROPERTY_VALUE_MAX];
  4.   property_get("debug.sf.showupdates", value, "0");
  5.   mDebugRegion = atoi(value);
  6.   #ifdef DDMS_DEBUGGING
  7.   property_get("debug.sf.ddms", value, "0");
  8.   mDebugDDMS = atoi(value);
  9.   if (mDebugDDMS) {
  10.   DdmConnection::start(getServiceName());
  11.   }
  12.   #endif
  13.   property_get("ro.bootmode", value, "mode");
  14.   if (!(strcmp(value, "engtest")
  15.   && strcmp(value, "special")
  16.   && strcmp(value, "wdgreboot")
  17.   && strcmp(value, "unknowreboot")
  18.   && strcmp(value, "panic"))) {
  19.   SurfaceFlinger::sBootanimEnable = false;
  20.   }
  21.   }
复制代码
  在SurfaceFlinger的init函数中,也并没有做任何复杂工作,只是简单读取系统属性得到开机模式,来相应设置一些变量而已,比如是否显示开机动画变量sBootanimEnable。由于SurfaceFlinger继承于RefBase类,并重写了该类的onFirstRef()函数,我们知道,RefBase类的子类对象在第一次创建时,会自动调用onFirstRef()函数,因此在SurfaceFlinger对象构造完成时,将调用onFirstRef()函数。
  java代码
  1. void SurfaceFlinger::onFirstRef()

  2.   {
  3.   mEventQueue.init(this);//事件队列初始化
  4.   run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);//运行SurfaceFlinger线程
  5.   mReadyToRunBarrier.wait();
  6.   }
复制代码

你可能感兴趣的:(Android 开机动画源码分析1)