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;
- }
java代码
- static void instantiate() { publish(); }
- static status_t publish(bool allowIsolated = false) {
- sp sm(defaultServiceManager());
- return sm->addService(String16(SERVICE::getServiceName()), new
- SERVICE(), allowIsolated);
- }
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();
- }
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;
- }
- }
java代码
- void SurfaceFlinger::onFirstRef()
- {
- mEventQueue.init(this);//事件队列初始化
- run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);//运行SurfaceFlinger线程
- mReadyToRunBarrier.wait();
- }