基于Andriod13的关机动画添加方案

904 阅读3分钟

!本文仅适用于高通平台或谷歌原生 !

有时候产品定制需要添加关机动画,然而上网搜索发现只有开机动画的教程,没有关机动画相关教程。 开机动画很简单,只需要放动画在路径下就可以了,不需要在代码上做改动。 关机动画和关机动画是同一种动画格式,制作方法可以参考这个链接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)

觉得有用的话可以给个小小的赞鼓励一下