Loading core/java/android/os/storage/IMountService.java +63 −0 Original line number Diff line number Diff line Loading @@ -856,6 +856,38 @@ public interface IMountService extends IInterface { } return _result; } @Override public long lastMaintenance() throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); long _result; try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_lastMaintenance, _data, _reply, 0); _reply.readException(); _result = _reply.readLong(); } finally { _reply.recycle(); _data.recycle(); } return _result; } @Override public void runMaintenance() throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_runMaintenance, _data, _reply, 0); _reply.readException(); } finally { _reply.recycle(); _data.recycle(); } return; } } private static final String DESCRIPTOR = "IMountService"; Loading Loading @@ -942,6 +974,10 @@ public interface IMountService extends IInterface { static final int TRANSACTION_resizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 40; static final int TRANSACTION_lastMaintenance = IBinder.FIRST_CALL_TRANSACTION + 41; static final int TRANSACTION_runMaintenance = IBinder.FIRST_CALL_TRANSACTION + 42; /** * Cast an IBinder object into an IMountService interface, generating a * proxy if needed. Loading Loading @@ -1347,6 +1383,19 @@ public interface IMountService extends IInterface { reply.writeInt(resultCode); return true; } case TRANSACTION_lastMaintenance: { data.enforceInterface(DESCRIPTOR); long lastMaintenance = lastMaintenance(); reply.writeNoException(); reply.writeLong(lastMaintenance); return true; } case TRANSACTION_runMaintenance: { data.enforceInterface(DESCRIPTOR); runMaintenance(); reply.writeNoException(); return true; } } return super.onTransact(code, data, reply, flags); } Loading Loading @@ -1617,4 +1666,18 @@ public interface IMountService extends IInterface { public String getField(String field) throws RemoteException; public int resizeSecureContainer(String id, int sizeMb, String key) throws RemoteException; /** * Report the time of the last maintenance operation such as fstrim. * @return Timestamp of the last maintenance operation, in the * System.currentTimeMillis() time base * @throws RemoteException */ public long lastMaintenance() throws RemoteException; /** * Kick off an immediate maintenance operation * @throws RemoteException */ public void runMaintenance() throws RemoteException; } core/java/android/provider/Settings.java +7 −0 Original line number Diff line number Diff line Loading @@ -5543,6 +5543,13 @@ public final class Settings { */ public static final String PACKAGE_VERIFIER_INCLUDE_ADB = "verifier_verify_adb_installs"; /** * Time since last fstrim (milliseconds) after which we force one to happen * during device startup. If unset, the default is 3 days. * @hide */ public static final String FSTRIM_MANDATORY_INTERVAL = "fstrim_mandatory_interval"; /** * The interval in milliseconds at which to check packet counts on the * mobile data interface when screen is on, to detect possible data Loading core/res/res/values/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -3508,6 +3508,9 @@ <!-- [CHAR LIMIT=40] Title of dialog that is shown when performing a system upgrade. --> <string name="android_upgrading_title">Android is upgrading\u2026</string> <!-- [CHAR LIMIT=NONE] Message shown in upgrading dialog when doing an fstrim. --> <string name="android_upgrading_fstrim">Optimizing storage.</string> <!-- [CHAR LIMIT=NONE] Message shown in upgrading dialog for each .apk that is optimized. --> <string name="android_upgrading_apk">Optimizing app <xliff:g id="number" example="123">%1$d</xliff:g> of Loading core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -1644,6 +1644,7 @@ <java-symbol type="string" name="aerr_application" /> <java-symbol type="string" name="aerr_process" /> <java-symbol type="string" name="aerr_title" /> <java-symbol type="string" name="android_upgrading_fstrim" /> <java-symbol type="string" name="android_upgrading_apk" /> <java-symbol type="string" name="android_upgrading_complete" /> <java-symbol type="string" name="android_upgrading_starting_apps" /> Loading services/core/java/com/android/server/MountService.java +52 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.math.BigInteger; Loading @@ -90,7 +91,9 @@ import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; Loading Loading @@ -359,6 +362,11 @@ class MountService extends IMountService.Stub // Used in the ObbActionHandler private IMediaContainerService mContainerService = null; // Last fstrim operation tracking private static final String LAST_FSTRIM_FILE = "last-fstrim"; private final File mLastMaintenanceFile; private long mLastMaintenance; // Handler messages private static final int H_UNMOUNT_PM_UPDATE = 1; private static final int H_UNMOUNT_PM_DONE = 2; Loading Loading @@ -536,6 +544,15 @@ class MountService extends IMountService.Stub case H_FSTRIM: { waitForReady(); Slog.i(TAG, "Running fstrim idle maintenance"); // Remember when we kicked it off try { mLastMaintenance = System.currentTimeMillis(); mLastMaintenanceFile.setLastModified(mLastMaintenance); } catch (Exception e) { Slog.e(TAG, "Unable to record last fstrim!"); } try { // This method must be run on the main (handler) thread, // so it is safe to directly call into vold. Loading @@ -544,6 +561,7 @@ class MountService extends IMountService.Stub } catch (NativeDaemonConnectorException ndce) { Slog.e(TAG, "Failed to run fstrim!"); } // invoke the completion callback, if any Runnable callback = (Runnable) msg.obj; if (callback != null) { Loading Loading @@ -699,6 +717,18 @@ class MountService extends IMountService.Stub mHandler.sendMessage(mHandler.obtainMessage(H_FSTRIM, callback)); } // Binder entry point for kicking off an immediate fstrim @Override public void runMaintenance() { validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS); runIdleMaintenance(null); } @Override public long lastMaintenance() { return mLastMaintenance; } private void doShareUnshareVolume(String path, String method, boolean enable) { // TODO: Add support for multiple share methods if (!method.equals("ums")) { Loading Loading @@ -1477,6 +1507,22 @@ class MountService extends IMountService.Stub // Add OBB Action Handler to MountService thread. mObbActionHandler = new ObbActionHandler(IoThread.get().getLooper()); // Initialize the last-fstrim tracking if necessary File dataDir = Environment.getDataDirectory(); File systemDir = new File(dataDir, "system"); mLastMaintenanceFile = new File(systemDir, LAST_FSTRIM_FILE); if (!mLastMaintenanceFile.exists()) { // Not setting mLastMaintenance here means that we will force an // fstrim during reboot following the OTA that installs this code. try { (new FileOutputStream(mLastMaintenanceFile)).close(); } catch (IOException e) { Slog.e(TAG, "Unable to create fstrim record " + mLastMaintenanceFile.getPath()); } } else { mLastMaintenance = mLastMaintenanceFile.lastModified(); } /* * Create the connection to vold with a maximum queue of twice the * amount of containers we'd ever expect to have. This keeps an Loading Loading @@ -3075,6 +3121,12 @@ class MountService extends IMountService.Stub pw.increaseIndent(); mConnector.dump(fd, pw, args); pw.decreaseIndent(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); pw.println(); pw.print("Last maintenance: "); pw.println(sdf.format(new Date(mLastMaintenance))); } /** {@inheritDoc} */ Loading Loading
core/java/android/os/storage/IMountService.java +63 −0 Original line number Diff line number Diff line Loading @@ -856,6 +856,38 @@ public interface IMountService extends IInterface { } return _result; } @Override public long lastMaintenance() throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); long _result; try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_lastMaintenance, _data, _reply, 0); _reply.readException(); _result = _reply.readLong(); } finally { _reply.recycle(); _data.recycle(); } return _result; } @Override public void runMaintenance() throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_runMaintenance, _data, _reply, 0); _reply.readException(); } finally { _reply.recycle(); _data.recycle(); } return; } } private static final String DESCRIPTOR = "IMountService"; Loading Loading @@ -942,6 +974,10 @@ public interface IMountService extends IInterface { static final int TRANSACTION_resizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 40; static final int TRANSACTION_lastMaintenance = IBinder.FIRST_CALL_TRANSACTION + 41; static final int TRANSACTION_runMaintenance = IBinder.FIRST_CALL_TRANSACTION + 42; /** * Cast an IBinder object into an IMountService interface, generating a * proxy if needed. Loading Loading @@ -1347,6 +1383,19 @@ public interface IMountService extends IInterface { reply.writeInt(resultCode); return true; } case TRANSACTION_lastMaintenance: { data.enforceInterface(DESCRIPTOR); long lastMaintenance = lastMaintenance(); reply.writeNoException(); reply.writeLong(lastMaintenance); return true; } case TRANSACTION_runMaintenance: { data.enforceInterface(DESCRIPTOR); runMaintenance(); reply.writeNoException(); return true; } } return super.onTransact(code, data, reply, flags); } Loading Loading @@ -1617,4 +1666,18 @@ public interface IMountService extends IInterface { public String getField(String field) throws RemoteException; public int resizeSecureContainer(String id, int sizeMb, String key) throws RemoteException; /** * Report the time of the last maintenance operation such as fstrim. * @return Timestamp of the last maintenance operation, in the * System.currentTimeMillis() time base * @throws RemoteException */ public long lastMaintenance() throws RemoteException; /** * Kick off an immediate maintenance operation * @throws RemoteException */ public void runMaintenance() throws RemoteException; }
core/java/android/provider/Settings.java +7 −0 Original line number Diff line number Diff line Loading @@ -5543,6 +5543,13 @@ public final class Settings { */ public static final String PACKAGE_VERIFIER_INCLUDE_ADB = "verifier_verify_adb_installs"; /** * Time since last fstrim (milliseconds) after which we force one to happen * during device startup. If unset, the default is 3 days. * @hide */ public static final String FSTRIM_MANDATORY_INTERVAL = "fstrim_mandatory_interval"; /** * The interval in milliseconds at which to check packet counts on the * mobile data interface when screen is on, to detect possible data Loading
core/res/res/values/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -3508,6 +3508,9 @@ <!-- [CHAR LIMIT=40] Title of dialog that is shown when performing a system upgrade. --> <string name="android_upgrading_title">Android is upgrading\u2026</string> <!-- [CHAR LIMIT=NONE] Message shown in upgrading dialog when doing an fstrim. --> <string name="android_upgrading_fstrim">Optimizing storage.</string> <!-- [CHAR LIMIT=NONE] Message shown in upgrading dialog for each .apk that is optimized. --> <string name="android_upgrading_apk">Optimizing app <xliff:g id="number" example="123">%1$d</xliff:g> of Loading
core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -1644,6 +1644,7 @@ <java-symbol type="string" name="aerr_application" /> <java-symbol type="string" name="aerr_process" /> <java-symbol type="string" name="aerr_title" /> <java-symbol type="string" name="android_upgrading_fstrim" /> <java-symbol type="string" name="android_upgrading_apk" /> <java-symbol type="string" name="android_upgrading_complete" /> <java-symbol type="string" name="android_upgrading_starting_apps" /> Loading
services/core/java/com/android/server/MountService.java +52 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.math.BigInteger; Loading @@ -90,7 +91,9 @@ import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; Loading Loading @@ -359,6 +362,11 @@ class MountService extends IMountService.Stub // Used in the ObbActionHandler private IMediaContainerService mContainerService = null; // Last fstrim operation tracking private static final String LAST_FSTRIM_FILE = "last-fstrim"; private final File mLastMaintenanceFile; private long mLastMaintenance; // Handler messages private static final int H_UNMOUNT_PM_UPDATE = 1; private static final int H_UNMOUNT_PM_DONE = 2; Loading Loading @@ -536,6 +544,15 @@ class MountService extends IMountService.Stub case H_FSTRIM: { waitForReady(); Slog.i(TAG, "Running fstrim idle maintenance"); // Remember when we kicked it off try { mLastMaintenance = System.currentTimeMillis(); mLastMaintenanceFile.setLastModified(mLastMaintenance); } catch (Exception e) { Slog.e(TAG, "Unable to record last fstrim!"); } try { // This method must be run on the main (handler) thread, // so it is safe to directly call into vold. Loading @@ -544,6 +561,7 @@ class MountService extends IMountService.Stub } catch (NativeDaemonConnectorException ndce) { Slog.e(TAG, "Failed to run fstrim!"); } // invoke the completion callback, if any Runnable callback = (Runnable) msg.obj; if (callback != null) { Loading Loading @@ -699,6 +717,18 @@ class MountService extends IMountService.Stub mHandler.sendMessage(mHandler.obtainMessage(H_FSTRIM, callback)); } // Binder entry point for kicking off an immediate fstrim @Override public void runMaintenance() { validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS); runIdleMaintenance(null); } @Override public long lastMaintenance() { return mLastMaintenance; } private void doShareUnshareVolume(String path, String method, boolean enable) { // TODO: Add support for multiple share methods if (!method.equals("ums")) { Loading Loading @@ -1477,6 +1507,22 @@ class MountService extends IMountService.Stub // Add OBB Action Handler to MountService thread. mObbActionHandler = new ObbActionHandler(IoThread.get().getLooper()); // Initialize the last-fstrim tracking if necessary File dataDir = Environment.getDataDirectory(); File systemDir = new File(dataDir, "system"); mLastMaintenanceFile = new File(systemDir, LAST_FSTRIM_FILE); if (!mLastMaintenanceFile.exists()) { // Not setting mLastMaintenance here means that we will force an // fstrim during reboot following the OTA that installs this code. try { (new FileOutputStream(mLastMaintenanceFile)).close(); } catch (IOException e) { Slog.e(TAG, "Unable to create fstrim record " + mLastMaintenanceFile.getPath()); } } else { mLastMaintenance = mLastMaintenanceFile.lastModified(); } /* * Create the connection to vold with a maximum queue of twice the * amount of containers we'd ever expect to have. This keeps an Loading Loading @@ -3075,6 +3121,12 @@ class MountService extends IMountService.Stub pw.increaseIndent(); mConnector.dump(fd, pw, args); pw.decreaseIndent(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); pw.println(); pw.print("Last maintenance: "); pw.println(sdf.format(new Date(mLastMaintenance))); } /** {@inheritDoc} */ Loading