一、bootanimation启动和结束

bootanimation的启动和结束受surfaceflinger控制
bootanimation进程启动在android/frameworks/native/services/surfaceflinger/StartPropertySetThread.cpp

bool StartPropertySetThread::threadLoop() {    // Set property service.sf.present_timestamp, consumer need check its readiness    property_set(kTimestampProperty, mTimestampPropertyValue ? "1" : "0");    // Clear BootAnimation exit flag    property_set("service.bootanim.exit", "0");//启动开机动画进程    char value[PROPERTY_VALUE_MAX];    property_get("debug.sf.nobootanimation", value, "0");    if (atoi(value) == 0) {        // Start BootAnimation if not started        property_set("ctl.start", "bootanim");    }    // Exit immediately    return false;}

bootanimation进程结束在
android/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

void SurfaceFlinger::bootFinished(){    if (mStartPropertySetThread->join() != NO_ERROR) {        ALOGE("Join StartPropertySetThread failed!");    }    const nsecs_t now = systemTime();    const nsecs_t duration = now - mBootTime;    ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );    // wait patiently for the window manager death    const String16 name("window");    sp window(defaultServiceManager()->getService(name));    if (window != 0) {        window->linkToDeath(static_cast(this));    }    if (mVrFlinger) {      mVrFlinger->OnBootFinished();    }    // stop boot animation    // formerly we would just kill the process, but we now ask it to exit so it    // can choose where to stop the animation.    property_set("service.bootanim.exit", "1");//退出开机动画    const int LOGTAG_SF_STOP_BOOTANIM = 60110;    LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,                   ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));    sp readProperties = new LambdaMessage([&]() {        readPersistentProperties();    });    postMessageAsync(readProperties);}

二、bootanimation源码

开机动画源码在android/frameworks/base/cmds/bootanimation目录。
修改开机动画,收到退出消息后晚维持最后一帧4秒然后退出(一挡遮百丑):

void BootAnimation::checkExit() {    // Allow surface flinger to gracefully request shutdown    char value[PROPERTY_VALUE_MAX];    property_get(EXIT_PROP_NAME, value, "0");    int exitnow = atoi(value);    if (exitnow) {        usleep(4000 * 1000);//增加4s延时        requestExit();        mCallbacks->shutdown();    }}

三、bootanimation资源

开机动画资源在android/vendor/XXX/hmi/bootanimation目录(XXX和平台有关)
是一个或多个存储格式的zip文件。(zip -r -0 xxx.zip [file])
在android/frameworks/base/cmds/bootanimation下有一份文档FORMAT.md,里面非常详细的说明。

# bootanimation format## zipfile pathsThe system selects a boot animation zipfile from the following locations, in order:    /system/media/bootanimation-encrypted.zip (if getprop("vold.decrypt") = '1')    /system/media/bootanimation.zip    /oem/media/bootanimation.zip## zipfile layoutThe `bootanimation.zip` archive file includes:    desc.txt - a text file    part0  \    part1   \  directories full of PNG frames    ...     /    partN  /## desc.txt formatThe first line defines the general parameters of the animation:    WIDTH HEIGHT FPS  * **WIDTH:** animation width (pixels)  * **HEIGHT:** animation height (pixels)  * **FPS:** frames per second, e.g. 60It is followed by a number of rows of the form:    TYPE COUNT PAUSE PATH [#RGBHEX CLOCK]  * **TYPE:** a single char indicating what type of animation segment this is:      + `p` -- this part will play unless interrupted by the end of the boot      + `c` -- this part will play to completion, no matter what  * **COUNT:** how many times to play the animation, or 0 to loop forever until boot is complete  * **PAUSE:** number of FRAMES to delay after this part ends  * **PATH:** directory in which to find the frames for this part (e.g. `part0`)  * **RGBHEX:** _(OPTIONAL)_ a background color, specified as `#RRGGBB`  * **CLOCK:** _(OPTIONAL)_ the y-coordinate at which to draw the current time (for watches)There is also a special TYPE, `$SYSTEM`, that loads `/system/media/bootanimation.zip`and plays that.## loading and playing framesEach part is scanned and loaded directly from the zip archive. Within a part directory, every file(except `trim.txt` and `audio.wav`; see next sections) is expected to be a PNG file that representsone frame in that part (at the specified resolution). For this reason it is important that frames benamed sequentially (e.g. `part000.png`, `part001.png`, ...) and added to the zip archive in thatorder.## trim.txtTo save on memory, textures may be trimmed by their background color.  trim.txt sequentially liststhe trim output for each frame in its directory, so the frames may be properly positioned.Output should be of the form: `WxH+X+Y`. Example:    713x165+388+914    708x152+388+912    707x139+388+911    649x92+388+910If the file is not present, each frame is assumed to be the same size as the animation.## audio.wavEach part may optionally play a `wav` sample when it starts. To enable this, add a filewith the name `audio.wav` in the part directory.## exitingThe system will end the boot animation (first completing any incomplete or even entirely unplayedparts that are of type `c`) when the system is finished booting. (This is accomplished by settingthe system property `service.bootanim.exit` to a nonzero string.)## protips### PNG compressionUse `zopflipng` if you have it, otherwise `pngcrush` will do. e.g.:    for fn in *.png ; do        zopflipng -m ${fn}s ${fn}s.new && mv -f ${fn}s.new ${fn}        # or: pngcrush -q ....    doneSome animations benefit from being reduced to 256 colors:    pngquant --force --ext .png *.png    # alternatively: mogrify -colors 256 anim-tmp/*/*.png### creating the ZIP archive    cd     zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*Note that the ZIP archive is not actually compressed! The PNG files are already as compressedas they can reasonably get, and there is unlikely to be any redundancy between files.

更多相关文章

  1. android 上下抽屉拖拽+动画完美实现
  2. Android对于模块启动的permission
  3. 让Android不播放关机动画,而是显示一个关机进度条的方法
  4. android开机启动流程说明
  5. 使用程序创建Android桌面快捷方式
  6. android开机logo制作
  7. Android(安卓)Animation Interpolator - Android(安卓)动画插值
  8. Android(安卓)AnimationDrawable动画实例
  9. Android(安卓)之开机启动Service

随机推荐

  1. android——利用SharedPreference做引导
  2. Android(安卓)Tips1
  3. Android的animation由四种类型组成
  4. Android SDK Manager无法下载其他版本SDK
  5. Android 安全 —— allowbackup 引起的漏
  6. Android(安卓)Studio 学习心得之--NDK相
  7. Android 发邮件
  8. android之listview的item不可点击
  9. android 5.0视频教程
  10. Android Studio Plugins 之 JRebel for A