Add new component usage event (2/2)
Report component usage when a service is bound if the service is bound from an external package and the binding is considered usage. Explicitly exempt JobService bindings from this usage definition. Bug: 175829712 Test: adb shell dumpsys usagestats <package-name> Test: manual test Change-Id: I0bd9becd209ddc77b55f3102e7b03c4e2269ef4f
This commit is contained in:
@@ -273,10 +273,12 @@ public final class JobServiceContext implements ServiceConnection {
|
||||
// another binding flag for that.
|
||||
bindFlags = Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
|
||||
| Context.BIND_ALMOST_PERCEPTIBLE
|
||||
| Context.BIND_ALLOW_NETWORK_ACCESS;
|
||||
| Context.BIND_ALLOW_NETWORK_ACCESS
|
||||
| Context.BIND_NOT_APP_COMPONENT_USAGE;
|
||||
} else {
|
||||
bindFlags = Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
|
||||
| Context.BIND_NOT_PERCEPTIBLE;
|
||||
| Context.BIND_NOT_PERCEPTIBLE
|
||||
| Context.BIND_NOT_APP_COMPONENT_USAGE;
|
||||
}
|
||||
binding = mContext.bindServiceAsUser(intent, this, bindFlags,
|
||||
UserHandle.of(job.getUserId()));
|
||||
|
||||
@@ -369,6 +369,15 @@ public abstract class Context {
|
||||
/*********** Public flags above this line ***********/
|
||||
/*********** Hidden flags below this line ***********/
|
||||
|
||||
/**
|
||||
* Flag for {@link #bindService}: This flag is only intended to be used by the system to
|
||||
* indicate that a service binding is not considered as real package component usage and should
|
||||
* not generate a {@link android.app.usage.UsageEvents.Event#APP_COMPONENT_USED} event in usage
|
||||
* stats.
|
||||
* @hide
|
||||
*/
|
||||
public static final int BIND_NOT_APP_COMPONENT_USAGE = 0x00008000;
|
||||
|
||||
/**
|
||||
* Flag for {@link #bindService}: allow the process hosting the target service to be treated
|
||||
* as if it's as important as a perceptible app to the user and avoid the oom killer killing
|
||||
|
||||
@@ -86,6 +86,7 @@ import android.app.Service;
|
||||
import android.app.ServiceStartArgs;
|
||||
import android.app.admin.DevicePolicyEventLogger;
|
||||
import android.app.compat.CompatChanges;
|
||||
import android.app.usage.UsageEvents;
|
||||
import android.appwidget.AppWidgetManagerInternal;
|
||||
import android.compat.annotation.ChangeId;
|
||||
import android.compat.annotation.EnabledSince;
|
||||
@@ -2464,6 +2465,10 @@ public final class ActiveServices {
|
||||
s.setAllowedBgFgsStartsByBinding(true);
|
||||
}
|
||||
|
||||
if ((flags & Context.BIND_NOT_APP_COMPONENT_USAGE) != 0) {
|
||||
s.isNotAppComponentUsage = true;
|
||||
}
|
||||
|
||||
if (s.app != null) {
|
||||
updateServiceClientActivitiesLocked(s.app.mServices, c, true);
|
||||
}
|
||||
@@ -3332,6 +3337,14 @@ public final class ActiveServices {
|
||||
return msg;
|
||||
}
|
||||
|
||||
// Report usage if binding is from a different package except for explicitly exempted
|
||||
// bindings
|
||||
if (!r.appInfo.packageName.equals(r.mRecentCallingPackage)
|
||||
&& !r.isNotAppComponentUsage) {
|
||||
mAm.mUsageStatsService.reportEvent(
|
||||
r.packageName, r.userId, UsageEvents.Event.APP_COMPONENT_USED);
|
||||
}
|
||||
|
||||
// Service is now being launched, its package can't be stopped.
|
||||
try {
|
||||
AppGlobals.getPackageManager().setPackageStoppedState(
|
||||
|
||||
@@ -107,6 +107,7 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
|
||||
boolean delayed; // are we waiting to start this service in the background?
|
||||
boolean fgRequired; // is the service required to go foreground after starting?
|
||||
boolean fgWaiting; // is a timeout for going foreground already scheduled?
|
||||
boolean isNotAppComponentUsage; // is service binding not considered component/package usage?
|
||||
boolean isForeground; // is service currently in foreground mode?
|
||||
int foregroundId; // Notification ID of last foreground req.
|
||||
Notification foregroundNoti; // Notification record of foreground state.
|
||||
|
||||
Reference in New Issue
Block a user