我在旧的Android设备上运行ActivityManager.isUserAMonkey()
时看到异常:
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....> ...
这里有一些关于这个bug的讨论(包括一个开发人员的经典问题 - 不可能的响应:“在标准平台实现中,这几乎是不可能的。”)
https://groups.google.com/forum/?fromgroups=#!topic/android-developers/tQJcM4O4WxM
我不清楚这是否总是发生,或者仅在测试猴子下运行时发生,或者仅在某些设备上运行或发生什么。 (我正在使用Apkudo的设备测试服务遇到这个问题,其中用户总是一只猴子。)当它被修复时也不清楚(大多数(所有?)新设备都不会发生这种情况)。
答案 0 :(得分: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 }
请注意,较新代码中writeNoException
和writeInt
的顺序相反。据我所知,自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 }
此方首先读取异常,然后预期数据。
Parcel readException
和writeException
的javadoc暗示他们会在地块的标题中记录异常(因此不应影响地块中的实际数据),但似乎订单很重要。
这意味着在SDK版本8上,ActivietyManager.isUserAMonkey()
API将总是抛出异常,不管是不是猴子。 SDK 8之后的Android版本不应该抛出此异常。
我怀疑SDK 8异常消息可能在没有猴子的情况下略有不同(“1 msg null”与可能“0 msg null”?),但是没有猴子运行的例子没有。< / p>