Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d12e150f authored by Tianjie Xu's avatar Tianjie Xu
Browse files

Remove the metrics report in recovery system

Move the report for non-A/B metrics to the native code in
recovery-persist. We will also handle the report of sideload
status for all devices there.

Bug: 114278989
Test: check the metrics report from recovery-persist.
Change-Id: I856f2f301a9d42979d0b207294cdf5d51d7e1e3f
parent 0f344083
Loading
Loading
Loading
Loading
+3 −119
Original line number Diff line number Diff line
@@ -36,16 +36,12 @@ import android.util.Log;
import android.view.Display;
import android.view.WindowManager;

import com.android.internal.logging.MetricsLogger;

import libcore.io.Streams;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
@@ -97,7 +93,7 @@ public class RecoverySystem {
    /** Used to communicate with recovery.  See bootable/recovery/recovery.cpp. */
    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 LAST_INSTALL_FILE = new File(RECOVERY_DIR, "last_install");
    private static final String LAST_INSTALL_PATH = "last_install";
    private static final String LAST_PREFIX = "last_";
    private static final String ACTION_EUICC_FACTORY_RESET =
            "com.android.internal.action.EUICC_FACTORY_RESET";
@@ -935,116 +931,6 @@ public class RecoverySystem {
        throw new IOException("Reboot failed (no permissions?)");
    }

    // Read last_install; then report time (in seconds) and I/O (in MiB) for
    // this update 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 bytesWrittenInMiB = -1, bytesStashedInMiB = -1;
            int timeTotal = -1;
            int uncryptTime = -1;
            int sourceVersion = -1;
            int temperatureStart = -1;
            int temperatureEnd = -1;
            int temperatureMax = -1;
            int errorCode = -1;
            int causeCode = -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();
                long parsedNum;
                try {
                    parsedNum = Long.parseLong(numString);
                } catch (NumberFormatException ignored) {
                    Log.e(TAG, "Failed to parse numbers in " + line);
                    continue;
                }

                final int MiB = 1024 * 1024;
                int scaled;
                try {
                    if (line.startsWith("bytes")) {
                        scaled = Math.toIntExact(parsedNum / MiB);
                    } else {
                        scaled = Math.toIntExact(parsedNum);
                    }
                } catch (ArithmeticException ignored) {
                    Log.e(TAG, "Number overflows in " + line);
                    continue;
                }

                if (line.startsWith("time")) {
                    timeTotal = scaled;
                } else if (line.startsWith("uncrypt_time")) {
                    uncryptTime = scaled;
                } else if (line.startsWith("source_build")) {
                    sourceVersion = scaled;
                } else if (line.startsWith("bytes_written")) {
                    bytesWrittenInMiB = (bytesWrittenInMiB == -1) ? scaled :
                            bytesWrittenInMiB + scaled;
                } else if (line.startsWith("bytes_stashed")) {
                    bytesStashedInMiB = (bytesStashedInMiB == -1) ? scaled :
                            bytesStashedInMiB + scaled;
                } else if (line.startsWith("temperature_start")) {
                    temperatureStart = scaled;
                } else if (line.startsWith("temperature_end")) {
                    temperatureEnd = scaled;
                } else if (line.startsWith("temperature_max")) {
                    temperatureMax = scaled;
                } else if (line.startsWith("error")) {
                    errorCode = scaled;
                } else if (line.startsWith("cause")) {
                    causeCode = scaled;
                }
            }

            // 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 (uncryptTime != -1) {
                MetricsLogger.histogram(context, "ota_uncrypt_time", uncryptTime);
            }
            if (sourceVersion != -1) {
                MetricsLogger.histogram(context, "ota_source_version", sourceVersion);
            }
            if (bytesWrittenInMiB != -1) {
                MetricsLogger.histogram(context, "ota_written_in_MiBs", bytesWrittenInMiB);
            }
            if (bytesStashedInMiB != -1) {
                MetricsLogger.histogram(context, "ota_stashed_in_MiBs", bytesStashedInMiB);
            }
            if (temperatureStart != -1) {
                MetricsLogger.histogram(context, "ota_temperature_start", temperatureStart);
            }
            if (temperatureEnd != -1) {
                MetricsLogger.histogram(context, "ota_temperature_end", temperatureEnd);
            }
            if (temperatureMax != -1) {
                MetricsLogger.histogram(context, "ota_temperature_max", temperatureMax);
            }
            if (errorCode != -1) {
                MetricsLogger.histogram(context, "ota_non_ab_error_code", errorCode);
            }
            if (causeCode != -1) {
                MetricsLogger.histogram(context, "ota_non_ab_cause_code", causeCode);
            }

        } catch (IOException e) {
            Log.e(TAG, "Failed to read lines in last_install", e);
        }
    }

    /**
     * Called after booting to process and remove recovery-related files.
     * @return the log file from recovery, or null if none was found.
@@ -1062,9 +948,6 @@ public class RecoverySystem {
            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).
        boolean reservePackage = BLOCK_MAP_FILE.exists();
@@ -1095,7 +978,8 @@ public class RecoverySystem {
        // GmsCore to avoid re-downloading everything again.
        String[] names = RECOVERY_DIR.list();
        for (int i = 0; names != null && i < names.length; i++) {
            if (names[i].startsWith(LAST_PREFIX)) continue;
            // Do not remove the last_install file since the recovery-persist takes care of it.
            if (names[i].startsWith(LAST_PREFIX) || names[i].equals(LAST_INSTALL_PATH)) continue;
            if (reservePackage && names[i].equals(BLOCK_MAP_FILE.getName())) continue;
            if (reservePackage && names[i].equals(UNCRYPT_PACKAGE_FILE.getName())) continue;