20250602在荣品的PRO-RK3566开发板的Android13下打开关机对话框
20250602在荣品的PRO-RK3566开发板的Android13下打开关机对话框
2025/6/2 15:07
缘起:需要在荣品的PRO-RK3566开发板的Android13下,打开/增加关机对话框这个功能。
因为手机都有。那我们就找资料吧。
参考资料:
https://blog.csdn.net/terry_xiwang/article/details/122721784
RK3568 Android12 长按power键功能设置
Platform: RK3566
OS: Android 13
Kernel: v5.10.157
SDK Version:?
console:/ # uname -a
Linux localhost 5.10.157 #2 SMP PREEMPT Fri May 30 14:46:55 CST 2025 aarch64 Toybox
console:/ #
问题
在测试Android12时发现,长按power键没有反应。对比Android11,是会弹出关机菜单,有emergency,power off和 reboot 这几个选项。
解决方案
frameworks/base/core/res/res/values/config.xml 中修改config_longPressOnPowerBehavior的属性值
简单分析
查了下这应该是Android12的新特性,长按关机默认功能是唤醒Google Assistant,我的机器中没有预装该应用所以就没有任何反应。
可以在Settings——System——Gestures——Press and hold power button中关闭Hold for Assistant功能,关闭后测试长按power键是可以直接关机,但没有出现任何提示。这样也不太好,最好是能和Android11的效果类似。
跟下settings源码
RK3568的Android12在这里:
packages/apps/Settings/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
可以看到getSummary() 的显示是根据getPowerButtonValue() 的值来判断的
@Override
public CharSequence getSummary() {
final int powerButtonValue = getPowerButtonValue();
if (powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) {
return mContext.getString(R.string.power_menu_summary_long_press_for_assist_enabled);
} else if (powerButtonValue == LONG_PRESS_POWER_GLOBAL_ACTIONS) {
return mContext.getString(
R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu);
} else {
return mContext.getString(
R.string.power_menu_summary_long_press_for_assist_disabled_no_action);
}
}
getPowerButtonValue() 是获取POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE的值
private int getPowerButtonValue() {
return Settings.Global.getInt(mContext.getContentResolver(),
POWER_BUTTON_LONG_PRESS_SETTING,
mContext.getResources().getInteger(POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE));
}
/**
* Value used for long press power button behaviour when the Assist setting is disabled.
* If this value matches Assist setting, then it falls back to Global Actions panel or
* power menu, depending on their respective settings.
*/
private static final int POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE =
com.android.internal.R.integer.config_longPressOnPowerBehavior;
rootroot@rootroot-X99-Turbo:~/Android13.0/packages/apps/Settings/src/com/android/settings$ cd gestures/
rootroot@rootroot-X99-Turbo:~/Android13.0/packages/apps/Settings/src/com/android/settings/gestures$ ll
total 256
drwxrwxr-x 2 rootroot rootroot 4096 12月 10 10:07 ./
drwxrwxr-x 61 rootroot rootroot 4096 12月 10 10:07 ../
-rw-rw-r-- 1 rootroot rootroot 1309 12月 10 10:07 AssistGestureFeatureProviderImpl.java
-rw-rw-r-- 1 rootroot rootroot 1301 12月 10 10:07 AssistGestureFeatureProvider.java
-rw-rw-r-- 1 rootroot rootroot 3515 12月 10 10:07 AssistGestureSettings.java
-rw-rw-r-- 1 rootroot rootroot 4844 12月 10 10:07 AssistGestureSettingsPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 5224 12月 10 10:07 BackGestureIndicatorDrawable.java
-rw-rw-r-- 1 rootroot rootroot 4000 12月 10 10:07 BackGestureIndicatorView.java
-rw-rw-r-- 1 rootroot rootroot 2408 12月 10 10:07 ButtonNavigationSettingsAssistController.java
-rw-rw-r-- 1 rootroot rootroot 2467 12月 10 10:07 ButtonNavigationSettingsFragment.java
-rw-rw-r-- 1 rootroot rootroot 2716 12月 10 10:07 DoubleTapPowerPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2350 12月 10 10:07 DoubleTapPowerSettings.java
-rw-rw-r-- 1 rootroot rootroot 3339 12月 10 10:07 DoubleTapScreenPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2651 12月 10 10:07 DoubleTapScreenSettings.java
-rw-rw-r-- 1 rootroot rootroot 2734 12月 10 10:07 DoubleTwistGestureSettings.java
-rw-rw-r-- 1 rootroot rootroot 4418 12月 10 10:07 DoubleTwistPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2021 12月 10 10:07 GestureNavigationSettingsAssistController.java
-rw-rw-r-- 1 rootroot rootroot 6209 12月 10 10:07 GestureNavigationSettingsFragment.java
-rw-rw-r-- 1 rootroot rootroot 2831 12月 10 10:07 GesturePreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2716 12月 10 10:07 GestureSettings.java
-rw-rw-r-- 1 rootroot rootroot 3802 12月 10 10:07 GesturesSettingPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2372 12月 10 10:07 GlobalActionsPanelPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 3154 12月 10 10:07 LongPressPowerFooterPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 3355 12月 10 10:07 LongPressPowerForAssistantPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 3360 12月 10 10:07 LongPressPowerForPowerMenuPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2872 12月 10 10:07 LongPressPowerIllustrationPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 5219 12月 10 10:07 LongPressPowerSensitivityPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 3666 12月 10 10:07 OneHandedActionPullDownPrefController.java
-rw-rw-r-- 1 rootroot rootroot 3675 12月 10 10:07 OneHandedActionShowNotificationPrefController.java
-rw-rw-r-- 1 rootroot rootroot 2655 12月 10 10:07 OneHandedEnablePreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 3346 12月 10 10:07 OneHandedMainSwitchPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 1728 12月 10 10:07 OneHandedPreferenceCategoryController.java
-rw-rw-r-- 1 rootroot rootroot 5730 12月 10 10:07 OneHandedSettings.java
-rw-rw-r-- 1 rootroot rootroot 11811 12月 10 10:07 OneHandedSettingsUtils.java
-rw-rw-r-- 1 rootroot rootroot 3301 12月 10 10:07 PickupGesturePreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2531 12月 10 10:07 PickupGestureSettings.java
-rw-rw-r-- 1 rootroot rootroot 1539 12月 10 10:07 PowerMenuPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 1488 12月 10 10:07 PowerMenuSettings.java
-rw-rw-r-- 1 rootroot rootroot 6982 12月 10 10:07 PowerMenuSettingsUtils.java
-rw-rw-r-- 1 rootroot rootroot 7003 12月 10 10:07 PreventRingingGesturePreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2900 12月 10 10:07 PreventRingingGestureSettings.java
-rw-rw-r-- 1 rootroot rootroot 7787 12月 10 10:07 PreventRingingParentPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 4337 12月 10 10:07 PreventRingingSwitchPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 3083 12月 10 10:07 SwipeToNotificationPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2506 12月 10 10:07 SwipeToNotificationSettings.java
-rw-rw-r-- 1 rootroot rootroot 15894 12月 10 10:07 SystemNavigationGestureSettings.java
-rw-rw-r-- 1 rootroot rootroot 3787 12月 10 10:07 SystemNavigationPreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2711 12月 10 10:07 TapScreenGesturePreferenceController.java
-rw-rw-r-- 1 rootroot rootroot 2614 12月 10 10:07 TapScreenGestureSettings.java
rootroot@rootroot-X99-Turbo:~/Android13.0/packages/apps/Settings/src/com/android/settings/gestures$
rootroot@rootroot-X99-Turbo:~/Android13.0/packages/apps/Settings/src/com/android/settings/gestures$ grep getSummary . -R
./OneHandedEnablePreferenceController.java: public CharSequence getSummary() {
./AssistGestureSettingsPreferenceController.java: public CharSequence getSummary() {
./GesturePreferenceController.java: public CharSequence getSummary() {
./TapScreenGesturePreferenceController.java: public CharSequence getSummary() {
./TapScreenGesturePreferenceController.java: return super.getSummary();
./PowerMenuPreferenceController.java: public CharSequence getSummary() {
./SystemNavigationPreferenceController.java: public CharSequence getSummary() {
rootroot@rootroot-X99-Turbo:~/Android13.0/packages/apps/Settings/src/com/android/settings/gestures$ grep longPressOnPowerBehavior . -R
./PowerMenuSettingsUtils.java: com.android.internal.R.integer.config_longPressOnPowerBehavior;
rootroot@rootroot-X99-Turbo:~/Android13.0/packages/apps/Settings/src/com/android/settings/gestures$ Connection closing...Socket close.
RK3568的Android12在这里:
Android13.0/packages/apps/Settings/src/com/android/settings/gestures/PowerMenuSettingsUtils.java
这边可以看到最终是获取 config_longPressOnPowerBehavior 的属性值,该属性值是在frameworks/base/core/res/res/values/config.xml中定义,各个值代表的含义已注释得很明确了
<!-- Control the behavior when the user long presses the power button.
0 - Nothing
1 - Global actions menu
2 - Power off (with confirmation)
3 - Power off (without confirmation)
4 - Go to voice assist
5 - Go to assistant (Settings.Secure.ASSISTANT)
-->
<integer name="config_longPressOnPowerBehavior">5</integer>
测试属性设置为1,长按power键,出现如下界面,类似Android11的效果了
属性设置为2,长按power键,出现如下关机确认界面
这两个属性配置基本可以满足需求,问题解决
修改这里:
Z:\Android13.0\frameworks\base\core\res\res\values\config.xml
<!-- How long to show a warning message to user before the device goes to sleep after prolonged
user inactivity. -->
<integer name="config_attentiveWarningDuration">30000</integer>
<!-- Control the behavior when the user long presses the power button.
0 - Nothing
1 - Global actions menu
2 - Power off (with confirmation)
3 - Power off (without confirmation)
4 - Go to voice assist
5 - Go to assistant (Settings.Secure.ASSISTANT)
-->
<integer name="config_longPressOnPowerBehavior">3</integer>
<!-- The time in milliseconds after which a press on power button is considered "long". -->
<integer name="config_longPressOnPowerDurationMs">500</integer>
修改为:
<!-- How long to show a warning message to user before the device goes to sleep after prolonged
user inactivity. -->
<integer name="config_attentiveWarningDuration">30000</integer>
<!-- Control the behavior when the user long presses the power button.
0 - Nothing
1 - Global actions menu
2 - Power off (with confirmation)
3 - Power off (without confirmation)
4 - Go to voice assist
5 - Go to assistant (Settings.Secure.ASSISTANT)
-->
<integer name="config_longPressOnPowerBehavior">1</integer>
<!-- The time in milliseconds after which a press on power button is considered "long". -->
<integer name="config_longPressOnPowerDurationMs">500</integer>
【编译之后就修改了这里,原因未知!】
<!-- Whether to only install system packages on a user if they're allowlisted for that user
type. These are flags and can be freely combined.
0 - disable allowlist (install all system packages; no logging)
1 - enforce (only install system packages if they are allowlisted)
2 - log (log non-allowlisted packages)
4 - any package not mentioned in the allowlist file is implicitly allowlisted on all users
8 - same as 4, but just for the SYSTEM user
16 - ignore OTAs (don't install system packages during OTAs)
Common scenarios:
- to enable feature (fully enforced) for a complete allowlist: 1
- to enable feature for an incomplete allowlist (so use implicit allowlist mode): 5
- to enable feature but implicitly allowlist for SYSTEM user to ease local development: 9
- to disable feature completely if it had never been enabled: 16
- to henceforth disable feature and try to undo its previous effects: 0
Note: This list must be kept current with PACKAGE_WHITELIST_MODE_PROP in
frameworks/base/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java -->
<integer name="config_userTypePackageWhitelistMode">5</integer> <!-- 1+4+8 -->
修改为:
<integer name="config_userTypePackageWhitelistMode">13</integer> <!-- 1+4+8 -->
参考资料
https://baijiahao.baidu.com/s?id=1717361143132016535&wfr=spider&for=pc
https://segmentfault.com/a/1190000023222360?utm_source=tag-newest