在 Android 中启用和禁用活动或整个应用程序(AOSP 源)



首先,我在AOSP环境中工作,我在这里提到的两个应用程序都是用Android源代码构建的,并且是系统应用程序(UID是系统(。

首次启动/恢复出厂设置时启动的应用被写入以利用android.intent.action.DEVICE_INITIALIZATION_WIZARD意图过滤器。当应用程序完成它的工作时,它会禁用它与代码的活动

PackageManager pm = mContext.getPackageManager();
pm.setComponentEnabledSetting(new ComponentName("com.xyzapp",
"com.xyzapp.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);

这一切都很好。我面临的问题是重新启用我尝试从另一个应用程序(更准确地说是服务(执行的活动。

这与禁用它几乎相同:

PackageManager pm = mContext.getPackageManager();
pm.setComponentEnabledSetting(new ComponentName("com.xyzapp",
"com.xyzapp.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);

这种方法不起作用,我不知道为什么。

以下是它应该如何工作的快速概述:

  • 首次启动 - 启动器启动com.xyzapp.MainActivity启动
  • 如果 OTA 更新可用并且用户决定下载并安装它,则应在恢复和安装更新之前的过程远端重新启用com.xyzapp.MainActivity,以便在启动器之前的下次启动时启动

有什么提示,想法吗?

感谢

因此,从PackagemanagerService.java检查private void setEnabledSetting(final String packageName, String className, int newState, final int flags, int userId, String callingPackage)这些是它具有的关键安全检查:

  1. 检查调用进程的uid是否system。如果system,则全部保存,如果没有,则应具有android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE权限。
  2. 检查它是否是受保护的包,不允许其他人修改其状态。

对于这两种情况,您都会得到一个SecurityException,其中包含不同的消息。

  1. throw new SecurityException( "Permission Denial: attempt to change component state from pid=" + Binder.getCallingPid() + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
  2. throw new SecurityException("Cannot disable a protected package: " + packageName);

您是否收到任何这些安全异常?尝试添加权限:CHANGE_COMPONENT_ENABLED_STATE。 您尝试从哪些进程启用应用程序?它有什么 UID?如果你能把它变成系统,我会说你会避免一些安全检查。

希望对您有所帮助。

最新更新