Merge "Rebind ContentCaptureService when the binderDied." into sc-v2-dev
This commit is contained in:
@@ -223,7 +223,7 @@ public final class ContentCaptureManagerService extends
|
|||||||
@Override // from AbstractMasterSystemService
|
@Override // from AbstractMasterSystemService
|
||||||
protected ContentCapturePerUserService newServiceLocked(@UserIdInt int resolvedUserId,
|
protected ContentCapturePerUserService newServiceLocked(@UserIdInt int resolvedUserId,
|
||||||
boolean disabled) {
|
boolean disabled) {
|
||||||
return new ContentCapturePerUserService(this, mLock, disabled, resolvedUserId);
|
return new ContentCapturePerUserService(this, mLock, disabled, resolvedUserId, mHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override // from SystemService
|
@Override // from SystemService
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
|
|||||||
import android.content.pm.ServiceInfo;
|
import android.content.pm.ServiceInfo;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
@@ -75,6 +76,7 @@ import com.android.server.contentcapture.RemoteContentCaptureService.ContentCapt
|
|||||||
import com.android.server.infra.AbstractPerUserSystemService;
|
import com.android.server.infra.AbstractPerUserSystemService;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -88,6 +90,10 @@ final class ContentCapturePerUserService
|
|||||||
|
|
||||||
private static final String TAG = ContentCapturePerUserService.class.getSimpleName();
|
private static final String TAG = ContentCapturePerUserService.class.getSimpleName();
|
||||||
|
|
||||||
|
private static final int MAX_REBIND_COUNTS = 5;
|
||||||
|
// 5 minutes
|
||||||
|
private static final long REBIND_DURATION_MS = 5 * 60 * 1_000;
|
||||||
|
|
||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private final SparseArray<ContentCaptureServerSession> mSessions = new SparseArray<>();
|
private final SparseArray<ContentCaptureServerSession> mSessions = new SparseArray<>();
|
||||||
|
|
||||||
@@ -121,11 +127,18 @@ final class ContentCapturePerUserService
|
|||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private ContentCaptureServiceInfo mInfo;
|
private ContentCaptureServiceInfo mInfo;
|
||||||
|
|
||||||
|
private Instant mLastRebindTime;
|
||||||
|
private int mRebindCount;
|
||||||
|
private final Handler mHandler;
|
||||||
|
|
||||||
|
private final Runnable mReBindServiceRunnable = new RebindServiceRunnable();
|
||||||
|
|
||||||
// TODO(b/111276913): add mechanism to prune stale sessions, similar to Autofill's
|
// TODO(b/111276913): add mechanism to prune stale sessions, similar to Autofill's
|
||||||
|
|
||||||
ContentCapturePerUserService(@NonNull ContentCaptureManagerService master,
|
ContentCapturePerUserService(@NonNull ContentCaptureManagerService master,
|
||||||
@NonNull Object lock, boolean disabled, @UserIdInt int userId) {
|
@NonNull Object lock, boolean disabled, @UserIdInt int userId, Handler handler) {
|
||||||
super(master, lock, userId);
|
super(master, lock, userId);
|
||||||
|
mHandler = handler;
|
||||||
updateRemoteServiceLocked(disabled);
|
updateRemoteServiceLocked(disabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,9 +203,43 @@ final class ContentCapturePerUserService
|
|||||||
Slog.w(TAG, "remote service died: " + service);
|
Slog.w(TAG, "remote service died: " + service);
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
mZombie = true;
|
mZombie = true;
|
||||||
writeServiceEvent(
|
// Reset rebindCount if over 12 hours mLastRebindTime
|
||||||
FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__ON_REMOTE_SERVICE_DIED,
|
if (mLastRebindTime != null && Instant.now().isAfter(
|
||||||
getServiceComponentName());
|
mLastRebindTime.plusMillis(12 * 60 * 60 * 1000))) {
|
||||||
|
if (mMaster.debug) {
|
||||||
|
Slog.i(TAG, "The current rebind count " + mRebindCount + " is reset.");
|
||||||
|
}
|
||||||
|
mRebindCount = 0;
|
||||||
|
}
|
||||||
|
if (mRebindCount >= MAX_REBIND_COUNTS) {
|
||||||
|
writeServiceEvent(
|
||||||
|
FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__ON_REMOTE_SERVICE_DIED,
|
||||||
|
getServiceComponentName());
|
||||||
|
}
|
||||||
|
if (mRebindCount < MAX_REBIND_COUNTS) {
|
||||||
|
mHandler.removeCallbacks(mReBindServiceRunnable);
|
||||||
|
mHandler.postDelayed(mReBindServiceRunnable, REBIND_DURATION_MS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateRemoteServiceAndResurrectSessionsLocked() {
|
||||||
|
boolean disabled = !isEnabledLocked();
|
||||||
|
updateRemoteServiceLocked(disabled);
|
||||||
|
resurrectSessionsLocked();
|
||||||
|
}
|
||||||
|
|
||||||
|
private final class RebindServiceRunnable implements Runnable{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
synchronized (mLock) {
|
||||||
|
if (mZombie) {
|
||||||
|
mLastRebindTime = Instant.now();
|
||||||
|
mRebindCount++;
|
||||||
|
updateRemoteServiceAndResurrectSessionsLocked();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,8 +287,8 @@ final class ContentCapturePerUserService
|
|||||||
}
|
}
|
||||||
|
|
||||||
void onPackageUpdatedLocked() {
|
void onPackageUpdatedLocked() {
|
||||||
updateRemoteServiceLocked(!isEnabledLocked());
|
mRebindCount = 0;
|
||||||
resurrectSessionsLocked();
|
updateRemoteServiceAndResurrectSessionsLocked();
|
||||||
}
|
}
|
||||||
|
|
||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
@@ -555,6 +602,8 @@ final class ContentCapturePerUserService
|
|||||||
mInfo.dump(prefix2, pw);
|
mInfo.dump(prefix2, pw);
|
||||||
}
|
}
|
||||||
pw.print(prefix); pw.print("Zombie: "); pw.println(mZombie);
|
pw.print(prefix); pw.print("Zombie: "); pw.println(mZombie);
|
||||||
|
pw.print(prefix); pw.print("Rebind count: "); pw.println(mRebindCount);
|
||||||
|
pw.print(prefix); pw.print("Last rebind: "); pw.println(mLastRebindTime);
|
||||||
|
|
||||||
if (mRemoteService != null) {
|
if (mRemoteService != null) {
|
||||||
pw.print(prefix); pw.println("remote service:");
|
pw.print(prefix); pw.println("remote service:");
|
||||||
|
|||||||
Reference in New Issue
Block a user