2017-08-01 100 views
0

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

在第一次引导/恢复出厂设置时启动的应用程序被编写为利用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过程,因此前发射器开始在下次开机

任何提示,想法?

感谢名单

回答

0

所以,检查private void setEnabledSetting(final String packageName, String className, int newState, final int flags, int userId, String callingPackage)PackagemanagerService.java这些都是关键的安全检查有:

  1. 检查调用进程的uidsystem与否。如果是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);

你得到任何的SecurityExceptions的?尝试添加权限:CHANGE_COMPONENT_ENABLED_STATE。 你想从哪些进程启用应用程序?它有什么UID?如果你能使它成为系统,我会说你会避免一些安全检查。

希望它有帮助。

+0

谢谢,但那不幸对我来说并不奏效。但是,我错过了清单中的CHANGE_COMPONENT_ENABLED_STATE权限,所以这是一个更少的错误,我猜测:)。如果我弄清楚发生了什么,我会更加努力地工作,并会发布。 –

+0

但是你有没有在logcat中的任何错误?您拨打的服务的UID是什么? – Olaia

+1

我得检查一下,没有时间去做。很可能会在周末那样做。不想粗鲁,不想回复这么久。我将很快发布logcat的详细信息。 –

相关问题