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

Android 如何通过代码卸载正在运行的应用程序?,android,uninstallation,Android,Uninstallation,我在我的应用程序中有一个要求,即在指定次数的登录尝试失败后: SD卡上对应用程序至关重要的文件夹将被删除并删除 无法从设备上卸载应用程序 这基本上是一种自毁行为 您能否提供有关在应用程序运行时卸载应用程序的方面是否可行的信息?我想删除文件夹一定很容易。你也预见到了这样做会有什么问题吗 谢谢 A没有允许您无缝删除包(包括您自己的包)的公共API。您可以通过将操作设置为action\u UNINSTALL\u package触发Intent来请求删除包,但用户将收到该操作的通知,因为它将把他们带到默

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

  • SD卡上对应用程序至关重要的文件夹将被删除并删除
  • 无法从设备上卸载应用程序
  • 这基本上是一种自毁行为

    您能否提供有关在应用程序运行时卸载应用程序的方面是否可行的信息?我想删除文件夹一定很容易。你也预见到了这样做会有什么问题吗

    谢谢
    A

    没有允许您无缝删除包(包括您自己的包)的公共API。您可以通过将操作设置为
    action\u UNINSTALL\u package
    触发
    Intent
    来请求删除包,但用户将收到该操作的通知,因为它将把他们带到默认安装程序(即Google Play Store)执行操作。

    Larry Schiefer是对的,幸运的是,没有用户交互就没有公共API来执行此操作。但如果您拥有扩展权限,例如,如果设备已根目录,并且您的应用程序具有根目录访问权限,则可以使用命令行:

    Runtime.getRuntime().exec(new String[] {"su", "pm uninstall com.example.yourapplication"})
    
    如果你是一个系统应用程序,所以你有特权,你可以使用隐藏的API,这是非常危险的,因为它们没有文档记录,并且可以从一个Android更新更改到下一个。然而,如果你能控制安装了哪个版本的操作系统,你可能会侥幸逃脱

    在这种情况下,您可以通过反射调用

    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})
    

    想象一下其他应用程序正在使用该文件夹?你认为会发生什么?或者用户已将该文件夹设置为只读(无修改或写入权限)?对于这种情况,我们可以安全地假设此应用程序是设备上唯一的应用程序。对于另一种情况,是否有办法停止将特定文件夹设置为只读?当然,您可以尝试使用反射或利用根设备。但是,这一点都不是很方便携带,而且肯定不能向前兼容。隐藏的API不能保证在未来的Android版本中不被触及。我的假设是,海报的目标是商业发布的设备,并且只使用公开的SDK API。我知道,对于商业发布的设备,您的答案是正确的。我只是做了一个相反的假设:该设备完全由@angela sim控制。这似乎就是她所应用的:“在这种情况下,我们可以安全地假设此应用程序是设备上唯一的应用程序”。嗨,Larry和Menno,感谢您的见解,是的,您在准确的上下文中引用了我的话,这不是一个典型的商业应用程序,肯定不会在商业上发布。实现自毁是最重要的,最好是没有任何用户交互。@AngelaSim我用一种方法编辑了我的回复,作为一个系统应用程序。希望能有所帮助。@Menno非常感谢您的提示。我一定会让你知道我的进展。
    <uses-permission android:name="android.permission.DELETE_PACKAGES"/>