case1
Unknown binder error code 0xfffffff7 出现的原因。
当客户端与服务端正在通过Binder机制交互时,例如A正在通过Binder机制与B对象进行交互,即A请求B do something,
这个过程中如果Binder机制发生了异常,导致A与B的交互不能正常进行,例如代码中显示调用System.exit(0)结束应用程序
(说明:System.exit(0)方法会 清空该Process的一切资源,包括Activity、Service、BroadcastReceiver等资源,Binder交互
也结束),系统就打印如下Log信息:“Error: JavaBinder Unknown binder error code. 0xfffffff7”。接下来,C++层会调用
binderDied() 方法,其Binder客户端也死掉了,
case2
测试组使用Monkey在 Android上想对APK进行自动化测试,但在启动Monkey测试工具时,一直无法正常启动,
1.
shell
@android
:/ $ monkey -p com.android.calculator2 -v
100
2.
monkey -p com.android.calculator2 -v
100
3.
:Monkey: seed=
1393356259515
count=
100
4.
:AllowPackage: com.android.calculator2
5.
:IncludeCategory: android.intent.category.LAUNCHER
6.
:IncludeCategory: android.intent.category.MONKEY
7.
Killed
一执行就会被killed,无意间测试说起这个问题,说是因为这个系统我们定制过,应该是定制的原因导致的问题。
我较真了,怎么可能是我们定制的原因呢?一般的APK在这个系统上都是可以正常运行的,并且也没有出过问题,所以我对定制这个说法完全不认同。
让相关人员重新执行后,让他同时提供相应的logcat的日志。
日志如下:
01.
02
-
13
10
:
02
:
24.604
D/<a href=
"http://www.it165.net/pro/ydad/"
target=
"_blank"
class
=
"keylink"
>Android</a>Runtime(
14430
): Calling main entry com.android.commands.monkey.Monkey
02.
02
-
13
10
:
02
:
24.614
D/dalvikvm(
14430
): Note:
class
Landroid/app/ActivityManagerNative; has
168
unimplemented (
abstract
) methods
03.
02
-
13
10
:
02
:
24.614
D/AndroidRuntime(
14430
): Shutting down VM
04.
02
-
13
10
:
02
:
24.614
W/dalvikvm(
14430
): threadid=
1
: thread exiting with uncaught exception (group=
0x416a5700
)
05.
02
-
13
10
:
02
:
24.614
E/ActivityManager(
605
): Activity Manager Crash
06.
02
-
13
10
:
02
:
24.614
E/ActivityManager(
605
): java.lang.NullPointerException
07.
02
-
13
10
:
02
:
24.614
E/ActivityManager(
605
): at com.android.server.am.ActivityManagerService.registerReceiver(ActivityManagerService.java:
11867
)
08.
02
-
13
10
:
02
:
24.614
E/ActivityManager(
605
): at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:
308
)
09.
02
-
13
10
:
02
:
24.614
E/ActivityManager(
605
): at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:
1809
)
10.
02
-
13
10
:
02
:
24.614
E/ActivityManager(
605
): at android.os.Binder.execTransact(Binder.java:
388
)
11.
02
-
13
10
:
02
:
24.614
E/ActivityManager(
605
): at dalvik.system.NativeStart.run(Native Method)
12.
02
-
13
10
:
02
:
24.624
E/JavaBinder(
14430
): Unknown binder error code.
0xfffffff7
13.
02
-
13
10
:
02
:
24.624
I/Process (
14430
): Sending signal. PID:
14430
SIG:
9
14.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): *** FATAL EXCEPTION IN SYSTEM PROCESS: main
15.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): java.lang.NullPointerException
16.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at android.os.Parcel.readException(Parcel.java:
1437
)
17.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at android.os.Parcel.readException(Parcel.java:
1385
)
18.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at android.app.ActivityManagerProxy.registerReceiver(ActivityManagerNative.java:
2237
)
19.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at com.android.commands.monkey.MonkeyNetworkMonitor.register(MonkeyNetworkMonitor.java:
88
)
20.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at com.android.commands.monkey.Monkey.getSystemInterfaces(Monkey.java:
979
)
21.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at com.android.commands.monkey.Monkey.run(Monkey.java:
586
)
22.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at com.android.commands.monkey.Monkey.main(Monkey.java:
509
)
23.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
24.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:
235
)
25.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at dalvik.system.NativeStart.main(Native Method)
26.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): Error reporting crash
27.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): android.os.RemoteException: Unknown binder error code.
0xfffffff7
28.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at android.os.BinderProxy.transact(Native Method)
29.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:
3525
)
30.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:
76
)
31.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:
693
)
32.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:
690
)
33.
02
-
13
10
:
02
:
24.624
E/AndroidRuntime(
14430
): at dalvik.system.NativeStart.main(Native Method)
我了个去,这个程序一运行,居然把 Activity Manager 给搞挂了,从现象来看,应该是Framework层的bug,即使应用有问题,ActivityManger也不应该挂。
分析了一下代码,看看 com.android.server.am.ActivityManagerService.registerReceiver 的实现:
01.
public
Intent registerReceiver(IApplicationThread caller, String callerPackage,
02.
IIntentReceiver receiver, IntentFilter filter, String permission,
int
userId) {
03.
...
04.
synchronized
(
this
) {
05.
ProcessRecord callerApp =
null
;
06.
if
(caller !=
null
) {
07.
callerApp = getRecordForAppLocked(caller);
08.
if
(callerApp ==
null
) {
09.
throw
new
SecurityException(
10.
"Unable to find app for caller "
+ caller
11.
+
" (pid="
+ Binder.getCallingPid()
12.
+
") when registering receiver "
+ receiver);
13.
}
14.
...
15.
callingUid = callerApp.info.uid;
16.
callingPid = callerApp.pid;
17.
}
else
{
18.
callerPackage =
null
;
19.
callingUid = Binder.getCallingUid();
20.
callingPid = Binder.getCallingPid();
21.
}
22.
23.
...
24.
25.
BroadcastFilter bf =
new
BroadcastFilter(filter, rl, callerPackage,
// 日志显示,挂在这里
26.
permission, callingUid, userId, callerApp.info.flags & ApplicationInfo.FLAG_SYSTEM) !=
0
);
27.
...
28.
}
从代码上看,出现空指针异常的这个点,确实是有缺陷的,如果 caller 为null,则 callerApp 就是 null。
Google发布的代码,也会有bug,是人写的代码,就有缺陷啊。
修改成为如下:
1.
BroadcastFilter bf =
new
BroadcastFilter(filter, rl, callerPackage,
2.
permission, callingUid, userId,
3.
(callerApp !=
null
&& (callerApp.info.flags & ApplicationInfo.FLAG_SYSTEM) !=
0
));
重新编译出相应的 services.jar,替换 /system/framework/ 下的同名文件,再让测试重新验证,问题解决。