1.问题描述:
【Super Cleaner-Antivirus..】【必现】【非单机问题】点击进入软件,软件闪退
2.根本原因
从log来看,是由于应用发送了太多Binder给系统,也就是应用对系统的跨进程调用次数太多,超过了系统规定的阈值,导致应用被Kill。
05-29 12:04:32.364 1218 1374 E ActivityManager: Uid 10109 sent too many Binders to uid 1000
05-29 12:04:32.365 1218 1374 I ActivityManager: Killing 8231:com.apps.go.clean.boost.master:applockLibService/u0a109 (adj 500): Too many Binders sent to SYSTEM
05-29 12:04:32.368 1218 1377 W libprocessgroup: kill(-8231, 9) failed: No such process
05-29 12:04:32.369 748 748 E ANDR-IOP: IOP HAL: Received pkg_name = com.apps.go.clean.boost.master:applockLibService pid = 0
05-29 12:04:32.371 1218 1374 W ActivityManager: Scheduling restart of crashed service com.apps.go.clean.boost.master/com.clean.spaceplus.batterysaver.BatteryService in 1000ms
05-29 12:04:32.377 1218 1374 I ActivityManager: Killing 8317:com.apps.go.clean.boost.master/u0a109 (adj 500): Too many Binders sent to SYSTEM
05-29 12:04:32.377 1218 1225 I BpBinder: Limit reached bit reset for uid 1000 (fewer than 10109 proxies from uid 5500 held)
05-29 12:04:32.379 748 748 E ANDR-IOP: IOP HAL: Received pkg_name = com.apps.go.clean.boost.master pid = 0
05-29 12:04:32.380 1218 1374 W ActivityManager: Scheduling restart of crashed service com.apps.go.clean.boost.master/com.power.PowerService in 10992ms
05-29 12:04:32.412 663 663 I Zygote : Process 8317 exited due to signal (9)
05-29 12:04:32.419 663 663 I Zygote : Process 8231 exited due to signal (9)
05-29 12:04:32.419 1218 1377 W libprocessgroup: kill(-8231, 9) failed: No such process
05-29 12:04:32.420 1218 1377 I libprocessgroup: Successfully killed process cgroup uid 10109 pid 8231 in 52ms
05-29 12:04:32.420 1218 1377 W libprocessgroup: kill(-8317, 9) failed: No such process
05-29 12:04:32.421 1218 1377 I libprocessgroup: Successfully killed process cgroup uid 10109 pid 8317 in 0ms
在Android P源码的ActivityManagerService.java中:
BinderInternal.nSetBinderProxyCountWatermarks(6000,5500);
BinderInternal.nSetBinderProxyCountEnabled(true);
BinderInternal.setBinderProxyCountCallback(
new BinderInternal.BinderProxyLimitListener() {
@Override
public void onLimitReached(int uid) {
Slog.wtf(TAG, "Uid " + uid + " sent too many Binders to uid "
+ Process.myUid());
if (uid == Process.SYSTEM_UID) {
Slog.i(TAG, "Skipping kill (uid is SYSTEM)");
} else {
killUid(UserHandle.getAppId(uid), UserHandle.getUserId(uid),
"Too many Binders sent to SYSTEM");
}
}
}, mHandler);
这是Android P新增的代码,目的是对Binder的创建与销毁进行管理,第一行代码是给整个Android系统所能创建的Binder数量的最大值进行了限制,如果超过了6000,就会回调第三行设置的接口回调。
如果进程的UID不是SYSTEM_UID,就会被Kill掉。