客户有需求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 认证,就不能这么干了
未完待续