!本文仅适用于高通平台或谷歌原生 !
有时候产品定制需要添加关机动画,然而上网搜索发现只有开机动画的教程,没有关机动画相关教程。 开机动画很简单,只需要放动画在路径下就可以了,不需要在代码上做改动。 关机动画和关机动画是同一种动画格式,制作方法可以参考这个链接android+制作开机动画,Android 开机动画制作详解-腾讯云开发者社区-腾讯云 (tencent.com)
然后用mk文件先把动画预置进去,这里我预置在了/oem/media下面
先看frameworks/base/cmds/bootanimation/BootAnimation.cpp,我们发现其实这里已经添加了识别开机、关机动画的一些路径,因此推测安卓原生已经实现了一部分关机动画播放。
frameworks/base/cmds/bootanimation/BootAnimation.cpp
//我把关机动画放在这个路径下
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/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";
所以我直接添加代码
mSession = new SurfaceComposerClient();
std::string powerCtl = android::base::GetProperty("sys.powerctl", "");
//添加我自己的关机属性
++ std::string frfrf = android::base::GetProperty("persist.vendor.data.shutanim", "false");
if (powerCtl.empty()) {
mShuttingDown = false;
//判断
++ if(frfrf == "true"){
++ mShuttingDown = true;
++ }
} else {
mShuttingDown = true;
}
++ if(frfrf){
++ android::base::SetProperty("persist.vendor.data.shutanim", "false");
++ }
ALOGD("%sAnimationStartTiming start time: %" PRId64 "ms", mShuttingDown ? "Shutdown" : "Boot",
elapsedRealtime());
}
然后在frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java设置关机属性
if (mRebootHasProgressBar) {
sInstance.setRebootProgress(MOUNT_SERVICE_STOP_PERCENT, null);
// If it's to reboot to install an update and uncrypt hasn't been
// done yet, trigger it now.
uncrypt();
}
//设置关机属性
++ SystemProperties.set("persist.vendor.data.shutanim","true");
++ SystemProperties.set("ctl.start","shutdownanim");
// Wait for the check points dump thread to finish, or kill it if not finished in time.
shutdownTimingLog.traceBegin("ShutdownCheckPointsDumpWait");
到这关机动画基本就添加好了,距离完全可用还差个SELinux权限,可以先
adb root && adb shell setenforce 0临时关闭权限查看关机动画效果
明天继续更新如何添加SELinux权限 不同平台的selinux权限添加不同,这里以高通平台为例
+++ b/vendor/device/qcom/sepolicy_vndr/qva/vendor/common/property_contexts
@@ -164,3 +164,4 @@ vendor.qesdk.ready u:object_r:vendor_qesdk_ready_prop:
+persist.vendor.data.shutanim u:object_r:vendor_shutdown_prop:s0
#u:object_r: 表示这是一个对象(object),其角色(role)是用户(user)
#vendor_shutdown_prop: 这是对象的类型(type),通常表示为资源或进程的标签,用于 SELinux 的访问控制。
#s0: 这是安全上下文的安全级别,通常表示为安全级别 0
上面提到的vendor_shutdown_prop是对象类型,通常表示为资源或进程的标签,因此新建了一个bootanim.te来使用它。
--- /dev/null
+++ b/vendor/device/qcom/sepolicy_vndr/qva/vendor/common/bootanim.te
+set_prop(bootanim,vendor_shutdown_prop)
+++ b/vendor/device/qcom/sepolicy_vndr/qva/vendor/common/system_server.te
@@ -76,3 +76,6 @@ get_prop(system_server, vendor_audio_prop)
#允许system_server进程访问这两个属性
+set_prop(system_server,vendor_shutdown_prop)
+set_prop(system_server, ctl_start_prop)