目录
📂 前言
AR 眼镜系统版本
开关机定制
1. 🔱 技术方案
1.1 技术方案概述
1.2 实现方案
1)开机 Logo
2)开机音效
3)开机动画
4)关机动画
5)关机弹窗
2. 💠 开机 Logo
2.1 使用原厂烧机工具验证
2.2 定制开机 Logo 文件
3. ⚛️ 关机弹窗
3.1 长按电源键关机时序图
3.2 关机弹窗 UI 定制
步骤一:在 ./frameworks/base/core/res/res/values/config.xml 文件中增删弹窗内选项
步骤二:在 ./frameworks/base/core/res/res/layout/global_actions_item.xml 文件调整界面 UI;
步骤三:为关机/重启使用的 SinglePressAction 增加 Hover 前后的图片替换逻辑;
3.3 定制点击关机/重启后的功能逻辑
步骤一:在 ShutdownThread 文件的 shutdownInner 方法中定制关机逻辑
步骤二:在 ShutdownThread 文件的 beginShutdownSequence 方法中定制关机过程的 UI(AggShutdownDialog)
4. ✅ 小结
📂 前言
AR 眼镜系统版本
W517 Android9。
开关机定制
开关机定制主要包括:开机 Logo、开机音效、开机动画、关机动画、关机弹窗,下面我们主要针对如上五部分进行定制。
1. 🔱 技术方案
1.1 技术方案概述
开机 Logo 主要是 Logo 文件替换;对于开机音效、开机动画以及关机动画,主要是将相应文件内置到对应位置即可;而对于关机弹窗,是需要定制长按电源键的关机弹窗流程和UI修改的,会相对复杂一些。
1.2 实现方案
1)开机 Logo
-
先使用原厂烧机工具验证,在如下目录替换 Logo 文件和 fastboot 文件后烧机验证是否生效:ResearchDownload_R25.21.1401\Bin\ImageFiles\_DownloadFiles2EC4_1153FD4_0\;
-
将 Logo 文件放置到如下位置:vendor\sprd\release\IDH\uws6151_1h10_gofu-userdebug-native\W517_1h10_GOFU\unisoc_HWVGA_480_640.bmp 以及 vendor\sprd\release\IDH\uws6151_1h10_gofu-user-native\W517_1h10_GOFU\unisoc_HWVGA_480_640.bmp;
-
将 fastboot 使用的 Logo 文件放置到如下位置:vendor\sprd\release\IDH\uws6151_1h10_gofu-userdebug-native\W517_1h10_GOFU\unisoc_HWVGA_480_640.bmp(1) 以及 vendor\sprd\release\IDH\uws6151_1h10_gofu-user-native\W517_1h10_GOFU\unisoc_HWVGA_480_640.bmp(1)。
2)开机音效
-
内置 bootsound.mp3,将 bootsound.mp3 文件放在如下路径:device\sprd\sharkl5\uws6151_1h10_go\;
-
配置烧机时将文件内置到整机,在 device\sprd\sharkl5\uws6151_1h10_go\uws6151_1h10_gofu.mk 文件中增加如下内容:PRODUCT_COPY_FILES += $(BOARDDIR)/bootsound.mp3:system/media/bootsound.mp3。
由于此部分相对简单,所以后文不再单独章节介绍。
3)开机动画
-
制作 bootanimation.zip,本人在此文章有详细介绍,这里就不再赘述了:Android 自定义开机动画_rk3568更换开机动画-CSDN博客
-
内置 bootanimation.zip,将 bootanimation.zip 文件放在如下路径:device\sprd\sharkl5\uws6151_1h10_go\;
-
配置烧机时将文件内置到整机,在 device\sprd\sharkl5\uws6151_1h10_go\uws6151_1h10_gofu.mk 文件中增加如下内容:PRODUCT_COPY_FILES += $(BOARDDIR)/bootanimation.zip:system/media/bootanimation.zip。
由于此部分相对简单,所以后文不再单独章节介绍。
4)关机动画
与开机动画的制作与定制基本完全一样,将 bootanimation.zip 改为 shutdownanimation.zip 即可。
-
制作 shutdownanimation.zip,本人在此文章有详细介绍,这里就不再赘述了:Android 自定义开机动画_rk3568更换开机动画-CSDN博客
-
内置 shutdownanimation.zip,将 shutdownanimation.zip 文件放在如下路径:device\sprd\sharkl5\uws6151_1h10_go\;
-
配置烧机时将文件内置到整机,在 device\sprd\sharkl5\uws6151_1h10_go\uws6151_1h10_gofu.mk 文件中增加如下内容:PRODUCT_COPY_FILES += $(BOARDDIR)/bootanimation.zip:system/media/shutdownanimation.zip。
由于此部分相对简单,所以后文不再单独章节介绍。
5)关机弹窗
-
梳理长按电源键关机弹窗逻辑,从 PhoneWindowMananger 按键响应 power 键长按事件到 SystemUI 弹出关机界面 dialog 的流程。Android 原生的关机界面有两种,一种是 LegacyGlobalActions 中的 dialog,另一种是 SystemUI 中的 GlobalActionsDialog,常规情况下默认是弹出 SystemUI 中的关机界面,当 SystemUI 没有正常工作时才会弹出 LegacyGlobalActions 中的关机界面,本文我们分析正常情况 SystemUI 弹出的 GlobalActionsDialog;
-
关机弹窗 UI 定制,可在 ./frameworks/base/core/res/res/values/config.xml 文件中增删弹窗内选项,也可在 ./frameworks/base/core/res/res/layout/global_actions_item.xml 文件中调整界面 UI 等;
-
定制点击关机/重启后的功能逻辑,关机/重启时可显示厂商的定制化 UI。
2. 💠 开机 Logo
2.1 使用原厂烧机工具验证
替换 unisoc_HWVGA_480_640.bmp Logo 文件以及 unisoc_HWVGA_480_640.bmp(1) fastboot 文件烧机验证是否生效。
2.2 定制开机 Logo 文件
替换 Logo 文件和 fastboot 文件。
3. ⚛️ 关机弹窗
3.1 长按电源键关机时序图
3.2 关机弹窗 UI 定制
步骤一:在 ./frameworks/base/core/res/res/values/config.xml 文件中增删弹窗内选项
<string-array translatable="false" name="config_globalActionsList">
<item>power</item>
<item>restart</item>
<!-- // Agg patch-->
<!-- // Add by agg 2024-03-07-->
<!-- <item>lockdown</item>-->
<!-- <item>logout</item>-->
<!-- <item>bugreport</item>-->
<!-- <item>screenshot</item>-->
<!-- // Agg patch end-->
</string-array>
只保留关机和重启选项。
步骤二:在 ./frameworks/base/core/res/res/layout/global_actions_item.xml 文件调整界面 UI;
步骤三:为关机/重启使用的 SinglePressAction 增加 Hover 前后的图片替换逻辑;
./frameworks/base/core/java/com/android/internal/globalactions/SinglePressAction.java:
v.setOnHoverListener((view, event) -> {
if (event.getAction() == MotionEvent.ACTION_HOVER_ENTER) {
view.setBackgroundResource(R.drawable.ic_power_off_restart_bg_foc);
AnimationUtils.getInstance().selectItemAnimator(view);
} else if (event.getAction() == MotionEvent.ACTION_HOVER_EXIT) {
AnimationUtils.getInstance().unSelectItemAnimator(view);
view.setBackgroundResource(R.drawable.ic_power_off_restart_bg_nor);
}
return false;
});
3.3 定制点击关机/重启后的功能逻辑
用户点击关机时序图如下:
步骤一:在 ShutdownThread 文件的 shutdownInner 方法中定制关机逻辑
private static void shutdownInner(final Context context, boolean confirm) {
// ShutdownThread is called from many places, so best to verify here that the context passed
// in is themed.
context.assertRuntimeOverlayThemable();
// ensure that only one thread is trying to power down.
// any additional calls are just returned
synchronized (sIsStartedGuard) {
if (sIsStarted) {
Log.d(TAG, "Request to shutdown already running, returning.");
return;
}
}
final int longPressBehavior = context.getResources().getInteger(
com.android.internal.R.integer.config_longPressOnPowerBehavior);
final int resourceId = mRebootSafeMode
? com.android.internal.R.string.reboot_safemode_confirm
/*UNISOC bug 908624,add confirm dialog.*/
: (mReboot
? com.android.internal.R.string.reboot_device_confirm
/*UNISOC bug 908624,add confirm dialog.*/
: (longPressBehavior == 2
? com.android.internal.R.string.shutdown_confirm_question
: com.android.internal.R.string.shutdown_confirm));
Log.d(TAG, "Notifying thread to start shutdown longPressBehavior=" + longPressBehavior);
// Agg patch
// Add by agg 2024-05-22
beginShutdownSequence(context);
// Agg patch end
// if (confirm) {
// final CloseDialogReceiver closer = new CloseDialogReceiver(context);
// if (sConfirmDialog != null) {
// sConfirmDialog.dismiss();
// }
// sConfirmDialog = new AlertDialog.Builder(context)
// .setTitle(mRebootSafeMode
// ? com.android.internal.R.string.reboot_safemode_title
// /*UNISOC bug 908624*/
// :(mReboot
// ? com.android.internal.R.string.reboot_device_title
// /*UNISOC bug 908624*/
// : com.android.internal.R.string.power_off))
// .setMessage(resourceId)
// .setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() {
// public void onClick(DialogInterface dialog, int which) {
// beginShutdownSequence(context);
// }
// })
// .setNegativeButton(com.android.internal.R.string.no, null)
// .create();
// closer.dialog = sConfirmDialog;
// sConfirmDialog.setOnDismissListener(closer);
// sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
// sConfirmDialog.show();
// } else {
// beginShutdownSequence(context);
// }
}
步骤二:在 ShutdownThread 文件的 beginShutdownSequence 方法中定制关机过程的 UI(AggShutdownDialog)
private static void beginShutdownSequence(Context context) {
synchronized (sIsStartedGuard) {
if (sIsStarted) {
Log.d(TAG, "Shutdown sequence already running, returning.");
return;
}
sIsStarted = true;
}
// SPRD:add for shutdownanim
if (shutdownAnim.hasShutdownAnimation() &&
!(mReason != null && mReason.startsWith(PowerManager.REBOOT_RECOVERY_UPDATE))) {
shutdownAnim.playShutdownAnimation();
} else {
// MetaBounds patch
// Add by tianbinbin 2024-07-30
// sInstance.mProgressDialog = showShutdownDialog(context);
MBShutdownDialog shutdownDialog = new MBShutdownDialog(context);
shutdownDialog.show();
if (mReboot) {
shutdownDialog.setMessage(context.getText(com.android.internal.R.string.reboot_to_reset_message));
} else {
shutdownDialog.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
}
// MetaBounds patch end
}
4. ✅ 小结
对于开关机定制,本文只是一个基础实现方案,更多业务细节请参考产品逻辑去实现。
另外,由于本人能力有限,如有错误,敬请批评指正,谢谢。