当前位置: 代码迷 >> 综合 >> [RK3288][Android7.1] 调试笔记 --- 横竖屏加载不同的开机动画
  详细解决方案

[RK3288][Android7.1] 调试笔记 --- 横竖屏加载不同的开机动画

热度:92   发布时间:2023-10-09 13:50:36.0

Platform: RK3288
OS: Android 7.1.2
Kernel: v4.4.143

需求:

Android系统项目定制开机动画,自定义的开机动画需保存在/system/media/bootanimation.zip,终端在横竖屏状态加载不同的bootanimation.zip,以实现在横竖屏的LOGO都能正常显示不拉伸。

解决:

1、制作横屏和竖屏的bootanimation.zip

方法1:

路径:/device/rockchip/rk3288/bootanimation

在源码里添加放置两个bootanimation.zip,举例命名为bootanimation_h.zip和bootanimation_v.zip分别代表横屏的LOGO和竖屏的LOGO;

路径:/device/rockchip/rk3288/rk3288.mk

编译时会将/device/rockchip/rk3288/bootanimation/的两个压缩包拷贝到system/media/目录下

PRODUCT_COPY_FILES += device/rockchip/rk3288/bootanimation/bootanimation_v.zip:system/media/bootanimation_v.zip
PRODUCT_COPY_FILES += device/rockchip/rk3288/bootanimation/bootanimation_h.zip:system/media/bootanimation_h.zip

方法2:

路径:out/target/product/rk3288/system/media

直接在此路径放置压缩包,打包时会自动存到系统/system/media/目录下

2、通过判断横竖屏执行不同的bootanimation

diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 24c8fa4..86bb671 100755
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -64,13 +64,17 @@namespace android {+#define CONFIG_DATA_FILES_PLAYINGstatic const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
-static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip";
+static const char SYSTEM_BOOTANIMATION_ROTATION_HENG_FILE[] = "/system/media/bootanimation_h.zip";
+static const char SYSTEM_BOOTANIMATION_ROTATION_SHU_FILE[] = "/system/media/bootanimation_v.zip";static const char SYSTEM_SHUTDOWNANIMATION_FILE[] = "/system/media/shutdownanimation.zip";static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip";//support boot videostatic const char DATA_BOOTVIDEO_FILE[] = "/data/local/bootanimation.ts";
-static const char SYSTEM_BOOTVIDEO_FILE[] = "/system/media/bootanimation.ts";
+//static const char SYSTEM_BOOTVIDEO_FILE[] = "/system/media/bootanimation.ts";
+
+static const char SYSTEM_BOOTVIDEO_FILE[] = "/system/media/bootanimation.mp4";static const char SYSTEM_DATA_DIR_PATH[] = "/data/system";static const char SYSTEM_TIME_DIR_NAME[] = "time";static const char SYSTEM_TIME_DIR_PATH[] = "/data/system/time";
@@ -97,6 +101,8 @@ static const int ANIM_ENTRY_NAME_MAX = 256;static constexpr size_t TEXT_POS_LEN_MAX = 16;static const char BOOT_COMPLETED_PROP_NAME[] = "sys.boot_completed";static const char BOOTREASON_PROP_NAME[] = "ro.boot.bootreason";
+static int mBootLogoMode = 0;
+String8 systemBootanimationFile;// bootreasons list in "system/core/bootstat/bootstat.cpp".static const std::vector<std::string> PLAY_SOUND_BOOTREASON_BLACKLIST {"kernel_panic",
@@ -116,6 +122,11 @@ BootAnimation::BootAnimation(bool shutdown) : Thread(false), mClockEnabled(true)mReverseAxis = false;mVideoFile = NULL;mVideoAnimation = false;
+	  char property[PROPERTY_VALUE_MAX];
+	  if (property_get("ro.sf.hwrotation", property, "0") > 0) {
+      mBootLogoMode = atoi(property);
+    }if(mShutdown){sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain)); // primary_display_token
@@ -343,11 +354,23 @@ status_t BootAnimation::readyToRun() {mFlingerSurfaceControl = control;mFlingerSurface = s;+    mDataZipAnimtaion = false;
+// If the device has encryption turned on or is in process// of being encrypted we show the encrypted boot animation.char decrypt[PROPERTY_VALUE_MAX];property_get("vold.decrypt", decrypt, "");bool encryptedAnimation = atoi(decrypt) != 0 || !strcmp("trigger_restart_min_framework", decrypt);
+	    if (mBootLogoMode == 0||mBootLogoMode == 180) {
+		     ALOGE("SYSTEM_BOOTANIMATION_ROTATION_HENG_FILE");
+             systemBootanimationFile = SYSTEM_BOOTANIMATION_ROTATION_HENG_FILE;
+        }else if(mBootLogoMode == 90||mBootLogoMode == 270){
+		    ALOGE("GCC SYSTEM_BOOTANIMATION_ROTATION_SHU_FILE");
+    	    systemBootanimationFile = SYSTEM_BOOTANIMATION_ROTATION_SHU_FILE;
+		}else {
+			 ALOGE("SYSTEM_BOOTANIMATION_ROTATION_HENG_FILE");
+             systemBootanimationFile = SYSTEM_BOOTANIMATION_ROTATION_HENG_FILE;
+		}if (!mShutdown) {if (encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0)) {mZipFileName = SYSTEM_ENCRYPTED_BOOTANIMATION_FILE;
@@ -355,8 +378,8 @@ status_t BootAnimation::readyToRun() {else if (access(OEM_BOOTANIMATION_FILE, R_OK) == 0) {mZipFileName = OEM_BOOTANIMATION_FILE;}
-        else if (access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) {
-            mZipFileName = SYSTEM_BOOTANIMATION_FILE;
+        else if (access(systemBootanimationFile, R_OK) == 0) {
+            mZipFileName = systemBootanimationFile;}//add for boot video
@@ -747,7 +770,7 @@ bool BootAnimation::parseAnimationDesc(Animation& animation)part.count = 1;part.pause = 0;part.audioData = NULL;
-            part.animation = loadAnimation(String8(SYSTEM_BOOTANIMATION_FILE));
+            part.animation = loadAnimation(String8(systemBootanimationFile));if (part.animation != NULL)animation.parts.add(part);}
diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h
index cc043bb..4f263bb 100755
--- a/cmds/bootanimation/BootAnimation.h
+++ b/cmds/bootanimation/BootAnimation.h
@@ -160,6 +160,7 @@ private:bool        mSystemBoot;String8     mZipFileName;bool mVideoAnimation;
+    bool mDataZipAnimtaion;char* mVideoFile;nsecs_t mStartbootanimaTime;int  mBootVideoTime;

原理:

---后面补充---

  相关解决方案