1.service超時
【android R】
// How long we wait for a service to finish executing.
static final int SERVICE_TIMEOUT = 20*1000;
// How long we wait for a service to finish executing.
static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10;
問題描述:
ANR - executing service com.***.versionUpdateApp/.appupdater.share.UpgradeService
200s bg service超時
Message msg = mAm.mHandler.obtainMessage(
ActivityManagerService.SERVICE_TIMEOUT_MSG);
create/bind/unbind/destoryd等超時20s
后臺service 但是20s就報超時
報錯
130|console:/ # logcat | grep "MyService-BG" &
[1] 6328 6329
m start-service -n com.example.testanr/.MyService2 <
Starting service: Intent { cmp=com.example.testanr/.MyService2 }
11-24 14:32:14.796 2349 3307 V ActivityManager: *** startService: Intent { cmp=com.example.testanr/.MyService2 } type=null fg=false
11-24 14:32:14.796 2349 3307 V ActivityManager: retrieveServiceLocked: Intent { cmp=com.example.testanr/.MyService2 } type=null callingUid=0
11-24 14:32:14.796 2349 3307 V ActivityManager: Retrieve created new service: ServiceRecord{2ce972c u0 com.example.testanr/.MyService2}
11-24 14:32:14.797 2349 3307 V ActivityManager: Bringing up ServiceRecord{2ce972c u0 com.example.testanr/.MyService2} android.content.Intent$FilterComparison@4e36777 fg=false
11-24 14:32:14.797 2349 3307 V ActivityManager: >>> EXECUTING create of ServiceRecord{2ce972c u0 com.example.testanr/.MyService2} in app ProcessRecord{7c0dcbc 6111:com.example.testanr/u0a81}
11-24 14:32:14.799 2349 3307 V ActivityManager: Sending arguments to: ServiceRecord{2ce972c u0 com.example.testanr/.MyService2} android.content.Intent$FilterComparison@4e36777 args=Intent { cmp=com.example.testanr/.MyService2 }
11-24 14:32:14.799 2349 3307 V ActivityManager: >>> EXECUTING start of ServiceRecord{2ce972c u0 com.example.testanr/.MyService2} in app ProcessRecord{7c0dcbc 6111:com.example.testanr/u0a81}
11-24 14:32:14.803 6111 6111 E MyService-BG: begin onStartCommand 3333333333333
11-24 14:32:14.803 6111 6111 E MyService-BG: begin onStartCommand 3333333333333
11-24 14:32:14.803 2349 3307 V ActivityManager: <<< DONE EXECUTING ServiceRecord{2ce972c u0 com.example.testanr/.MyService2}: nesting=2, inDestroying=false, app=ProcessRecord{7c0dcbc 6111:com.example.testanr/u0a81}
console:/ #
console:/ # 11-24 14:32:34.809 2349 2396 W ActivityManager: Timeout executing service: ServiceRecord{2ce972c u0 com.example.testanr/.MyService2}
if (DEBUG_SERVICE) Slog.v(TAG_SERVICE,
"*** startService: " + service + " type=" + resolvedType + " fg=" + requireForeground);
從log來看啟動時fg為false但是還是20s超時原因如下源碼
final boolean callerFg;
if (caller != null) {
final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller);
if (callerApp == null) {
throw new SecurityException(
"Unable to find app for caller " + caller
+ " (pid=" + callingPid
+ ") when starting service " + service);
}
callerFg = callerApp.setSchedGroup != ProcessList.SCHED_GROUP_BACKGROUND;
} else {
callerFg = true;
}
因為caller是fg的狀態(tài)。
后臺進程接收廣播啟動service被禁止括眠。
11-24 15:50:02.038 14664 14664 D AndroidRuntime: Shutting down VM
11-24 15:50:02.041 14664 14664 E AndroidRuntime: FATAL EXCEPTION: main
11-24 15:50:02.041 14664 14664 E AndroidRuntime: Process: com.tcl.serviceDemo, PID: 14664
11-24 15:50:02.041 14664 14664 E AndroidRuntime: java.lang.RuntimeException: Unable to start receiver com.tcl.serviceDemo.jacobReceiver: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.tcl.serviceDemo/.jacobServiceBg }: app is in background uid UidRecord{d135efe u0a84 RCVR idle change:idle|uncached procs:1 seq(0,0,0)}
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.app.ActivityThread.handleReceiver(ActivityThread.java:4376)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.app.ActivityThread.access$1600(ActivityThread.java:261)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2164)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:111)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.os.Looper.loop(Looper.java:249)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8077)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:591)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1188)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.tcl.serviceDemo/.jacobServiceBg }: app is in background uid UidRecord{d135efe u0a84 RCVR idle change:idle|uncached procs:1 seq(0,0,0)}
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1729)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.app.ContextImpl.startService(ContextImpl.java:1684)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.content.ContextWrapper.startService(ContextWrapper.java:720)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.content.ContextWrapper.startService(ContextWrapper.java:720)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at com.tcl.serviceDemo.jacobReceiver.onReceive(jacobReceiver.java:21)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: at android.app.ActivityThread.handleReceiver(ActivityThread.java:4367)
11-24 15:50:02.041 14664 14664 E AndroidRuntime: ... 8 more
without a qualified user
12-03 23:17:07.843 2909 2909 W ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1762 android.content.ContextWrapper.bindService:756 com.tcl.voicehelper.TScene.bindService:167 com.tcl.voicehelper.TScene.init:115 com.tcl.voicehelper.TScene.init:91
cts - android.cts.statsdatom.statsd.ProcStateAtomTests#testForegroundService failed 報錯
appServicesRestrictedInBackgroundLOSP
[PASS]
2-27 07:20:57.371 1000 823 1790 I ActivityManager: Background started FGS: Allowed [callingPackage: com.android.shell; callingUid: 2000; uidState: NONE; intent: Intent { cmp=com.android.server.cts.device.statsdatom/.StatsdCtsForegroundService }; code:SYSTEM_UID; tempAllowListReason:<,reasonCode:SYSTEM_ALLOW_LISTED,duration:9223372036854775807,callingUid:-1>; targetSdkVersion:31; callerTargetSdkVersion:-1; startForegroundCount:0; bindFromPackage:null]