summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/content/SyncLogger.java12
-rw-r--r--services/core/java/com/android/server/content/SyncManager.java76
2 files changed, 71 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/content/SyncLogger.java b/services/core/java/com/android/server/content/SyncLogger.java
index d93bdc9efabf..85037688d2d4 100644
--- a/services/core/java/com/android/server/content/SyncLogger.java
+++ b/services/core/java/com/android/server/content/SyncLogger.java
@@ -98,6 +98,13 @@ public class SyncLogger {
}
/**
+ * @return whether log is enabled or not.
+ */
+ public boolean enabled() {
+ return false;
+ }
+
+ /**
* Actual implementation which is only used on userdebug/eng builds (by default).
*/
private static class RotatingFileLogger extends SyncLogger {
@@ -134,6 +141,11 @@ public class SyncLogger {
mLogPath = new File(Environment.getDataSystemDirectory(), "syncmanager-log");
}
+ @Override
+ public boolean enabled() {
+ return true;
+ }
+
private void handleException(String message, Exception e) {
if (!mErrorShown) {
Slog.e(TAG, message, e);
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 3e05d50b0355..f41aa5f7993c 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -58,6 +58,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.TrafficStats;
import android.os.BatteryStats;
+import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -461,6 +462,7 @@ public class SyncManager {
continue;
}
if (opx.key.equals(opy.key)) {
+ mLogger.log("Removing duplicate sync: ", opy);
mJobScheduler.cancel(opy.jobId);
}
}
@@ -473,25 +475,57 @@ public class SyncManager {
if (mJobScheduler != null) {
return;
}
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.d(TAG, "initializing JobScheduler object.");
- }
- mJobScheduler = (JobScheduler) mContext.getSystemService(
- Context.JOB_SCHEDULER_SERVICE);
- mJobSchedulerInternal = LocalServices.getService(JobSchedulerInternal.class);
- // Get all persisted syncs from JobScheduler
- List<JobInfo> pendingJobs = mJobScheduler.getAllPendingJobs();
- for (JobInfo job : pendingJobs) {
- SyncOperation op = SyncOperation.maybeCreateFromJobExtras(job.getExtras());
- if (op != null) {
- if (!op.isPeriodic) {
- // Set the pending status of this EndPoint to true. Pending icon is
- // shown on the settings activity.
- mSyncStorageEngine.markPending(op.target, true);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.d(TAG, "initializing JobScheduler object.");
+ }
+ mJobScheduler = (JobScheduler) mContext.getSystemService(
+ Context.JOB_SCHEDULER_SERVICE);
+ mJobSchedulerInternal = LocalServices.getService(JobSchedulerInternal.class);
+ // Get all persisted syncs from JobScheduler
+ List<JobInfo> pendingJobs = mJobScheduler.getAllPendingJobs();
+
+ int numPersistedPeriodicSyncs = 0;
+ int numPersistedOneshotSyncs = 0;
+ for (JobInfo job : pendingJobs) {
+ SyncOperation op = SyncOperation.maybeCreateFromJobExtras(job.getExtras());
+ if (op != null) {
+ if (op.isPeriodic) {
+ numPersistedPeriodicSyncs++;
+ } else {
+ numPersistedOneshotSyncs++;
+ // Set the pending status of this EndPoint to true. Pending icon is
+ // shown on the settings activity.
+ mSyncStorageEngine.markPending(op.target, true);
+ }
}
}
+ if (mLogger.enabled()) {
+ mLogger.log("Connected to JobScheduler: "
+ + numPersistedPeriodicSyncs + " periodic syncs "
+ + numPersistedOneshotSyncs + " oneshot syncs.");
+ }
+ cleanupJobs();
+
+ if ((numPersistedPeriodicSyncs == 0) && likelyHasPeriodicSyncs()) {
+ Slog.wtf(TAG, "Device booted with no persisted periodic syncs.");
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
- cleanupJobs();
+ }
+
+ /**
+ * @return whether the device most likely has some periodic syncs.
+ */
+ private boolean likelyHasPeriodicSyncs() {
+ try {
+ return AccountManager.get(mContext).getAccountsByType("com.google").length > 0;
+ } catch (Throwable th) {
+ // Just in case.
+ }
+ return false;
}
private JobScheduler getJobScheduler() {
@@ -1085,11 +1119,13 @@ public class SyncManager {
}
private void removeSyncsForAuthority(EndPoint info) {
+ mLogger.log("removeSyncsForAuthority: ", info);
verifyJobScheduler();
List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (op.target.matchesSpec(info)) {
- getJobScheduler().cancel(op.jobId);
+ mLogger.log("canceling: ", op);
+ getJobScheduler().cancel(op.jobId);
}
}
}
@@ -1634,6 +1670,7 @@ public class SyncManager {
}
private void onUserRemoved(int userId) {
+ mLogger.log("onUserRemoved: u", userId);
updateRunningAccounts(null /* Don't sync any target */);
// Clean up the storage engine database
@@ -2926,6 +2963,9 @@ public class SyncManager {
Slog.v(TAG, acc.toString());
}
}
+ if (mLogger.enabled()) {
+ mLogger.log("updateRunningAccountsH: ", Arrays.toString(mRunningAccounts));
+ }
if (mBootCompleted) {
doDatabaseCleanup();
}
@@ -2957,6 +2997,7 @@ public class SyncManager {
List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (!containsAccountAndUser(allAccounts, op.target.account, op.target.userId)) {
+ mLogger.log("canceling: ", op);
getJobScheduler().cancel(op.jobId);
}
}
@@ -3075,6 +3116,7 @@ public class SyncManager {
"removePeriodicSyncInternalH");
runSyncFinishedOrCanceledH(null, asc);
}
+ mLogger.log("removePeriodicSyncInternalH-canceling: ", op);
getJobScheduler().cancel(op.jobId);
}
}