2013-05-13 44 views
0

我看到异常时ActivityManager.isUserAMonkey()是在较旧的Android设备上运行:Android.isUserAMonkey抛出的RuntimeException

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.AndroidApp}: java.lang.RuntimeException: Unknown exception code: 1 msg null 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2781) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2797) 
    at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2132) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:143) 
    at android.app.ActivityThread.main(ActivityThread.java:4914) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.RuntimeException: Unknown exception code: 1 msg null 
    at android.os.Parcel.readException(Parcel.java:1257) 
    at android.os.Parcel.readException(Parcel.java:1235) 
    at android.app.ActivityManagerProxy.isUserAMonkey(ActivityManagerNative.java:2762) 
    at android.app.ActivityManager.isUserAMonkey(ActivityManager.java:990) 
    at <com.myapp....> ... 

有一点的错误的讨论在这里(包括从经典这就是 - 不响应可能开发商之一:“在标准平台的实现,这是非常不可能的。”)

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/tQJcM4O4WxM

它不是我清楚,如果这总是会发生,或者只发生一个试验M下运行时onkey,或只在某些设备上或什么。 (我使用Apkudo的设备测试服务遇到了这个问题,用户总是一只猴子。)它不清楚这个问题是否解决了,(大多数(所有?)新设备都不会发生这种情况)。

回答

0

该异常似乎仅限于Android 2.2(SDK版本8)发布。并且似乎是android.app.ActivityManagerNative中的一个错误。

这里是2.2.1代码(ActivityManagerNative.java on grepcode.com找到):

1248  case IS_USER_A_MONKEY_TRANSACTION: { 
1249   data.enforceInterface(IActivityManager.descriptor); 
1250   reply.writeInt(isUserAMonkey() ? 1 : 0); 
1251   reply.writeNoException(); 
1252   return true; 
1253  } 

这里是2.3.1代码(这似乎是一样的更近4.x的代码,我正确认识作品) 。 (另外found on grepcode.com):

1248  case IS_USER_A_MONKEY_TRANSACTION: { 
1239   data.enforceInterface(IActivityManager.descriptor); 
1240   boolean areThey = isUserAMonkey(); 
1241   reply.writeNoException(); 
1242   reply.writeInt(areThey ? 1 : 0); 
1243   return true; 
1244  } 

通知writeNoExceptionwriteInt的顺序在较新的代码是相反的。对应的代码读取包裹似乎是因为2.2.1不变,据我可以告诉:

2749 public boolean isUserAMonkey() throws RemoteException { 
2750  Parcel data = Parcel.obtain(); 
2751  Parcel reply = Parcel.obtain(); 
2752  data.writeInterfaceToken(IActivityManager.descriptor); 
2753  mRemote.transact(IS_USER_A_MONKEY_TRANSACTION, data, reply, 0); 
2754  reply.readException(); 
2755  boolean res = reply.readInt() != 0; 
2756  data.recycle(); 
2757  reply.recycle(); 
2758  return res; 
2759 } 

此方首先读取异常,那么预计该数据。

对于ParcelreadExceptionwriteException的javadoc暗示它们在包裹标题中记录异常(因此不应影响包裹中的实际数据),但似乎顺序确实很重要。

这意味着SDK版本8的ActivietyManager.isUserAMonkey() API将总是抛出一个异常,猴子与否。 Android SDK在SDK 8之后不会抛出这个异常。

我怀疑没有猴子(“1 msg null”与可能是“0 msg null”?)的SDK 8异常消息可能会略有不同,但没有没有运行猴子的例外情况。

相关问题