RK3288 替换安卓开机动画为视频MP4

本文介绍了如何在RK3288硬件平台的Android 5.1系统上将开机动画替换为视频MP4。内容包括Linux启动和Android启动的两个阶段,以及三个开机界面的详细解析。通过修改设备.mk文件添加视频资源,并在BootAnimation.cpp源码中添加播放视频的代码,实现了开机动画从默认图片变为视频播放的功能。
AI助手已提取文章相关产品:

硬件平台:rk3288

软件平台:firefly Android5.1

参考博客:https://blog.youkuaiyun.com/dearsq/article/details/52457066https://blog.youkuaiyun.com/kris_fei/article/details/73098927https://blog.youkuaiyun.com/luoshengyang/article/details/7691321https://blog.youkuaiyun.com/godiors_163/article/details/72529210

 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;

重新编译后我们即可看到开机播放视频的效果。

您可能感兴趣的与本文相关内容

<think>我们正在处理一个Android系统定制的问题,用户想在RK3288设备上修改开机壁纸。根据Android系统启动流程,开机壁纸通常是由系统服务在启动过程中加载的。在Android系统中,开机壁纸(也称为启动器壁纸)可能由不同的组件管理,但通常与系统UI或启动器应用相关。 然而,需要注意的是,Android开机过程分为几个阶段,包括Linux内核启动、init进程启动、系统服务启动等。在系统服务启动后,会进入SystemServer进程,然后启动各种系统服务,包括WindowManagerService等。当系统UI启动后,才会显示壁纸。 在RK3288这样的设备上,通常运行的是Android系统,修改开机壁纸可能有以下几种方式: 1. **修改框架层的默认壁纸资源**:Android框架中有一个默认的壁纸,通常在`frameworks/base/core/res/res/drawable-nodpi`目录下,文件名为`default_wallpaper.png`(或者可能是其他名字,如`default_wallpaper.jpg`)。我们可以替换这个文件来改变默认的开机壁纸。 2. **通过属性设置**:在`build.prop`文件中,可以设置属性`ro.config.wallpaper`和`ro.config.wallpaper_component`来指定壁纸的位置和组件。但是,这种方式可能需要在编译时设置,或者通过覆盖属性来实现。 3. **在启动器中设置**:如果设备使用了一个定制的启动器(Launcher),那么启动器可能会在第一次启动时设置壁纸。因此,修改启动器的默认壁纸也是一种方法。 4. **通过系统应用设置**:有些设备制造商可能会在系统中预置一个壁纸应用,并在首次启动时设置默认壁纸。因此,找到这个应用并修改其默认壁纸也是一种途径。 由于用户是在RK3288设备上修改,很可能需要重新编译系统。因此,我们主要关注第一种方法,即替换框架资源中的默认壁纸。 ### 步骤: 1. **获取系统源码**:首先需要获取RK3288 Android系统的源码,通常设备制造商会提供。 2. **找到默认壁纸文件**:在源码目录中,进入`frameworks/base/core/res/res/drawable-nodpi/`,将准备好的壁纸图片(注意尺寸和格式)替换掉原来的`default_wallpaper.png`(或类似文件)。注意,可能有多个不同分辨率的目录,但`nodpi`是通用的。 3. **重新编译框架资源**:替换后,需要重新编译框架资源模块。可以使用以下命令: ```bash mmm frameworks/base/core/res ``` 或者重新编译整个系统: ```bash make -j8 ``` 4. **刷机**:将生成的系统镜像刷入设备。 ### 注意事项: - 壁纸图片的命名必须与原来一致,否则系统可能找不到。 - 壁纸的尺寸应该与设备分辨率匹配,以避免拉伸或压缩。 - 如果设备制造商修改了壁纸的加载逻辑,可能需要查找具体的代码位置。例如,有些设备可能会在`SystemUI`中设置默认壁纸。 另外,根据用户提供的引用内容,里面提到了电源键和音量键的禁用,这与壁纸修改无关,可能是之前的问题。因此,我们忽略这部分内容。 ### 相关问题 1. 如何获取RK3288Android源码? 2. 除了修改框架资源,还有其他方法修改开机壁纸吗? 3. 如何在不重新编译系统的情况下修改开机壁纸?</think>### 修改RK3288 Android开机壁纸的方法 在RK3288 Android设备上修改开机壁纸需要修改系统级资源文件,主要步骤如下: #### 1. **定位壁纸资源文件** 开机壁纸通常位于系统资源目录: ```bash /frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png ``` 或 ```bash /frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png ``` (不同Android版本路径可能略有差异) #### 2. **替换壁纸文件** - 将自定义壁纸重命名为`default_wallpaper.png` - 覆盖原文件(需注意尺寸匹配设备分辨率) - 推荐使用**无损PNG格式**避免失真 #### 3. **修改资源索引** 在`frameworks/base/core/res/res/values/`目录下检查`config.xml`: ```xml <resources> <!-- 确保指向正确文件 --> <item name="config_default_wallpaper" format="reference">@drawable/default_wallpaper</item> </resources> ``` #### 4. **重新编译系统** ```bash # 编译核心资源模块 source build/envsetup.sh lunch rk3288-eng # 选择对应设备配置 make -j8 frameworks/base/core/res # 生成新system.img make snod ``` #### 5. **烧录固件** 使用Rockchip工具刷入新镜像: ```bash sudo rkflashkit flash system system.img ``` ### 注意事项 1. **壁纸尺寸要求**: - 建议分辨率 ≥ 设备物理分辨率 - 横屏设备推荐16:9或16:10比例 - 文件大小应<3MB(避免OOM) 2. **RK3288特殊配置**: 在`device/rockchip/rk3288/`目录检查是否有覆盖配置: ```bash grep -r "config_default_wallpaper" device/rockchip/ ``` 3. **启动时序**: 壁纸加载在`SystemServer`启动阶段完成,修改后需验证: ```java // SystemServer.java WallpaperManagerService.main(context); // 壁纸服务初始化点 ``` ### 替代方案(无需编译) 通过`adb`推送壁纸(需root): ```bash adb push custom_wallpaper.png /data/system/users/0/wallpaper adb shell chown system:system /data/system/users/0/wallpaper adb reboot ``` > 此方法仅在部分支持动态加载的设备有效[^1] --- ### 相关问题 1. 如何在不重新编译的情况下验证壁纸修改效果? 2. RK3288设备如何调整开机动画(Linux层/Android层)? 3. Android系统服务启动顺序中壁纸加载在哪个阶段? 4. 如何解决替换壁纸后出现的OOM问题? [^1]: 参考Android源码中`WallpaperManagerService`的实现逻辑,动态加载方案依赖具体ROM支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值