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;
重新編譯後我們即可看到開機播放視訊的效果。