如何使用反射改变备份服务?
How to use reflection to change backup service?
我发布了 question 关于 Android 5.1 的新行为,在此处为设备设置设备所有者时禁用备份服务...
一个可能的解决方案可能是(我猜)使用反射来解决这个问题:我可以在隐藏 class 中找到一些使用特定方法的反射示例,但这种情况看起来更复杂,有使用另一个隐藏 class (ServiceManager) 等的构造函数,我不知道该怎么做...
烦我的代码位于DevicePolicyManagerService.java(可以找到here)第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);
你能帮我做这个吗?
试试这个代码:
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);
}
它需要一些重构来捕获错误...
我发布了 question 关于 Android 5.1 的新行为,在此处为设备设置设备所有者时禁用备份服务...
一个可能的解决方案可能是(我猜)使用反射来解决这个问题:我可以在隐藏 class 中找到一些使用特定方法的反射示例,但这种情况看起来更复杂,有使用另一个隐藏 class (ServiceManager) 等的构造函数,我不知道该怎么做...
烦我的代码位于DevicePolicyManagerService.java(可以找到here)第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);
你能帮我做这个吗?
试试这个代码:
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);
}
它需要一些重构来捕获错误...