1. test app를 만들어서 아래 퍼미션 추가하고
<uses-permission android:name="android.permission.MASTER_CLEAR" />
<uses-permission android:name="android.permission.REBOOT" />
코드상
if (mContext.checkCallingOrSelfPermission("android.permission.MASTER_CLEAR") !=
PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "Permission Denial: can't invoke masterClear from "
+ "pid=" + Binder.getCallingPid() + ", "
+ "uid=" + Binder.getCallingUid());
return;
}
try{
Power.reboot("reboot");
}catch(IOException e){
e.printStackTrace();
throw new DevicePortingException("Reboot fail");
}
했으나 아래와 같은 에러 메세지가 나옵니다.
01-14 09:19:12.410: WARN/System.err(1079): java.io.IOException: Operation not permitted
01-14 09:19:12.451: WARN/System.err(1079): at android.os.Power.reboot(Native Method)
01-14 09:19:12.451: WARN/System.err(1079): at com.kks.test.boot.Boot.rebootOk(Boot.java:76)
01-14 09:19:12.451: WARN/System.err(1079): at com.kks.test.boot.Boot.access$000(Boot.java:20)
01-14 09:19:12.451: WARN/System.err(1079): at com.kks.test.boot.Boot$1.onClick(Boot.java:38)
01-14 09:19:12.451: WARN/System.err(1079): at android.view.View.performClick(View.java:2344)
01-14 09:19:12.451: WARN/System.err(1079): at android.view.View.onTouchEvent(View.java:4133)
01-14 09:19:12.451: WARN/System.err(1079): at android.widget.TextView.onTouchEvent(TextView.java:6504)
01-14 09:19:12.451: WARN/System.err(1079): at android.view.View.dispatchTouchEvent(View.java:3672)
01-14 09:19:12.451: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:19:12.451: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:19:12.451: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:19:12.451: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:19:12.451: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:19:12.451: WARN/System.err(1079): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1712)
01-14 09:19:12.451: WARN/System.err(1079): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1202)
01-14 09:19:12.451: WARN/System.err(1079): at android.app.Activity.dispatchTouchEvent(Activity.java:1987)
01-14 09:19:12.451: WARN/System.err(1079): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1696)
01-14 09:19:12.451: WARN/System.err(1079): at android.view.ViewRoot.handleMessage(ViewRoot.java:1653)
01-14 09:19:12.451: WARN/System.err(1079): at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 09:19:12.451: WARN/System.err(1079): at android.os.Looper.loop(Looper.java:123)
01-14 09:19:12.451: WARN/System.err(1079): at android.app.ActivityThread.main(ActivityThread.java:4195)
01-14 09:19:12.451: WARN/System.err(1079): at java.lang.reflect.Method.invokeNative(Native Method)
01-14 09:19:12.451: WARN/System.err(1079): at java.lang.reflect.Method.invoke(Method.java:521)
01-14 09:19:12.451: WARN/System.err(1079): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
01-14 09:19:12.451: WARN/System.err(1079): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
01-14 09:19:12.451: WARN/System.err(1079): at dalvik.system.NativeStart.main(Native Method)
2. test app를 만들어서 아래 퍼미션 추가하고
<uses-permission android:name="android.permission.MASTER_CLEAR" />
<uses-permission android:name="android.permission.REBOOT" />
코드상
if (mContext.checkCallingOrSelfPermission("android.permission.MASTER_CLEAR") !=
PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "Permission Denial: can't invoke masterClear from "
+ "pid=" + Binder.getCallingPid() + ", "
+ "uid=" + Binder.getCallingUid());
return;
}
try{
RecoverySystem.rebootAndWipe();
}catch(IOException e){
e.printStackTrace();
throw new DevicePortingException("Reboot for masterClear() failed");
}
했으나 아래와 같은 에러 메세지가 나옵니다.
01-14 09:20:02.348: DEBUG/(1079): unable to unlink '/cache/recovery/command': Permission denied (errno=13)
01-14 09:20:02.348: DEBUG/(1079): unable to unlink '/cache/recovery/log': Permission denied (errno=13)
01-14 09:20:02.348: WARN/System.err(1079): java.io.FileNotFoundException: /cache/recovery/command
01-14 09:20:02.348: WARN/System.err(1079): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:231)
01-14 09:20:02.348: WARN/System.err(1079): at java.io.FileOutputStream.<init>(FileOutputStream.java:96)
01-14 09:20:02.348: WARN/System.err(1079): at java.io.FileOutputStream.<init>(FileOutputStream.java:69)
01-14 09:20:02.348: WARN/System.err(1079): at java.io.FileWriter.<init>(FileWriter.java:45)
01-14 09:20:02.348: WARN/System.err(1079): at com.android.internal.os.RecoverySystem.bootCommand(RecoverySystem.java:87)
01-14 09:20:02.348: WARN/System.err(1079): at com.android.internal.os.RecoverySystem.rebootAndWipe(RecoverySystem.java:74)
01-14 09:20:02.348: WARN/System.err(1079): at com.kks.test.boot.Boot.resetToFactoryModeOk(Boot.java:96)
01-14 09:20:02.348: WARN/System.err(1079): at com.kks.test.boot.Boot.access$100(Boot.java:20)
01-14 09:20:02.348: WARN/System.err(1079): at com.kks.test.boot.Boot$2.onClick(Boot.java:52)
01-14 09:20:02.348: WARN/System.err(1079): at android.view.View.performClick(View.java:2344)
01-14 09:20:02.348: WARN/System.err(1079): at android.view.View.onTouchEvent(View.java:4133)
01-14 09:20:02.348: WARN/System.err(1079): at android.widget.TextView.onTouchEvent(TextView.java:6504)
01-14 09:20:02.348: WARN/System.err(1079): at android.view.View.dispatchTouchEvent(View.java:3672)
01-14 09:20:02.348: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:20:02.348: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:20:02.348: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:20:02.348: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:20:02.348: WARN/System.err(1079): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
01-14 09:20:02.348: WARN/System.err(1079): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1712)
01-14 09:20:02.348: WARN/System.err(1079): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1202)
01-14 09:20:02.348: WARN/System.err(1079): at android.app.Activity.dispatchTouchEvent(Activity.java:1987)
01-14 09:20:02.348: WARN/System.err(1079): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1696)
01-14 09:20:02.348: WARN/System.err(1079): at android.view.ViewRoot.handleMessage(ViewRoot.java:1653)
01-14 09:20:02.348: WARN/System.err(1079): at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 09:20:02.348: WARN/System.err(1079): at android.os.Looper.loop(Looper.java:123)
01-14 09:20:02.348: WARN/System.err(1079): at android.app.ActivityThread.main(ActivityThread.java:4195)
01-14 09:20:02.348: WARN/System.err(1079): at java.lang.reflect.Method.invokeNative(Native Method)
01-14 09:20:02.348: WARN/System.err(1079): at java.lang.reflect.Method.invoke(Method.java:521)
01-14 09:20:02.348: WARN/System.err(1079): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
01-14 09:20:02.348: WARN/System.err(1079): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
01-14 09:20:02.348: WARN/System.err(1079): at dalvik.system.NativeStart.main(Native Method)
narmal reboot도 해결 되었네요..
kernel 단에는 narmal reboot을 지원하는데, 플랫폼에서 interface 함수 가 없네요..
ICheckinService interface에 함수를 추가해서 사용하니 되네요..
narmal reboot을 사용할때는 power.reboot("NULL"); 사용하면 되네요...
ICheckinService 에 함수를 추가 해서 power.reboot("NULL"); 을 사용하려 하니 에러가 뜹니다.
혹시 ICheckinService 에 추가를 어떻게 해야 하나요?
저는 ICheckinService.aidl에 제가 만든 함수 추가 하고.. FallbackCheckinService에서 인터페이스 구현 하여
service.myreboot();을 호출 하였습니다.
ICheckinService service = ICheckinService.Stub.asInterface(ServiceManager.getService("checkin"));
if (service != null)
{
try {
// This RPC should never return
service.myreboot();
}
catch (android.os.RemoteException e)
{
// Intentionally blank - there's nothing we can do here
Log.w("dddd", "Unable to invoke ICheckinService.masterClear()");
}
}
else
{
Log.w("dddd", "Unable to locate ICheckinService");
}
에러 내용은 다음과 같습니다.
D/dalvikvm( 1877): --- called into dvmAbstractMethodStub
E/JavaBinder( 1877): *** Uncaught remote exception! (Exceptions are not yet supported across processes.)
E/JavaBinder( 1877): java.lang.AbstractMethodError: abstract method not implemented
E/JavaBinder( 1877): at android.os.ICheckinService$Stub.myreboot(ICheckinService.java)
E/JavaBinder( 1877): at android.os.ICheckinService$Stub.onTransact(ICheckinService.java:81)
E/JavaBinder( 1877): at android.os.Binder.execTransact(Binder.java:287)
E/JavaBinder( 1877): at dalvik.system.NativeStart.run(Native Method)
W/dalvikvm( 1877): threadid=77: thread exiting with uncaught exception (group=0x4000fe70)
E/AndroidRuntime( 1877): Uncaught handler: thread Binder Thread #6 exiting due to uncaught exception
E/AndroidRuntime( 1877): *** EXCEPTION IN SYSTEM PROCESS. System will crash.
E/AndroidRuntime( 1877): java.lang.AbstractMethodError: abstract method not implemented
E/AndroidRuntime( 1877): at android.os.ICheckinService$Stub.myreboot(ICheckinService.java)
E/AndroidRuntime( 1877): at android.os.ICheckinService$Stub.onTransact(ICheckinService.java:81)
E/AndroidRuntime( 1877): at android.os.Binder.execTransact(Binder.java:287)
E/AndroidRuntime( 1877): at dalvik.system.NativeStart.run(Native Method)
factory reset reboot은 되고 있는데 일반 reboot은 안되고 있습니다.
factory reset reboot은 아래와 같이 하면 됩니다.
ICheckinService service = ICheckinService.Stub.asInterface(ServiceManager.getService("checkin"));
if (service != null) {
try {
// This RPC should never return
service.masterClear();
} catch (android.os.RemoteException e) {
// Intentionally blank - there's nothing we can do here
Log.w(TAG, "Unable to invoke ICheckinService.masterClear()");
}
} else {
Log.w(TAG, "Unable to locate ICheckinService");
}
근데 reboot 함수에 string이 모드 인것 같은데, 찾아봐도 recovery 만 보이고 다른 것은 안보이네요...ㅡㅡ..