Loading core/java/android/os/RecoverySystem.java +61 −1 Original line number Original line Diff line number Diff line Loading @@ -25,8 +25,10 @@ import android.text.TextUtils; import android.util.Log; import android.util.Log; import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream; import java.io.BufferedReader; import java.io.File; import java.io.File; import java.io.FileNotFoundException; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.FileWriter; import java.io.IOException; import java.io.IOException; import java.io.InputStream; import java.io.InputStream; Loading @@ -45,6 +47,8 @@ import java.util.Locale; import java.util.zip.ZipEntry; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipFile; import com.android.internal.logging.MetricsLogger; import sun.security.pkcs.PKCS7; import sun.security.pkcs.PKCS7; import sun.security.pkcs.SignerInfo; import sun.security.pkcs.SignerInfo; Loading @@ -69,6 +73,7 @@ public class RecoverySystem { /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */ /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */ private static final File RECOVERY_DIR = new File("/cache/recovery"); private static final File RECOVERY_DIR = new File("/cache/recovery"); private static final File LOG_FILE = new File(RECOVERY_DIR, "log"); private static final File LOG_FILE = new File(RECOVERY_DIR, "log"); private static final File LAST_INSTALL_FILE = new File(RECOVERY_DIR, "last_install"); private static final String LAST_PREFIX = "last_"; private static final String LAST_PREFIX = "last_"; /** /** Loading Loading @@ -682,13 +687,64 @@ public class RecoverySystem { } } } } // Read last_install; then report time for update and I/O to tron. // Only report on the reboots immediately after an OTA update. private static void parseLastInstallLog(Context context) { try (BufferedReader in = new BufferedReader(new FileReader(LAST_INSTALL_FILE))) { String line = null; int bytesWritten = -1, bytesStashed = -1; int timeTotal = -1; while ((line = in.readLine()) != null) { // Here is an example of lines in last_install: // ... // time_total: 101 // bytes_written_vendor: 51074 // bytes_stashed_vendor: 200 int numIndex = line.indexOf(':'); if (numIndex == -1 || numIndex + 1 >= line.length()) { continue; } String numString = line.substring(numIndex + 1).trim(); int parsedNum; try { parsedNum = Integer.parseInt(numString); } catch (NumberFormatException ignored) { Log.e(TAG, "Failed to parse numbers in " + line); continue; } if (line.startsWith("time")) { timeTotal = parsedNum; } else if (line.startsWith("bytes_written")) { bytesWritten = (bytesWritten == -1) ? parsedNum : bytesWritten + parsedNum; } else if (line.startsWith("bytes_stashed")) { bytesStashed = (bytesStashed == -1) ? parsedNum : bytesStashed + parsedNum; } } // Don't report data to tron if corresponding entry isn't found in last_install. if (timeTotal != -1) { MetricsLogger.histogram(context, "ota_time_total", timeTotal); } if (bytesWritten != -1) { MetricsLogger.histogram(context, "ota_bytes_written", bytesWritten); } if (bytesStashed != -1) { MetricsLogger.histogram(context, "ota_bytes_stashed", bytesStashed); } } catch (IOException ignored) { Log.e(TAG, "Failed to read lines in last_install", ignored); } } /** /** * Called after booting to process and remove recovery-related files. * Called after booting to process and remove recovery-related files. * @return the log file from recovery, or null if none was found. * @return the log file from recovery, or null if none was found. * * * @hide * @hide */ */ public static String handleAftermath() { public static String handleAftermath(Context context) { // Record the tail of the LOG_FILE // Record the tail of the LOG_FILE String log = null; String log = null; try { try { Loading @@ -699,6 +755,10 @@ public class RecoverySystem { Log.e(TAG, "Error reading recovery log", e); Log.e(TAG, "Error reading recovery log", e); } } if (log != null) { parseLastInstallLog(context); } // Only remove the OTA package if it's partially processed (uncrypt'd). // Only remove the OTA package if it's partially processed (uncrypt'd). boolean reservePackage = BLOCK_MAP_FILE.exists(); boolean reservePackage = BLOCK_MAP_FILE.exists(); if (!reservePackage && UNCRYPT_PACKAGE_FILE.exists()) { if (!reservePackage && UNCRYPT_PACKAGE_FILE.exists()) { Loading core/java/com/android/server/BootReceiver.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -127,7 +127,7 @@ public class BootReceiver extends BroadcastReceiver { .append("\n").toString(); .append("\n").toString(); final String bootReason = SystemProperties.get("ro.boot.bootreason", null); final String bootReason = SystemProperties.get("ro.boot.bootreason", null); String recovery = RecoverySystem.handleAftermath(); String recovery = RecoverySystem.handleAftermath(ctx); if (recovery != null && db != null) { if (recovery != null && db != null) { db.addText("SYSTEM_RECOVERY_LOG", headers + recovery); db.addText("SYSTEM_RECOVERY_LOG", headers + recovery); } } Loading Loading
core/java/android/os/RecoverySystem.java +61 −1 Original line number Original line Diff line number Diff line Loading @@ -25,8 +25,10 @@ import android.text.TextUtils; import android.util.Log; import android.util.Log; import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream; import java.io.BufferedReader; import java.io.File; import java.io.File; import java.io.FileNotFoundException; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.FileWriter; import java.io.IOException; import java.io.IOException; import java.io.InputStream; import java.io.InputStream; Loading @@ -45,6 +47,8 @@ import java.util.Locale; import java.util.zip.ZipEntry; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipFile; import com.android.internal.logging.MetricsLogger; import sun.security.pkcs.PKCS7; import sun.security.pkcs.PKCS7; import sun.security.pkcs.SignerInfo; import sun.security.pkcs.SignerInfo; Loading @@ -69,6 +73,7 @@ public class RecoverySystem { /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */ /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */ private static final File RECOVERY_DIR = new File("/cache/recovery"); private static final File RECOVERY_DIR = new File("/cache/recovery"); private static final File LOG_FILE = new File(RECOVERY_DIR, "log"); private static final File LOG_FILE = new File(RECOVERY_DIR, "log"); private static final File LAST_INSTALL_FILE = new File(RECOVERY_DIR, "last_install"); private static final String LAST_PREFIX = "last_"; private static final String LAST_PREFIX = "last_"; /** /** Loading Loading @@ -682,13 +687,64 @@ public class RecoverySystem { } } } } // Read last_install; then report time for update and I/O to tron. // Only report on the reboots immediately after an OTA update. private static void parseLastInstallLog(Context context) { try (BufferedReader in = new BufferedReader(new FileReader(LAST_INSTALL_FILE))) { String line = null; int bytesWritten = -1, bytesStashed = -1; int timeTotal = -1; while ((line = in.readLine()) != null) { // Here is an example of lines in last_install: // ... // time_total: 101 // bytes_written_vendor: 51074 // bytes_stashed_vendor: 200 int numIndex = line.indexOf(':'); if (numIndex == -1 || numIndex + 1 >= line.length()) { continue; } String numString = line.substring(numIndex + 1).trim(); int parsedNum; try { parsedNum = Integer.parseInt(numString); } catch (NumberFormatException ignored) { Log.e(TAG, "Failed to parse numbers in " + line); continue; } if (line.startsWith("time")) { timeTotal = parsedNum; } else if (line.startsWith("bytes_written")) { bytesWritten = (bytesWritten == -1) ? parsedNum : bytesWritten + parsedNum; } else if (line.startsWith("bytes_stashed")) { bytesStashed = (bytesStashed == -1) ? parsedNum : bytesStashed + parsedNum; } } // Don't report data to tron if corresponding entry isn't found in last_install. if (timeTotal != -1) { MetricsLogger.histogram(context, "ota_time_total", timeTotal); } if (bytesWritten != -1) { MetricsLogger.histogram(context, "ota_bytes_written", bytesWritten); } if (bytesStashed != -1) { MetricsLogger.histogram(context, "ota_bytes_stashed", bytesStashed); } } catch (IOException ignored) { Log.e(TAG, "Failed to read lines in last_install", ignored); } } /** /** * Called after booting to process and remove recovery-related files. * Called after booting to process and remove recovery-related files. * @return the log file from recovery, or null if none was found. * @return the log file from recovery, or null if none was found. * * * @hide * @hide */ */ public static String handleAftermath() { public static String handleAftermath(Context context) { // Record the tail of the LOG_FILE // Record the tail of the LOG_FILE String log = null; String log = null; try { try { Loading @@ -699,6 +755,10 @@ public class RecoverySystem { Log.e(TAG, "Error reading recovery log", e); Log.e(TAG, "Error reading recovery log", e); } } if (log != null) { parseLastInstallLog(context); } // Only remove the OTA package if it's partially processed (uncrypt'd). // Only remove the OTA package if it's partially processed (uncrypt'd). boolean reservePackage = BLOCK_MAP_FILE.exists(); boolean reservePackage = BLOCK_MAP_FILE.exists(); if (!reservePackage && UNCRYPT_PACKAGE_FILE.exists()) { if (!reservePackage && UNCRYPT_PACKAGE_FILE.exists()) { Loading
core/java/com/android/server/BootReceiver.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -127,7 +127,7 @@ public class BootReceiver extends BroadcastReceiver { .append("\n").toString(); .append("\n").toString(); final String bootReason = SystemProperties.get("ro.boot.bootreason", null); final String bootReason = SystemProperties.get("ro.boot.bootreason", null); String recovery = RecoverySystem.handleAftermath(); String recovery = RecoverySystem.handleAftermath(ctx); if (recovery != null && db != null) { if (recovery != null && db != null) { db.addText("SYSTEM_RECOVERY_LOG", headers + recovery); db.addText("SYSTEM_RECOVERY_LOG", headers + recovery); } } Loading