1. 程式人生 > >RK3288 替換安卓開機動畫為視訊MP4

RK3288 替換安卓開機動畫為視訊MP4

硬體平臺:rk3288

軟體平臺:firefly Android5.1

 Android的開機有兩個階段:Linux啟動、Android啟動。開機介面有三個:bootloader啟動介面、kernel啟動介面、bootanimation啟動介面。

第一個開機介面

第一個開機介面在Bootloader啟動Linux核心時的啟動畫面(Linux小企鵝的畫面 在Android 1.5及以上版本已取消載入)。 

在預設情況下,這個畫面是不會出現的,除非我們在編譯核心的時候,啟用以下兩個編譯選項:

        CONFIG_FRAMEBUFFER_CONSOLE

        CONFIG_LOGO

第一個編譯選項表示核心支援幀緩衝區控制檯,它對應的配置選單項為:  Device Drivers —> Graphics support —> Console display driver support —> Framebuffer Console support。  第二個編譯選項表示核心在啟動的過程中,需要顯示LOGO,它對應的配置選單項為:  Device Drivers —> Graphics support —> Bootup logo。

第二個開機介面

第二個開機畫面是在init程序啟動的過程中顯示的,第二個開機畫面的內容是由檔案 initlogo.rle 來指定的,如果檔案 initlogo.rle 檔案不存在,或者在顯示它的過程中出現異常,那麼 Android 就以文字的方式來顯示第二個開機畫面,即向編號為0的控制檯(/dev/tty0)輸出“ANDROID”這7個字元。

第三個開機介面

第三個開機畫面是由應用程式bootanimation來負責顯示的。應用程式bootanimation在啟動指令碼init.rc中被配置成了一個服務,bootanimation 程式會檢查系統制定目錄下是否存在動畫檔案(.zip檔案),如果不存在,則顯示的第三個開機畫面是Android系統預設的開機動畫(明暗閃爍的 Android Logo),否則的話,第三個開機畫面就是由使用者自定義的開機動畫。在這個基礎上我們可以呼叫 mediaPlayer 的介面來實現播放視訊

實現步驟

步驟一:

找一個確定會編譯到的mk檔案,比如device/rockchip/rk3288/rk3288.mk,把bootvideo.mp4入進該檔案所在目錄中,在該檔案新增以下語句: PRODUCT_COPY_FILES += device/rockchip/rk3288/bootanimation.zip:system/media/bootvideo.mp4

步驟二:

在原始碼 frameworks/base/cmds/bootanimation/BootAnimation.cpp 中新增程式碼

找到該位置新增視訊路徑

#define USER_SHUTDOWN_ANIMATION_FILE "/data/local/shutdownanimation.zip"
#define SYSTEM_SHUTDOWN_ANIMATION_FILE "/system/media/shutdownanimation.zip"
#define SYSTEM_BOOTVIDEO_FILE "/system/media/bootvideo.mp4"    //視訊路徑

找到 BootAnimation::readyToRun() 函式在該位置新增視訊標識

    bool encryptedAnimation = atoi(decrypt) != 0 ||!strcmp("trigger_restart_min_framework", decrypt);
 
    mVideo = false;
    if(access(SYSTEM_BOOTVIDEO_FILE,R_OK) == 0)
        mVideo = true;
    else
        mVideo = false;

    ZipFileRO* zipFile = NULL;

找到 BootAnimation::threadLoop() 函式新增判斷

   if (mZip == NULL) {
        r = android();
    } else if (mVideo) {
        r = video();
    } else {
        r = movie();
    }

匯入 IMediaHTTPService

#include <media/IMediaHTTPService.h>

新增視訊播放函式 BootAnimation::video()

bool BootAnimation::video()
{ 
    int time_now,time_max=0;
    eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
    eglDestroySurface(mDisplay, mSurface);
    sp<IMediaHTTPService> httpService;

    sp<MediaPlayer> mediaplayer = new MediaPlayer();
    mediaplayer->reset();
    mediaplayer->setDataSource(httpService,SYSTEM_BOOTVIDEO_FILE,NULL); //設定播放資源
 
    mediaplayer->setLooping(false);
    mediaplayer->setVideoSurfaceTexture(mFlingerSurface->getIGraphicBufferProducer());
    mediaplayer->prepare();
    mediaplayer->start();
       if(mediaplayer->isPlaying())
           mediaplayer->getDuration(&time_max);
     
  while(true) {
    mediaplayer->getCurrentPosition(&time_now);
       if(exitPending())
            break;
        usleep(50);
        if(time_now==time_max)
        checkExit();
    }
    mediaplayer->stop();
    mediaplayer->disconnect();
    mediaplayer.clear();
    return false;
}

最後修改標頭檔案 frameworks/base/cmds/bootanimation/BootAnimation.h 並且新增增加的兩個成員變數 

sp<SurfaceControl> mFlingerSurfaceControl;
     sp<Surface> mFlingerSurface;
+    bool        mVideo;
+    bool        video();
     ZipFileRO   *mZip;
     int         mHardwareRotation;

重新編譯後我們即可看到開機播放視訊的效果。