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

时间:2017-08-01 20:01:31

标签: java android android-intent android-source

首先,我在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之前的最后一个流程应该重新启用,以便它在下次启动之前启动< / strong>启动器

任何提示,想法?

感谢名单

1 个答案:

答案 0 :(得分:0)

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

  1. 检查调用进程的uid是否为system。如果它是system,则全部保存,如果没有,则应该android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE权限。
  2. 检查它是否是受保护的包,不允许其他人修改它的状态。
  3. 对于这两种情况,您都会收到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);
    3. 您是否获得任何SecurityExceptions?尝试添加权限:CHANGE_COMPONENT_ENABLED_STATE。 您尝试从哪些进程启用该应用程序?它有什么UID?如果你能把它变成系统,我会说你会避免一些安全检查。

      希望它有所帮助。