2014-11-24 12 views
0

Я пытаюсь вызвать внутренний метод android для перезагрузки устройства. Это просто эксперимент, я постараюсь понять, что я делаю неправильно. Я знаю, что есть, вероятно, лучшие методы для перезагрузки (с участием busybox?).как вызвать внутренний метод android с отражением

Class watchdogClass = Class.forName("com.android.server.Watchdog"); 
Method getInstance = watchdogClass.getDeclaredMethod("getInstance"); 
Method rebootSystem = watchdogClass.getDeclaredMethod("rebootSystem", String.class); 
Object watchdogInstance = getInstance.invoke(null); 
rebootSystem.invoke(watchdogInstance, "my reboot message"); 

Это исключение, которое я получаю, я искал googled, не найдя решения.

helloroot I/Watchdog﹕ Rebooting system because: my reboot message 
helloroot W/System.err﹕ java.lang.reflect.InvocationTargetException 
helloroot W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 
helloroot W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515) 
helloroot W/System.err﹕ at org.example.helloroot.SettingsActivity.onPostCreate(SettingsActivity.java:80) 
helloroot W/System.err﹕ at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1150) 
helloroot W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2188) 
helloroot W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271) 
helloroot W/System.err﹕ at android.app.ActivityThread.access$800(ActivityThread.java:144) 
helloroot W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
helloroot W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102) 
helloroot W/System.err﹕ at android.os.Looper.loop(Looper.java:136) 
helloroot W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5146) 
helloroot W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 
helloroot W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515) 
helloroot W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 
helloroot W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 
helloroot W/System.err﹕ at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 
helloroot W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 
helloroot W/System.err﹕ Caused by: java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.android.server.power.PowerManagerService 
helloroot W/System.err﹕ at com.android.server.Watchdog.rebootSystem(Watchdog.java:302) 
helloroot W/System.err﹕ ... 17 more 

Watchdog.java source code

Соответствующие Gradle конфигурации:

android { 
    compileSdkVersion 21 
    buildToolsVersion '21.0.2' 

    defaultConfig { 
     minSdkVersion 19 
     targetSdkVersion 21 

ответ

0

Похоже, что у вас есть различные реализации SDK на вашем устройстве реализации checkthis метода rebootSystem (String Resen) на:

https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/services/java/com/android/server/Watchdog.java

/** 
* Perform a full reboot of the system. 
*/ 
void rebootSystem(String reason) { 
    Slog.i(TAG, "Rebooting system because: " + reason); 
    PowerManagerService pms = (PowerManagerService) ServiceManager.getService("power"); 
    pms.reboot(false, reason, false); 
} 

и реализация в исходном коде вы указали на ваш вопрос:

/** 
* Perform a full reboot of the system. 
*/ 
void rebootSystem(String reason) { 
    Slog.i(TAG, "Rebooting system because: " + reason); 
    IPowerManager pms = (IPowerManager)ServiceManager.getService(Context.POWER_SERVICE); 
    try { 
     pms.reboot(false, reason, false); 
    } catch (RemoteException ex) { 
    } 
} 

, именно поэтому вы получили ClassCastException:

helloroot Вт/System.err: Вызванный: java.lang. ClassCastException: android.os.BinderProxy не может быть добавлен в com.android.server.power.PowerManagerService

+0

Я заметил, что rebootSystem отличается от sdk 19 до sdk 21, но как мне это решить? – vault