为什么禁用的应用程序仍在运行?


8

我注意到,使用流程观察器工具时,使用库存的Android(KitKat)应用管理器禁用的应用(例如Google Contacts Sync)仍然显示为正在运行。即使重新启动设备也是如此。

为什么禁用的应用程序仍在运行?是否有有效(安全)的方法来实际禁用它们?

需要root特权的解决方案是可以接受的。

(请注意,对于上面的特定示例,您可以告诉Android不同步您的联系人,但它仍运行Google Contacts Sync流程。但是,我们不要再赘述该示例了,它只是一个示例。)


“禁用”按钮旁边是“强制停止”按钮。按下它,该过程应该终止并且不再开始。
巨树2015年

@GiantTree谢谢。重新启动后,会不会重新开始?
RockPaperLizard 2015年

4
在您的情况下,确实如此,因为系统应用程序已显式调用该程序包的导出服务,而可靠地终止该进程(及其他任何进程)的唯一方法是使用Greenify,Amplify(需要Xposed)或类似的应用程序主动终止该进程。注意:这不应该发生,应该被认为是一个错误,因为PackageManager的任务是不允许禁用的应用程序运行。
GiantTree 2015年

1
在这方面,我禁用了所有服务,接收器,活动和内容提供程序,并禁用了SystemUI应用程序。重新启动设备,然后猜测该应用程序仍被加载到内存中(pm则不是这种情况block/hide),这让我想知道是什么原因导致现在加载该应用程序。另一回事是,当它加载到内存中时,由于缺少背景,主题,状态栏等,您可以观察到其表面上的缺失。也许可以由此提出一个新的问题。
Firelord

1
@Firelord我想这就是我上面指出的:如果禁用某个应用程序,它只是“标记为已禁用”(并且未在启动器中显示)–但它仍已在系统(程序包管理器)中注册,因此其他应用程序可以找到它并传达其意图。似乎隐藏/阻止与“卸载后留下.apk数据” 相当可比-因此该应用“已完全取消注册,除了文件管理器之外,其他所有内容都看不到”,因此其他应用不再能够调用其意图。找不到他们。
伊兹

Answers:


7

如果您的版本是4.4.x或更高版本,则您的Android无需具有root权限即可真正禁用应用程序。所有你需要的是在非根目录设备中启用 PC中的设置并启用USB调试,或者在有根目录的设备上使用终端仿真器应用程序(也可以使用adb)。

如果检查Package Manger(pm)的用法,您将看到

pm阻止[--user USER_ID] PACKAGE_OR_COMPONENT“)
下午取消阻止[--user USER_ID] PACKAGE_OR_COMPONENT“)

对于棒棒糖,这将是

pm hide [--user USER_ID] PACKAGE_OR_COMPONENT“)
pm取消隐藏[--user USER_ID] PACKAGE_OR_COMPONENT“)

为了阻止或隐藏包裹(很安全),只需

pm block PACKAGE # for KitKat
pm hide PACKAGE  # for Lollipop

要取消屏蔽或取消隐藏包装,请执行

pm unblock PACKAGE #for KitKat 
pm unhide PACKAGE  # for Lollipop

PACKAGE→应用程序的软件包名称。要了解应用程序的软件包名称:

adb shell在非常命令前附加以从PC执行它们。

hide的功能在源代码中具有以下注释

将程序包置于隐藏状态,这几乎类似于卸载状态,从而使程序包不可用,但不会删除数据或实际的程序包文件。可以通过重置隐藏状态或通过安装来取消隐藏应用程序

对于此处 也进行了类似的注释 。

为了验证索赔,您可以使用meminfoprocstatsactivity使用dumpsys工具之类的某些系统服务,甚至可以使用列出所有进程ps。您不会发现被阻止/隐藏的应用程序处于活动状态。

许多使用GUI禁用的系统应用程序也是如此,pm disable但不是每个应用程序都一样,因为即使禁用的应用程序也可以接收其注册的广播,只有将其加载到内存1中才能完成。但是,已禁用的应用程序不能自行执行操作,也不能由任何其他应用程序执行。

在我的问题pm隐藏 / 阻止禁用之间存在一些差异, 隐含VS pm禁用-身份危机。它仅提供此答案的补充信息,因此您可以跳过它。

编辑:

似乎该技术不适用于Android KitKat上的所有应用。在这种情况下,只需从应用程序的APK撤消读取权限或从应用程序的文件名中删除扩展名.APK(Jaskaranbir曾建议一次),然后进行软/完全重新引导。这与从系统中删除应用程序相同,只是所有文件都将保留在原处。

可以使用任何根文件管理器应用程序执行这两个步骤。命令行方式是:

adb shell su -c 'chmod 000 /data/app/PACKAGE*'             # 000 means no read-write-executable permission to user,group and others. 
adb shell su -c 'mv /data/app/PACKAGE* /data/app/PACKAGE'  # doing renaming by moving the file
adb reboot

1:缺乏支持事实的技术证据


好答案!谢谢!最好先使用普通的Android应用程序管理器禁用该应用程序,还是最好确保未在其中禁用该应用程序?
RockPaperLizard 2015年

如果您愿意,则无​​需禁用该应用程序,pm block/hide因此请保持不变。
Firelord

如果它已经被禁用,最好重新启用它吗?
RockPaperLizard 2015年

1
真奇怪 我在Kitkat上测试了阻止systemui的功能,令我惊讶的是,阻止功能就像禁用一样工作,此应用程序保留在内存中。即使我杀死了SystemUI进程,它也被派生了。不知道这是错误还是期望的行为,但是无论如何,这与我在答案中提到的棒棒糖相关发现相反。我想答案现在已经毫无用处了。
Firelord

1
@RockPaperLizard,我忘了告诉你一个非常简单的技巧。撤消包文件(或基本目录,如果使用Lollipop的话)的读取权限,然后重新启动并执行完毕。例如,具有root权限,您可以按这种方式停止SystemUI adb shell su -c "chmod 111 /system/app/SystemUI.apk"。111表示仅为所有者,组和其他人设置可执行权限。重新启动,该应用程序将丢失到系统中。您也可以将其设置000为。
Firelord
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.