0

ActivityManager.isUserAMonkey()在较旧的 Android 设备上运行时出现异常:

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

我不清楚这是否总是发生,或者仅在测试猴子下运行时发生,或者仅在某些设备上或什么上发生。(我在使用 Apkudo 的设备测试服务时遇到了这个问题,用户总是一只猴子。)这个问题什么时候得到修复也不清楚(它不会在大多数(所有?)较新的设备上发生)。

4

1 回答 1

0

该异常似乎仅限于 Android 2.2(SDK 版本 8)版本。并且似乎是android.app.ActivityManagerNative.

这是 2.2.1 代码(在 grepcode.com 上的 ActivityManagerNative.java 中找到):

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 代码相同)。(也可以在 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 的 javadocreadExceptionwriteException暗示他们在包裹的标题中记录了异常(因此不应该影响包裹中的实际数据),但似乎顺序确实很重要。

这意味着在 SDK 版本 8 上,ActivietyManager.isUserAMonkey()API 将始终抛出异常,无论是否猴子。SDK 8 之后的 Android 构建不应引发此异常。

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

于 2013-05-13T19:31:11.310 回答