android 开机动画动态替换

客户有需求apk 可以动态修改开机动画,按照android 系统原生逻辑是没有办法做到的

代码位置frameworks/base/cmds/bootanimation

static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimation-dark.zip";
static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootanim/bootanimation.zip";
static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip";
static const char APEX_BOOTANIMATION_FILE[] = "/apex/com.android.bootanimation/etc/bootanimation.zip";
static const char PRODUCT_ENCRYPTED_BOOTANIMATION_FILE[] = "/product/media/bootanimation-encrypted.zip";
static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip";
static const char OEM_SHUTDOWNANIMATION_FILE[] = "/oem/media/shutdownanimation.zip";
static const char PRODUCT_SHUTDOWNANIMATION_FILE[] = "/product/media/shutdownanimation.zip";
static const char SYSTEM_SHUTDOWNANIMATION_FILE[] = "/system/media/shutdownanimation.zip";

可以看到定制开机动画 是zip文件放到 system/media  或者product/media 下面,自动生效,我们进入shell 发现

 除了root 权限,apk 是没有办法访问这个路径的,所以这个路径是不行了.

但是ODM 是万能的,有源码,而且项目不需要过GMS 认证,所以好像又可以实现了,

尝试方法1:

按照以前惯例,先说具体实现,直接上代码

在对应项目的rc 文件中 init.*.rc 或者init.rc 都可以

//文件系统挂载的时候,新建一个路径,并且设置可读写
on fs
    mkdir /mnt/vendor/bootanim  0777 system system
    restorecon_recursive /mnt/vendor/bootanim
    chmod 0666 /mnt/vendor/bootanim/bootanimation.zip  



//监听apk 设置的属性变化,属性值对应文件路径
on property:vendor.animation.file.path=*
    start copy_bootanimation

//启动copy 脚本
service copy_bootanimation /vendor/bin/copy_bootanimation.sh
    class main
    user root
    group shell root system
    disabled
    oneshot  

拷贝的脚本copy_bootanimation.sh

#! /vendor/bin/sh

bootanimtionp=`getprop vendor.animation.file.path`
cp -rf $bootanimtionp  /mnt/vendor/bootanim/

在编译mk 中copy 脚本到对应位置,我这边放到的是vendor 下面,一定要对应上面启动脚本的路径
PRODUCT_COPY_FILES += vendor/xxxx/copy_bootanimation.sh:vendor/bin/copy_bootanimation.sh
 

修改动画路径

frameworks/base / cmds/bootanimation/BootAnimation.cpp

static const char SYSTEM_BOOTANIMATION_FILE[] = "/mnt/vendor/bootanim/bootanimation.zip";

上层api 调用的接口

@Override
    public boolean setBootingAnimation(Bundle resources) throws RemoteException {
        String animationPath = resources.getString("animpath","");
        try {
            SystemProperties.set("vendor.animation.file.path",animationPath);
        }catch (Exception e) {
            Slog.d(TAG,"==================setBootingAnimation "+e.toString());
            return false;
        }
        return true;
    }

这样整个流程就完整结束了,思路比较简单,难点如下

1,新增可执行脚本

2,添加对应的selinux 权限

我是加了一天才加完,当然了,这个是违反nevelallow 规则的,如果是GMS 认证,就不能这么干了

未完待续

参考:Android 开机动画动态替换_Aiden.liu的博客-优快云博客_android 开机动画替换

android 9.0 动态修改开机动画保存的路径_深圳之光的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值