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

Arc*_*hit 6 android

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

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

ActivityManager.clearApplicationUserData(String packageName,IPackageDataObserverobserver)
Run Code Online (Sandbox Code Playgroud)

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

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

有什么建议?


UPDATE

基于@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);
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*lor 2

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

但至于实例化IPackageDataObserver,我已经成功地使用标准反射 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;
            }
        });
Run Code Online (Sandbox Code Playgroud)