高通平台Android11 添加新分区的方法

SW:Android11

HW:QCS6125

需求来源:

    线上的设备进入recovery模式,正常缓存在data分区的日志无法获取:

1、此种情境下只能选择恢复出厂设置,但在恢复之后,data目录下的logcat日志也会被清理;2、recovery模式下无法屏蔽分区加密,处于用户数据安全考虑,无法在该模式挂载userdataimage;

    鉴于此,决定重新创建一个分区,将logcat后台记录的日志文件全部移到此分区,由于此分区不参与recovery的双清操作,因此可保证系统再次启动后,该分区依然有recovery模式之前的日志文件,用来排查导致进入recovery模式的原因。我们这个分区的size定义为100M大小,这个可根据自己需要做调整。

具体操作流程如下:

1、修改common目录下的分区表文件,命名分区为jingang:

diff --git a/config/ufs/partition.xml b/config/ufs/partition.xml
index fafa0b5..f821818 100755
--- a/config/ufs/partition.xml
+++ b/config/ufs/partition.xml
@@ -19,6 +19,7 @@
         <partition label="misc" size_in_kb="1024" type="82ACC91F-357C-4A68-9C8F-689E1B1A23A1" bootable="false" readonly="false" filename="" />
         <partition label="keystore" size_in_kb="512" type="DE7D4029-0F5B-41C8-AE7E-F6C023A02B33" bootable="false" readonly="false" filename="" />
         <partition label="frp" size_in_kb="512" type="91B72D4D-71E0-4CBF-9B8E-236381CFF17A" bootable="false" readonly="false" filename=""/>
+        <partition label="jingang" size_in_kb="102400" type="66b9d1c5-7881-4a82-8f79-22a768a52db2" bootable="false" readonly="false" filename="jingang.img" sparse="true"/>
         <partition label="super" size_in_kb="6291456" type="89A12DE1-5E41-4CB3-8B4C-B1441EB5DA38" bootable="false" readonly="false" filename="super.img" sparse="true"/>
         <partition label="recovery_a" size_in_kb="98304" type="D504D6DB-FA92-4853-B59E-C7F292E2EA19" bootable="false" readonly="true" filename="recovery.img" sparse="true"/>
                <partition label="recovery_b" size_in_kb="98304" type="352B8083-9C0C-4BED-9917-CB5EABD64D41" bootable="false" readonly="true" filename="recovery.img" sparse="true"/>
diff --git a/config/ufs/partition_factory.xml b/config/ufs/partition_factory.xml
index 043c6a1..e16842c 100755
--- a/config/ufs/partition_factory.xml
+++ b/config/ufs/partition_factory.xml
@@ -19,6 +19,7 @@
         <partition label="misc" size_in_kb="1024" type="82ACC91F-357C-4A68-9C8F-689E1B1A23A1" bootable="false" readonly="false" filename="misc.img" />
         <partition label="keystore" size_in_kb="512" type="DE7D4029-0F5B-41C8-AE7E-F6C023A02B33" bootable="false" readonly="false" filename="" />
         <partition label="frp" size_in_kb="512" type="91B72D4D-71E0-4CBF-9B8E-236381CFF17A" bootable="false" readonly="false" filename=""/>
+        <partition label="jingang" size_in_kb="102400" type="66b9d1c5-7881-4a82-8f79-22a768a52db2" bootable="false" readonly="false" filename="jingang.img" sparse="true"/>
         <partition label="super" size_in_kb="6291456" type="89A12DE1-5E41-4CB3-8B4C
<think>我们参考了引用[2]中关于开机logo修改的方法,因为关机动画的实现可能与开机动画类似。同时,引用[3]和[4]提供了关机流程的相关信息,这有助于我们理解在关机过程中插入动画的时机。 在高通平台上实现关机动画,通常有两种方法: 1. 修改系统源码,在关机流程中调用动画播放器。 2. 替换关机动画资源文件(类似于开机动画)。 根据引用[3]和[4],Android关机流程会执行`android_reboot`函数,最终调用`reboot(RB_POWER_OFF)`。在关机前,我们可以插入播放动画的步骤。 但是,请注意,关机动画的播放需要在系统完全关闭之前完成,并且不能影响正常的关机流程。 **解决方案步骤:** 1. **准备关机动画文件**: 关机动画通常是一个压缩包,包含一系列图片和描述文件`desc.txt`。这个文件的结构与开机动画类似。例如,我们可以创建一个名为`shutdownanimation.zip`的压缩包,放在系统某个目录下(如`/system/media/`)。 2. **修改系统代码以支持关机动画**: 在关机流程中,我们需要在真正执行关机命令之前播放动画。参考引用[4],关机流程中会弹出一个关机菜单,当用户确认关机后,会进入关机流程。我们可以在执行`reboot(RB_POWER_OFF)`之前启动动画播放。 具体修改位置可能在`ShutdownThread.java`中。例如,在`shutdownInner`方法中,在调用`PowerManagerService`的`shutdown`方法之前,启动一个服务来播放动画。 但是,由于关机过程需要卸载文件系统,因此动画播放必须在只读文件系统挂载之前完成。因此,我们需要将动画文件放在一个不会被卸载的分区(比如`/system`分区)中,并在关机流程早期播放动画。 3. **修改关机流程代码**: 在`frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java`中,找到`run`方法,在`beginShutdown`之后,我们可以启动动画播放。 伪代码修改如下: ```java // 在run()方法中 ... beginShutdown(); // 启动关机动画 playShutdownAnimation(); ... ``` 然后,我们需要实现`playShutdownAnimation`方法,该方法可以通过调用一个本地服务或者直接执行一个命令来播放动画。 实际上,Android系统本身可能没有内置关机动画播放功能,因此我们需要参考开机动画的播放机制(`BootAnimation`服务)来实现一个类似的`ShutdownAnimation`服务。 4. **实现关机动画服务**: 我们可以参考开机动画的代码(`BootAnimation`),编写一个`ShutdownAnimation`服务。该服务同样是一个本地服务,通过读取`shutdownanimation.zip`文件来播放动画。 在`ShutdownThread`中,我们可以通过发送意图或者直接启动这个服务来播放动画。 5. **修改权限和资源**: 确保动画文件有正确的权限(通常为644),并且服务有权限读取该文件。 6. **测试**: 由于修改了系统核心代码,需要重新编译系统,并刷机测试。 **注意事项**: - 由于关机过程需要保证可靠性,动画播放时间不能过长,否则会导致关机时间过长,影响用户体验。 - 如果动画播放失败,应该能够跳过并继续关机流程。 **示例代码片段**: 在`ShutdownThread.java`的`run`方法中,添加如下代码: ```java private void playShutdownAnimation() { try { // 启动关机动画服务 Intent intent = new Intent(); intent.setClassName("com.android.systemui", "com.android.systemui.ShutdownAnimation"); mContext.startService(intent); // 为了确保动画有足够时间开始,可以稍微等待一下 Thread.sleep(500); } catch (Exception e) { Log.e(TAG, "Failed to play shutdown animation", e); } } ``` 然后,在`ShutdownAnimation`服务中,我们需要实现类似`BootAnimation`的渲染逻辑,但使用`shutdownanimation.zip`作为资源。 **替代方案**: 如果不想修改系统代码,可以尝试在系统关机前通过应用层播放动画。但是,这种方法不可靠,因为应用层在关机过程中会被杀死。 因此,推荐在系统底层添加关机动画服务。 **总结**: 实现高通平台Android关机动画需要修改系统源码,添加关机动画服务,并在关机流程中适时调用。这需要对Android关机流程和动画播放机制有深入理解。 §§相关问题§§ 1. 如何制作Android系统的关机动画压缩包? 2. 在Android系统中,如何添加一个新的系统服务(如ShutdownAnimation)? 3. 如何在高通平台Android源码中修改关机流程?</think>### 高通平台 Android 实现关机动画的解决方案 在高通平台实现 Android 关机动画,可通过以下两种方案实现,核心是修改系统底层的关机流程并添加动画资源: --- #### **方案一:修改系统关机流程(推荐)** 1. **添加关机动画服务** - 在 `frameworks/base/services/core/java/com/android/server/power/` 创建 `ShutdownAnimation.java` - 核心代码参考开机动画服务 `BootAnimation`: ```java public class ShutdownAnimation extends Thread { @Override public void run() { // 加载关机动画资源 /system/media/shutdownanimation.zip playAnimation(); } } ``` 2. **集成到关机流程** - 修改 `ShutdownThread.java`: ```java // 在 shutdownInner() 方法添加 if (mReboot) { // 重启逻辑 } else { new ShutdownAnimation().start(); // 启动关机动画 PowerManagerService.lowLevelShutdown(); // 调用底层关机 } ``` - 同步修改 `android_reboot.c` 确保动画播放完毕再断电[^3] 3. **添加资源文件** - 创建关机动画包:`shutdownanimation.zip`(包含 PNG 序列帧和 `desc.txt` 描述文件) - 部署路径:`/system/media/` - 权限设置:`chmod 644 /system/media/shutdownanimation.zip` --- #### **方案二:替换系统资源(快速实现)** 1. **利用现有开机动画机制** - 将关机动画重命名为 `bootanimation.zip` - 在关机流程中临时替换文件: ```java // ShutdownThread.java 中增加 FileUtils.copyFile( new File("/custom/shutdownanimation.zip"), new File("/system/media/bootanimation.zip") ); ``` 2. **修改高通专属路径** - 针对高通平台的特殊路径: ```bash /vendor/qcom/proprietary/qrdplus/Extension/apps/ShutdownAnimation ``` - 在此目录添加关机动画资源[^2] --- #### **关键配置** 1. **权限声明** - 在 `AndroidManifest.xml` 添加系统权限: ```xml <uses-permission android:name="android.permission.SHUTDOWN" /> <uses-permission android:name="org.codeaurora.permission.POWER_OFF_ALARM" /> [^1] ``` 2. **内核级修改** - 确保内核支持关机延时: ```c // kernel/reboot.c kernel_power_off_prepare(); mdelay(3000); // 预留3秒动画时间 ``` 3. **动画规范** - 帧率控制:`desc.txt` 示例: ``` 720 1280 30 p 1 0 part0 p 0 0 part1 ``` --- #### **验证步骤** 1. 编译刷写修改后的系统镜像 2. 触发关机命令: ```bash adb shell reboot -p ``` 3. 通过串口日志确认动画加载: ``` I/ShutdownAnimation: Playing shutdown animation... ``` > **注意事项**: > 1. 动画时长需控制在 3 秒内避免用户感知延迟 > 2. 优先使用方案一,避免开机动画被覆盖 > 3. 高通平台需检查 `RB_POWER_OFF` 的硬件兼容性[^3][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值