如何使用反射更改备份服务?

JBA

我在这里发布了有关Android 5.1的新行为的问题,该行为在此处在设备上设置设备所有者时会禁用备份服务...

一个可能的解决方案可能是(我猜想)使用反射来解决此问题:我可以在隐藏类中使用特定方法找到一些反射示例,但这种情况看起来更复杂,使用另一个隐藏类的构造函数(ServiceManager)等,我不知道该怎么做...

令我烦恼的代码位于DevicePolicyManagerService.java(可在此处找到)第3739至3749行:

long ident = Binder.clearCallingIdentity();
try {
    IBackupManager ibm = IBackupManager.Stub.asInterface(
        ServiceManager.getService(Context.BACKUP_SERVICE));
    ibm.setBackupServiceActive(UserHandle.USER_OWNER, false);
} catch (RemoteException e) {
    throw new IllegalStateException("Failed deactivating backup service.", e);
} finally {
    Binder.restoreCallingIdentity(ident);
}

我的目标是重新启用备份服务,理想情况下,这将类似于:

ibm.setBackupServiceActive(UserHandle.USER_OWNER, false);

你能帮我做到这一点吗?

Mederic

试试这个代码:

    try {
        Class<?> iBackupManagerClass = Class.forName("android.app.backup.IBackupManager");
        Class<?> serviceManagerClass = Class.forName("android.os.ServiceManager");
        Class<?>[] classes = iBackupManagerClass.getDeclaredClasses();
        Class<?> stubClass = null;
        for (Class clazz : classes) {
            if (clazz.getSimpleName().equals("Stub")) {
                stubClass = clazz;
            }
        }

        Method setBackupServiceActiveMethod = iBackupManagerClass.getMethod("setBackupServiceActive", int.class, boolean.class);
        Method asInterfaceMethod = stubClass.getMethod("asInterface", IBinder.class);
        Method getServiceMethod = serviceManagerClass.getMethod("getService", String.class);

        Object ibm = asInterfaceMethod.invoke(null, getServiceMethod.invoke(null, "backup"));
        setBackupServiceActiveMethod.invoke(ibm, 0, false);

    } catch (ClassNotFoundException e) {
        Log.e("TEST", e.getMessage(), e);
    } catch (NoSuchMethodException e) {
        Log.e("TEST", e.getMessage(), e);
    } catch (InvocationTargetException e) {
        Log.e("TEST", e.getMessage(), e);
    } catch (IllegalAccessException e) {
        Log.e("TEST", e.getMessage(), e);
    }

它将需要一些重构来捕获错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用DejaDup备份服务创建多个备份作业?

来自分类Dev

如何备份我的git更改?

来自分类Dev

如何更改重复备份的密码?

来自分类Dev

如何使用增量备份

来自分类Dev

如何使用增量备份

来自分类Dev

备份疑虑:如何使用备份文件

来自分类Dev

使用Android备份服务备份Cordova应用程序

来自分类Dev

如何更改AngularJS服务以使用Typescript?

来自分类Dev

使用 Stun 的服务器反射传输

来自分类Dev

如何使用反射来显示具有List <CustomClass>的Web服务的属性

来自分类Dev

使用反射更改Long.MIN_VALUE

来自分类Dev

如何使用反射设置数组

来自分类Dev

如何使用反射创建按钮?

来自分类Dev

如何在运行时使用反射更改方法的实现?

来自分类Dev

如何使用PowerShell和robocopy将文件备份到服务器?

来自分类Dev

如何通过SSH使用rsync远程备份整个Linux服务器?

来自分类Dev

如何更改Deja Dup的备份时间?

来自分类Dev

如何更改Deja Dup的备份时间?

来自分类Dev

如何更改Deja-dup(备份)的密码?

来自分类Dev

使用dd备份分区并更改文件

来自分类Dev

如何使用OneDrive进行备份

来自分类Dev

忘记更改名称服务器之前先备份

来自分类Dev

如何浏览或浏览使用Windows备份备份的文件?

来自分类Dev

如何使用ADB Shell服务调用音频更改音量

来自分类Dev

如何更改我的SFTP服务器使用的编码?

来自分类Dev

Kotlin:如何在包装上使用反射?

来自分类Dev

如何使用反射设置此对象的属性?

来自分类Dev

如何使用反射实例化Scala对象

来自分类Dev

如何使用反射实现回调?