我正在编写一个应该能够清除任何其他应用程序的私有数据的应用程序。如果您想知道用例,它就像MDM / MAM客户端一样。我想有选择地擦除应用程序数据(相对于完整的设备擦除)。
我在Android源代码中遇到了以下API调用。
ActivityManager.clearApplicationUserData(String packageName,IPackageDataObserverobserver)
奇怪的是,作为SDK的一部分,您并不真正可以使用它。 (所以日食会让你试图使用它)。但是, 存在(请参阅here),您可以通过反射调用它。但是,我仍然无法掌握IPackageDataObserver界面。
有更好的方法吗?我知道可以这样做,因为我看到像MaaS360这样的产品会对应用程序的数据进行选择性擦除。
有什么建议吗?
基于@lechlukasz在下面列出的内容......以下代码可以执行...但是最终会出现SecurityException,因为程序包管理器会在安装应用程序时撤消CLEAR_APP_USER_DATA权限。
Class<?> iPackageDataObserverClass= Class.forName("android.content.pm.IPackageDataObserver");
Class<ActivityManager> 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);
所以这可行,只要可以调用该方法。实际上没有运气能够清除数据本身。 : - (
答案 0 :(得分:2)
您指出的方法不是静态方法,因此为了调用它,您需要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;
}
});
答案 1 :(得分:0)
您的代码应该可以使用,但您需要在清单中添加适当的权限(CLEAR_APP_USER_DATA)并使用平台密钥为您的应用程序签名。