Android.isUserAMonkey抛出RuntimeException

时间:2013-05-13 19:31:11

标签: android monkeyrunner android-2.2-froyo

我在旧的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的设备测试服务遇到这个问题,其中用户总是一只猴子。)当它被修复时也不清楚(大多数(所有?)新设备都不会发生这种情况)。

1 个答案:

答案 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        }

请注意,较新代码中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    }

此方首先读取异常,然后预期数据。

Parcel readExceptionwriteException的javadoc暗示他们会在地块的标题中记录异常(因此不应影响地块中的实际数据),但似乎订单很重要。

这意味着在SDK版本8上,ActivietyManager.isUserAMonkey() API将总是抛出异常,不管是不是猴子。 SDK 8之后的Android版本不应该抛出此异常。

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