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....> ...

ここでは、バグについて少し議論しています (開発者の 1 人からの古典的な不可能な応答を含む: 「標準のプラットフォーム実装では、これはほとんど不可能です。」)

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    }

この側は最初に例外を読み取り、次にデータを期待します。

パーセル の javadoc は、パーセルのヘッダーに例外を記録することreadExceptionwriteException暗示しています (したがって、パーセル内の実際のデータに影響を与えるべきではありません) が、順序が重要であるようです。

これは、SDK バージョン 8 では、ActivietyManager.isUserAMonkey()API がモンキーであろうとなかろうと常に例外をスローすることを意味します。SDK 8 以降の Android ビルドでは、この例外がスローされません。

SDK 8 の例外メッセージは、サルがないと若干異なる可能性があると思います (「1 msg null」と「0 msg null」でしょうか?) が、サルが実行されていない場合の例外の例はありません。

于 2013-05-13T19:31:11.310 に答える