FATAL EXCEPTION IN SYSTEM PROCESS:java.lang.NullPointerException 之monkey

本文介绍了一种Android系统中出现Unknownbindererrorcode0xfffffff7错误的情况及其解决办法,并通过修改ActivityManagerService源代码解决了Monkey工具启动失败的问题。
摘要由CSDN通过智能技术生成


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/ 下的同名文件,再让测试重新验证,问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值