清除另一个应用程序的数据

我正在编写一个应该能够清除任何其他应用程序的私有数据的应用程序。 如果您对这个用例感到疑惑,那么它就像MDM / MAM客户端一样。 我想有选择地擦除应用程序数据(相对于完整的设备擦除)。

我在Android源代码中遇到了以下API调用。

ActivityManager.clearApplicationUserData(String packageName,IPackageDataObserverobserver) 

奇怪的是,作为SDK的一部分,您并不真正可以使用它。 (所以日食会让你试图使用它)。 但是,它存在(见此处 ),您可以通过reflection调用它。 但是,我仍然无法获得IPackageDataObserver接口。

有更好的方法吗? 我知道可以做到这一点,因为我看到像MaaS360这样的产品会对应用程序的数据进行选择性擦除。

有什么建议么?


UPDATE

根据@lechlukasz在下面列出的内容……以下代码可以执行…但是您最终会使用SecurityException,因为程序包管理器会在安装应用程序时撤消CLEAR_APP_USER_DATA权限。

 Class iPackageDataObserverClass= Class.forName("android.content.pm.IPackageDataObserver"); Class activityManagerClass=ActivityManager.class; ActivityManager activityManager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); Method clearDataMethod=activityManagerClass.getMethods()[0]; Object iPackageDataObserverObject = Proxy.newProxyInstance( MyApp.class.getClassLoader(), new Class[]{iPackageDataObserverClass}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Log.i("Proxy", method.getName() + ": " + Arrays.toString(args)); return null; } }); clearDataMethod.invoke(activityManager, "com.example.test",iPackageDataObserverObject); 

所以这可行,只要可以调用该方法。 实际上没有运气能够清除数据本身。 🙁

你指出的方法不是静态方法,所以为了调用它你需要ActivityManager实例,这将是最棘手的部分,即使你有root权限。 我无法帮助你。

但是,对于实例化IPackageDataObserver ,我设法使用标准的refrection API在没有特殊权限的情况下执行此操作:

  Class ipdoClass = Class.forName("android.content.pm.IPackageDataObserver"); Object observer = Proxy.newProxyInstance( MyApp.class.getClassLoader(), new Class[]{ipdoClass}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Log.i("Proxy", method.getName() + ": " + Arrays.toString(args)); return null; } }); 

您的代码应该可以使用,但您需要在清单中添加适当的权限(CLEAR_APP_USER_DATA)并使用平台密钥对您的应用程序进行签名。