如何在Android 12 AOSP源码中禁用下拉状态栏菜单?
一、禁用下拉状态栏(阻止快捷设置操作)
1. 拦截状态栏下拉触发动作
修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java中的下拉启动逻辑:
找到startDragDown方法,直接返回以阻断下拉流程:
@Override public void startDragDown() { // 注释或删除原有逻辑,直接返回阻止下拉 return; }
同时拦截状态栏区域的触摸事件,修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java的onTouchEvent方法:
@Override public boolean onTouchEvent(MotionEvent event) { // 拦截所有触摸事件,避免触发下拉 return true; }
2. 彻底隐藏快捷设置面板
修改frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java的可见性控制逻辑:
找到updateVisibility方法,强制将面板设置为隐藏状态:
private void updateVisibility(boolean force) { setVisibility(View.GONE); return; }
或者修改isEnabled方法,直接返回false禁用面板:
@Override public boolean isEnabled() { return false; }
二、限制访问设置应用
1. 阻止Settings应用启动
修改packages/apps/Settings/src/com/android/settings/SettingsActivity.java的启动逻辑,在页面创建时直接关闭:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 直接关闭Settings页面,阻断用户访问 finish(); return; }
2. 从Launcher移除Settings图标
修改Launcher3的应用加载逻辑,过滤掉Settings应用:
路径:packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java
在loadAllApps方法中添加过滤条件:
private void loadAllApps() { // ... 原有代码 for (AppInfo app : apps) { if (app.componentName.getPackageName().equals("com.android.settings")) { // 过滤Settings应用,不添加到启动器列表 continue; } // ... 原有添加应用的逻辑 } // ... 原有代码 }
3. 系统层面禁用Settings组件
修改frameworks/base/core/res/res/values/config.xml,添加禁用配置:
<!-- 全局禁用Settings应用 --> <bool name="config_disableSettings">true</bool>
随后在系统服务启动逻辑中读取该配置,阻止Settings组件的初始化(具体实现可根据Android 12的SystemServer代码结构调整)。
内容的提问来源于stack exchange,提问作者Enterox

