AOSP多个桌面应用,设置默认桌面,刷机第一次不提示选择默认桌面

当AOSP系统存在多个桌面应用时,通常首次启动会提示选择默认桌面。本文介绍如何避免这个选择流程,直接设定目标应用为默认桌面。主要涉及对ResolverActivity.java的修改,通过添加特定函数到ResolveListAdapter内部类,并在onCreate函数中调用,实现开机不提示选择默认桌面。

思路

系统有多个桌面应用时,第一次刷机开机会弹出选择桌面的对话框。只需要直接跳过选择流程并选中目标应用即可。

实现

相关文件

  • frameworks/base/core/java/com/android/internal/app/ResolverActivity.java(选择默认桌面的界面)

参考链接:https://blog.youkuaiyun.com/wxd_csdn_2016/article/details/87708307

添加此函数,到frameworks/base/core/java/com/android/internal/app/ResolverActivity.java

/** 设置默认的桌面应用 */
private void setupDefaultLauncher() {
    int position = mAdapter.getDefaultHomePosition("你指定的包名");
    if (position == -1) {
        if (DEBUG)
            Log.w(TAG, "not find default Home");
        return;
    }
    startSelected(position, true);

    finish();
}

添加次函数到其内部类,ResolveListAdapter:

/** 获取该包名的应用所处位置 */
public int getDefaultHomePosition(String packageName){
    for (int i = 0; i < mList.size(); i++) {
        ResolveInfo info = mList.get(i).ri;
        if (info.activityInfo.packageName.equals(packageName)) {
            return i;
        }
    }
    return -1;
}

在frameworks/base/core/java/com/android/internal/app/ResolverActivity.java中,找到onCreate函数,最后一行添加:

setupDefaultLauncher();

到此结束。

--- a/alps/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
+++ b/alps/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
@@ -120,6 +120,7 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte

         onCreate(savedInstanceState, intent, getResources().getText(titleResource),
                 null, null, true);
+        setupDefaultLauncher();
     }
<think>我们正在处理的是一个Android AOSP系统定制需求:在系统级别屏蔽特定应用,使其出现在桌面Launcher)和应用设置中。根据引用[2]的内容,我们知道在Launcher3(AOSP默认桌面)中,可以通过修改加载和更新应用列表的代码来过滤特定应用。 具体步骤: 1. **修改加载应用的代码**:在`LoadTask.java`中,过滤掉需要显示的应用。 2. **修改应用更新时的代码**:在`PackageUpdatedTask.java`中,确保在安装、更新或卸载应用时同样应用过滤规则。 此外,根据用户需求,还需要在设置中屏蔽该应用。这可以通过修改设置应用(Settings)的代码来实现,通常是在显示应用列表的地方进行过滤。 系统级隐藏(用户可见)的深度解决方案: ### 一、桌面Launcher3)屏蔽应用 根据引用[2],我们需要修改两个文件: 1. **`LoadTask.java`** 该文件负责加载所有已安装应用。在加载过程中,我们可以添加一个条件判断,跳过需要隐藏的应用。 代码修改示例(在`LoadTask.java`的`loadAllApps`方法中): ```java for (PackageInfo info : packages) { // 需要隐藏的应用包名列表,例如:com.example.hiddenapp if (shouldHideApp(info.packageName)) { continue; // 跳过此应用 } // 正常处理其他应用 } ``` 其中,`shouldHideApp`是一个自定义方法,用于判断应用是否在隐藏名单中。 2. **`PackageUpdatedTask.java`** 该文件负责处理应用安装、更新和卸载事件。在更新应用列表时,同样需要过滤隐藏应用。 代码修改示例(在`PackageUpdatedTask.java`的`execute`方法中): ```java for (PackageInfo info : mUpdatedPackages) { if (shouldHideApp(info.packageName)) { continue; // 跳过隐藏应用 } // 处理其他应用更新 } ``` ### 二、设置(Settings)中屏蔽应用 在设置应用中,我们需要修改显示应用列表的地方。通常,设置应用会通过`PackageManager`获取所有已安装应用。我们可以通过以下方式修改: 1. **修改查询条件**:在查询应用列表时,排除隐藏应用。 2. **修改适配器**:在填充应用列表的适配器中过滤掉隐藏应用。 具体修改位置可能在`ManageApplications.java`或类似文件中(Android版本可能同)。 示例代码(在查询应用列表时): ```java List<ApplicationInfo> apps = packageManager.getInstalledApplications(flags); // 过滤隐藏应用 Iterator<ApplicationInfo> iterator = apps.iterator(); while (iterator.hasNext()) { ApplicationInfo appInfo = iterator.next(); if (shouldHideApp(appInfo.packageName)) { iterator.remove(); } } ``` ### 三、系统级全局隐藏(可选) 如果希望该应用在整个系统中都可见(包括第三方应用获取应用列表时),可以通过修改`PackageManagerService`实现。但这样可能会影响系统稳定性,且需要重新编译整个系统。 在`PackageManagerService`中,修改`queryIntentActivities`、`queryIntentServices`等方法,在返回结果前移除隐藏应用。 > ⚠️ 注意:此修改影响范围大,需谨慎。 ### 四、配置隐藏应用名单 我们可以通过系统属性、配置文件或数据库来存储需要隐藏的应用包名列表。例如,在`/system/etc/hidden_apps.xml`中定义隐藏应用名单,然后在代码中读取。 示例`hidden_apps.xml`: ```xml <?xml version="1.0" encoding="utf-8"?> <hidden-apps> <item package="com.example.hiddenapp1"/> <item package="com.example.hiddenapp2"/> </hidden-apps> ``` 读取该配置的代码: ```java private boolean shouldHideApp(String packageName) { // 从配置文件中读取隐藏应用名单,判断当前包名是否在名单中 return hiddenAppsList.contains(packageName); } ``` ### 五、编译与部署 修改完成后,需要重新编译`Launcher3`、`Settings`和`framework`(如果修改了`PackageManagerService`)模块,并将生成的系统镜像刷入设备。 编译命令示例: ```bash mmm packages/apps/Launcher3/ mmm packages/apps/Settings/ ``` 或者编译整个系统: ```bash make -j8 ``` §§相关问题§§ 1. 如何在Android系统中动态更新隐藏应用名单而无需重新编译? 2. 修改PackageManagerService隐藏应用可能带来哪些兼容性问题? 3. 如何防止隐藏的应用被其他应用通过包名直接启动? 4. 在定制Android系统时,如何为同用户配置同的应用隐藏策略? 5. 隐藏系统预装应用与隐藏第三方应用在实现上有何区别? </think>在Android AOSP系统中实现系统级应用屏蔽,需修改Launcher3和系统服务代码,以下是核心实现方案: ### 一、Launcher3层屏蔽(桌面显示) 在`workspace app列表页`加载逻辑中过滤特定应用,需修改两处关键文件: 1. **加载时过滤 (`LoadTask.java`)** 修改应用加载逻辑,添加包名过滤: ```java // packages/apps/Launcher3/src/com/android/launcher3/model/LoadTask.java protected Void run() { List<AppInfo> allApps = new ArrayList<>(); for (PackageInfo pkg : installedPackages) { // 跳过指定包名的应用 if (pkg.packageName.equals("com.target.package")) continue; allApps.add(new AppInfo(...)); } mBgAllAppsList.add(allApps); } ``` 2. **动态更新过滤 (`PackageUpdatedTask.java`)** 处理应用安装/卸载事件时的过滤: ```java // packages/apps/Launcher3/src/com/android/launcher3/model/PackageUpdatedTask.java public void execute(...) { for (String pkg : modifiedPackages) { if (pkg.equals("com.target.package")) { // 跳过更新目标应用 continue; } updatePackage(pkg); // 正常更新其他应用 } } ``` ### 二、设置菜单层屏蔽 修改设置应用逻辑,隐藏目标应用: 1. **应用列表过滤 (`ManageApplications.java`)** ```java // packages/apps/Settings/src/com/android/settings/applications/ManageApplications.java private void rebuild() { List<ApplicationInfo> apps = mPm.getInstalledApplications(flags); Iterator<ApplicationInfo> it = apps.iterator(); while (it.hasNext()) { if (it.next().packageName.equals("com.target.package")) { it.remove(); // 移除非显示应用 } } mAdapter.setApps(apps); } ``` 2. **禁用设置入口 (`AndroidManifest.xml`)** 在目标应用的AndroidManifest中添加: ```xml <activity android:name=".TargetActivity"> <intent-filter> <action android:name="android.intent.action.APPLICATION_PREFERENCES" /> <!-- 屏蔽设置入口 --> </intent-filter> </activity> ``` ### 三、系统服务层屏蔽(可选) 彻底隐藏应用需修改`PackageManagerService`: ```java // frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java public List<PackageInfo> getInstalledPackages(int flags, int userId) { List<PackageInfo> filteredList = new ArrayList<>(); for (PackageInfo pkg : originalList) { if (!pkg.packageName.equals("com.target.package")) { filteredList.add(pkg); // 系统级过滤 } } return filteredList; } ``` ### 四、实现效果验证 1. **编译刷机** 使用以下命令编译模块: ```bash mmm packages/apps/Launcher3/ mmm packages/apps/Settings/ adb reboot bootloader fastboot flash system system.img ``` 2. **验证逻辑** - 桌面再显示目标应用图标 - 设置 → 应用列表显示目标应用 - `adb shell pm list packages` 仍可见包名(证明未卸载) > ️ **注意事项** > 1. 需修改`hidden_api_blacklist.txt`绕过隐藏API限制 > 2. 系统签名`platform.pk8`和`platform.x509.pem` > 3. 需处理`PackageMonitor`监听器的兼容性[^2][^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值