summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/java/com/android/server/EventLogTags.logtags12
-rw-r--r--services/java/com/android/server/IdleMaintenanceService.java66
-rw-r--r--services/java/com/android/server/MountService.java12
3 files changed, 60 insertions, 30 deletions
diff --git a/services/java/com/android/server/EventLogTags.logtags b/services/java/com/android/server/EventLogTags.logtags
index 59577ad0662e..8eaa91d65d06 100644
--- a/services/java/com/android/server/EventLogTags.logtags
+++ b/services/java/com/android/server/EventLogTags.logtags
@@ -162,3 +162,15 @@ option java_package com.android.server
# IntentFirewall.java
# ---------------------------
51400 ifw_intent_matched (Intent Type|1|5),(Component Name|3),(Caller Uid|1|5),(Caller Pkg Count|1|1),(Caller Pkgs|3),(Action|3),(MIME Type|3),(URI|3),(Flags|1|5)
+
+# ---------------------------
+# IdleMaintenanceService.java
+# ---------------------------
+2753 idle_maintenance_window_start (time|2|3), (lastUserActivity|2|3), (batteryLevel|1|6), (batteryCharging|1|5)
+2754 idle_maintenance_window_finish (time|2|3), (lastUserActivity|2|3), (batteryLevel|1|6), (batteryCharging|1|5)
+
+# ---------------------------
+# MountService.java
+# ---------------------------
+2755 fstrim_start (time|2|3)
+2756 fstrim_finish (time|2|3)
diff --git a/services/java/com/android/server/IdleMaintenanceService.java b/services/java/com/android/server/IdleMaintenanceService.java
index a7442f606f37..0c90de43d8a3 100644
--- a/services/java/com/android/server/IdleMaintenanceService.java
+++ b/services/java/com/android/server/IdleMaintenanceService.java
@@ -30,9 +30,6 @@ import android.os.SystemClock;
import android.os.UserHandle;
import android.util.Log;
-import java.util.Calendar;
-import java.util.TimeZone;
-
/**
* This service observes the device state and when applicable sends
* broadcasts at the beginning and at the end of a period during which
@@ -57,9 +54,15 @@ public class IdleMaintenanceService extends BroadcastReceiver {
private static final int LAST_USER_ACTIVITY_TIME_INVALID = -1;
- private static final int MIN_IDLE_MAINTENANCE_START_BATTERY_LEVEL = 20; // percent
+ private static final long MILLIS_IN_DAY = 24 * 60 * 60 * 1000;
+
+ private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_CHARGING = 30; // percent
+
+ private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_NOT_CHARGING = 80; // percent
- private static final long MIN_IDLE_MAINTENANCE_START_USER_INACTIVITY = 60 * 60 * 1000; // 1 hour
+ private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_RUNNING = 10; // percent
+
+ private static final long MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START = 60 * 60 * 1000; // 1 hour
private final Intent mIdleMaintenanceStartIntent =
new Intent(Intent.ACTION_IDLE_MAINTENANCE_START);
@@ -73,14 +76,14 @@ public class IdleMaintenanceService extends BroadcastReceiver {
private final Handler mHandler;
- private final Calendar mTempCalendar = Calendar.getInstance();
-
- private final Calendar mLastIdleMaintenanceStartTime = Calendar.getInstance();
+ private long mLastIdleMaintenanceStartTimeMillis = SystemClock.elapsedRealtime();
private long mLastUserActivityElapsedTimeMillis = LAST_USER_ACTIVITY_TIME_INVALID;
private int mBatteryLevel;
+ private boolean mBatteryCharging;
+
private boolean mIdleMaintenanceStarted;
public IdleMaintenanceService(Context context) {
@@ -91,10 +94,6 @@ public class IdleMaintenanceService extends BroadcastReceiver {
mHandler = new Handler(mContext.getMainLooper());
- // Move one day back so we can run maintenance the first day after starting.
- final int prevDayOfYear = mLastIdleMaintenanceStartTime.get(Calendar.DAY_OF_YEAR) - 1;
- mLastIdleMaintenanceStartTime.set(Calendar.DAY_OF_YEAR, prevDayOfYear);
-
register(mContext.getMainLooper());
}
@@ -120,15 +119,21 @@ public class IdleMaintenanceService extends BroadcastReceiver {
if (mIdleMaintenanceStarted) {
// Idle maintenance can be interrupted only by
// a change of the device state.
- if (!deviceStatePermitsIdleMaintenance()) {
+ if (!deviceStatePermitsIdleMaintenanceRunning()) {
mIdleMaintenanceStarted = false;
+ EventLogTags.writeIdleMaintenanceWindowFinish(SystemClock.elapsedRealtime(),
+ mLastUserActivityElapsedTimeMillis, mBatteryLevel,
+ mBatteryCharging ? 1 : 0);
sendIdleMaintenanceEndIntent();
}
- } else if (deviceStatePermitsIdleMaintenance()
+ } else if (deviceStatePermitsIdleMaintenanceStart()
&& lastUserActivityPermitsIdleMaintenanceStart()
&& lastRunPermitsIdleMaintenanceStart()) {
mIdleMaintenanceStarted = true;
- mLastIdleMaintenanceStartTime.setTimeInMillis(System.currentTimeMillis());
+ EventLogTags.writeIdleMaintenanceWindowStart(SystemClock.elapsedRealtime(),
+ mLastUserActivityElapsedTimeMillis, mBatteryLevel,
+ mBatteryCharging ? 1 : 0);
+ mLastIdleMaintenanceStartTimeMillis = SystemClock.elapsedRealtime();
sendIdleMaintenanceStartIntent();
}
}
@@ -151,29 +156,26 @@ public class IdleMaintenanceService extends BroadcastReceiver {
null, this, mHandler, Activity.RESULT_OK, null, null);
}
- private boolean deviceStatePermitsIdleMaintenance() {
+ private boolean deviceStatePermitsIdleMaintenanceStart() {
+ final int minBatteryLevel = mBatteryCharging
+ ? MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_CHARGING
+ : MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_NOT_CHARGING;
+ return (mLastUserActivityElapsedTimeMillis != LAST_USER_ACTIVITY_TIME_INVALID
+ && mBatteryLevel > minBatteryLevel);
+ }
+
+ private boolean deviceStatePermitsIdleMaintenanceRunning() {
return (mLastUserActivityElapsedTimeMillis != LAST_USER_ACTIVITY_TIME_INVALID
- && mBatteryLevel > MIN_IDLE_MAINTENANCE_START_BATTERY_LEVEL);
+ && mBatteryLevel > MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_RUNNING);
}
private boolean lastUserActivityPermitsIdleMaintenanceStart() {
return (SystemClock.elapsedRealtime() - mLastUserActivityElapsedTimeMillis
- > MIN_IDLE_MAINTENANCE_START_USER_INACTIVITY);
+ > MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START);
}
private boolean lastRunPermitsIdleMaintenanceStart() {
- Calendar now = mTempCalendar;
- // Not setting the Locale since we do not care of locale
- // specific properties such as the first day of the week.
- now.setTimeZone(TimeZone.getDefault());
- now.setTimeInMillis(System.currentTimeMillis());
-
- Calendar lastRun = mLastIdleMaintenanceStartTime;
- // Not setting the Locale since we do not care of locale
- // specific properties such as the first day of the week.
- lastRun.setTimeZone(TimeZone.getDefault());
-
- return now.get(Calendar.DAY_OF_YEAR) != lastRun.get(Calendar.DAY_OF_YEAR);
+ return SystemClock.elapsedRealtime() - mLastIdleMaintenanceStartTimeMillis > MILLIS_IN_DAY;
}
@Override
@@ -186,6 +188,10 @@ public class IdleMaintenanceService extends BroadcastReceiver {
final int maxBatteryLevel = intent.getExtras().getInt(BatteryManager.EXTRA_SCALE);
final int currBatteryLevel = intent.getExtras().getInt(BatteryManager.EXTRA_LEVEL);
mBatteryLevel = (int) (((float) maxBatteryLevel / 100) * currBatteryLevel);
+ final int pluggedState = intent.getExtras().getInt(BatteryManager.EXTRA_PLUGGED);
+ final int chargerState = intent.getExtras().getInt(
+ BatteryManager.EXTRA_INVALID_CHARGER, 0);
+ mBatteryCharging = (pluggedState > 0 && chargerState == 0);
} else if (Intent.ACTION_SCREEN_ON.equals(action)
|| Intent.ACTION_DREAMING_STOPPED.equals(action)) {
mLastUserActivityElapsedTimeMillis = LAST_USER_ACTIVITY_TIME_INVALID;
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index e8d788201765..82f8d434e01a 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -36,6 +36,7 @@ import android.net.Uri;
import android.os.Binder;
import android.os.Environment;
import android.os.Environment.UserEnvironment;
+import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
@@ -43,6 +44,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.storage.IMountService;
@@ -173,6 +175,11 @@ class MountService extends IMountService.Stub
public static final int VolumeDiskInserted = 630;
public static final int VolumeDiskRemoved = 631;
public static final int VolumeBadRemoval = 632;
+
+ /*
+ * 700 series - fstrim
+ */
+ public static final int FstrimCompleted = 700;
}
private Context mContext;
@@ -609,6 +616,7 @@ class MountService extends IMountService.Stub
// This method runs on the handler thread,
// so it is safe to directly call into vold.
mConnector.execute("fstrim", "dotrim");
+ EventLogTags.writeFstrimStart(SystemClock.elapsedRealtime());
} catch (NativeDaemonConnectorException ndce) {
Slog.e(TAG, "Failed to run fstrim!");
}
@@ -857,6 +865,10 @@ class MountService extends IMountService.Stub
if (DEBUG_EVENTS) Slog.i(TAG, "Sending media bad removal");
updatePublicVolumeState(volume, Environment.MEDIA_BAD_REMOVAL);
action = Intent.ACTION_MEDIA_BAD_REMOVAL;
+ } else if (code == VoldResponseCode.FstrimCompleted) {
+ if (Build.IS_DEBUGGABLE) {
+ EventLogTags.writeFstrimFinish(SystemClock.elapsedRealtime());
+ }
} else {
Slog.e(TAG, String.format("Unknown code {%d}", code));
}