我有一个驻留在手机系统内存中的应用程序。这是一种手机锁应用程序,需要密码才能访问手机。
输入正确的密码后,我需要手机上的应用程序消失。现在,我所做的是在正确的密码下使用 Intent.DELETE 自行卸载了该应用程序。但问题是当手机恢复出厂设置时,应用程序再次出现要求输入密码。
那么有没有办法以编程方式卸载系统应用程序,即使手机恢复出厂设置也不会出现?
我在 Stack Overflow 上找到了一些帖子,但无法使代码正常工作。
我有一个驻留在手机系统内存中的应用程序。这是一种手机锁应用程序,需要密码才能访问手机。
输入正确的密码后,我需要手机上的应用程序消失。现在,我所做的是在正确的密码下使用 Intent.DELETE 自行卸载了该应用程序。但问题是当手机恢复出厂设置时,应用程序再次出现要求输入密码。
那么有没有办法以编程方式卸载系统应用程序,即使手机恢复出厂设置也不会出现?
我在 Stack Overflow 上找到了一些帖子,但无法使代码正常工作。
当您将应用程序构建为预安装的应用程序(system/app 或 system/priv-app)时,它会成为系统映像和系统分区的一部分。当用户执行恢复出厂设置时,设备会回退到构建的原始系统映像,在您的情况下,该映像包括可能已经卸载的应用程序。
您提供的两种解决方案都尝试从只读分区的系统分区中删除您的应用程序(并且有充分的理由)。如果您想从该分区中删除文件,则必须将其重新挂载为读/写分区,然后才能删除文件。
要重新挂载系统分区,您将需要 root 访问权限,据我所知,这在标准 Android 应用程序中是不可能的。
您可能希望使用具有 root 访问权限并为您执行删除的可执行守护程序,但这是一个非常复杂的解决方案。
编辑:
作为系统应用程序并不意味着该应用程序具有 root 访问权限!第二个示例仅在整个设备都已植根时才有效。在这种情况下,您的设备的安全性非常弱。如果您仍想使用该方法,只需提供您的 apk 的路径 (system/app/yourapp/yourapp.apk).l
你可以像这样执行root命令:
private void deleteApk(String packageName) {
try {
final String command = "rm -rf /system/app/" + packageName;
Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
proc.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}