OSDN Git Service

Remove unnecessary disk access when loading synthetic password states
authorRubin Xu <rubinxu@google.com>
Mon, 16 Apr 2018 13:45:21 +0000 (14:45 +0100)
committerRubin Xu <rubinxu@google.com>
Mon, 16 Apr 2018 14:45:18 +0000 (14:45 +0000)
The on-demand creation of enclosing directory only needs to happen
before writing synthetic password data, not during reads.

Bug: 78027659
Test: runtest frameworks-services -p com.android.server.locksettings
Change-Id: I2a95f919d0d440caacea8880e33663cc074b1567

services/core/java/com/android/server/locksettings/LockSettingsStorage.java

index 8b3a1a6..98f1740 100644 (file)
@@ -484,6 +484,7 @@ class LockSettingsStorage {
     }
 
     public void writeSyntheticPasswordState(int userId, long handle, String name, byte[] data) {
+        ensureSyntheticPasswordDirectoryForUser(userId);
         writeFile(getSynthenticPasswordStateFilePathForUser(userId, handle, name), data);
     }
 
@@ -541,14 +542,19 @@ class LockSettingsStorage {
         return new File(Environment.getDataSystemDeDirectory(userId) ,SYNTHETIC_PASSWORD_DIRECTORY);
     }
 
-    @VisibleForTesting
-    protected String getSynthenticPasswordStateFilePathForUser(int userId, long handle,
-            String name) {
+    /** Ensure per-user directory for synthetic password state exists */
+    private void ensureSyntheticPasswordDirectoryForUser(int userId) {
         File baseDir = getSyntheticPasswordDirectoryForUser(userId);
-        String baseName = String.format("%016x.%s", handle, name);
         if (!baseDir.exists()) {
             baseDir.mkdir();
         }
+    }
+
+    @VisibleForTesting
+    protected String getSynthenticPasswordStateFilePathForUser(int userId, long handle,
+            String name) {
+        final File baseDir = getSyntheticPasswordDirectoryForUser(userId);
+        final String baseName = String.format("%016x.%s", handle, name);
         return new File(baseDir, baseName).getAbsolutePath();
     }