如何通过代码卸载正在运行的应用程序?

时间:2014-02-25 13:56:49

标签: android uninstall

我的应用程序中有一项要求,即在指定次数的登录尝试失败后:

  1. 删除应用程序必需的SD卡上的文件夹
  2. 从设备中卸载应用程序。
  3. 这基本上是一种自我毁灭的行为。

    在应用程序运行时,您是否可以提供有关卸载应用程序方面的信息?我假设删除文件夹必须很容易。你是否预见到这样做会有任何问题。

    由于 甲

2 个答案:

答案 0 :(得分:1)

没有公共API允许您无缝删除包(包括您自己的包)。您可以通过触发Intent并将操作设置为ACTION_UNINSTALL_PACKAGE来请求删除包,但是用户我们会将此操作通知默认安装程序(即Google Play商店)以执行操作。

答案 1 :(得分:0)

Larry Schiefer是对的,幸运的是没有公共API可以在没有用户交互的情况下执行此操作。但是,如果您具有扩展权限,例如,如果设备已植根并且您的应用具有root访问权限,则可以使用命令行:

Runtime.getRuntime().exec(new String[] {"su", "pm uninstall com.example.yourapplication"})

如果您拥有特殊权限,因为您是系统应用程序,则可以使用隐藏的API,这非常危险,因为它们没有文档记录,可以从一个Android更新更改为下一个。但是,如果您控制安装了哪个版本的操作系统,则可能会使用它。

在这种情况下,您可以通过反思调用PackageManager.deletePackage

pm = context.getPackageManager();
Class<?>[] types = new Class[] {String.class, IPackageDeleteObserver.class, int.class};
method = pm.getClass().getMethod("deletePackage", types);
method.invoke(pm, new Object[] {"com.example.com", null, 0})

此功能 还应删除所有包裹数据,因此这是一个完整的擦除。您需要在AndroidManifest.xml中请求DELETE_PACKAGES权限(只有在您是系统应用程序/系统用户时才会被授予):

<uses-permission android:name="android.permission.DELETE_PACKAGES"/>