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();
- }
复制代码