DevicePolicyManager.setApplicationHidden 的实际行为

Actual behavior of DevicePolicyManager.setApplicationHidden

有没有人足够了解 SDK 来告诉我为什么在将我的应用设为设备所有者并执行 DevicePolicyManager.setApplicationHidden 以获得应用列表后我找不到它们,除非我将 PackageManager.getInstalledApplications(PackageManager.GET_META_DATA or PackageManager.MATCH_UNINSTALLED_PACKAGES) 在查询标志中? (意味着 GET_META_DATA 将不起作用,隐藏的应用程序将不会被隐藏) 我试图找到它们以取消隐藏它们——但没有成功,除非我也在寻找已卸载的。

我的理论是 Android 并没有真正隐藏它们,而是实际上将它们标记为已卸载但保留所有数据 — 但我没有在文档中找到任何关于它的信息。想知道是否有人可以澄清这种行为(来源)。

谢谢!

命名有歧义但确实如此 setApplicationHidden effectively uninstalls the app but keeps the APK and data in storage. If you're looking for a way to prevent use of the app without uninstalling it you can try setPackagesSuspended.

您可以在 PackageManagerService.setApplicationHiddenSettingAsUser()(下面的相关摘要)中找到 setApplicationHidden 的来源。它的逻辑很简单:

  • setApplicationHiddenSettingAsUser 调用 packageSetting.setHidden() 将包标记为对用户隐藏,
  • PackageManagerService的其他方法调用packageSetting.getHidden()来决定是否应该退回包裹。

setApplicationHiddenSettingAsUser 的代码摘要:

@Override
public boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden,
        int userId) {
    PackageSetting pkgSetting;
    ...
    try {
        ...
        synchronized (mPackages) {
            pkgSetting = mSettings.mPackages.get(packageName);
            ...
            if (pkgSetting.getHidden(userId) != hidden) {
                pkgSetting.setHidden(hidden, userId);
                mSettings.writePackageRestrictionsLPr(userId);
                ...
            }
        }
        ...
    }
}