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();
}
复制代码
相关文章推荐
- Android 开机动画源码分析
- Android 开机动画源码分析
- OpenGL—Android 开机动画源码分析二
- OpenGL—Android 开机动画源码分析一
- Android的开机流程及对应源码位置分析
- android开机动画bootanimation 分析
- Android开机动画文件分析与制作
- 源码中修改Android的开机画面和动画
- Android源码分析—属性动画的工作原理
- Android(1.5及以上版本) 开机图片/文字/动画分析[转载、修改部分内容]
- ANDROID开机动画分析
- Android源码分析---系统开机流程
- Android 开关机动画显示源码分析
- Android动画 - AndroidFillableLoaders源码分析
- Android RecyclerView的Item自定义动画及DefaultItemAnimator源码分析
- android-魔法泡泡动画分析(附源码)
- 浅析android锁屏开机绘制流程(基于android4.0源码分析)
- 【Android API】Android动画源码分析(一)
- ANDROID开机动画分析
- android-魔法泡泡动画分析(附源码)