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

Commit febb0200 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "OtaDexoptService: Add tron logging" into nyc-mr1-dev

parents 82f050f7 77cc8172
Loading
Loading
Loading
Loading
+79 −2
Original line number Original line Diff line number Diff line
@@ -31,7 +31,7 @@ import android.os.ServiceManager;
import android.os.storage.StorageManager;
import android.os.storage.StorageManager;
import android.util.Log;
import android.util.Log;
import android.util.Slog;
import android.util.Slog;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.os.InstallerConnection;
import com.android.internal.os.InstallerConnection;
import com.android.internal.os.InstallerConnection.InstallerException;
import com.android.internal.os.InstallerConnection.InstallerException;


@@ -40,6 +40,7 @@ import java.io.FileDescriptor;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collection;
import java.util.List;
import java.util.List;
import java.util.concurrent.TimeUnit;


/**
/**
 * A service for A/B OTA dexopting.
 * A service for A/B OTA dexopting.
@@ -69,6 +70,25 @@ public class OtaDexoptService extends IOtaDexopt.Stub {


    private int completeSize;
    private int completeSize;


    // MetricsLogger properties.

    // Space before and after.
    private long availableSpaceBefore;
    private long availableSpaceAfterBulkDelete;
    private long availableSpaceAfterDexopt;

    // Packages.
    private int importantPackageCount;
    private int otherPackageCount;

    // Number of dexopt commands. This may be different from the count of packages.
    private int dexoptCommandCountTotal;
    private int dexoptCommandCountExecuted;

    // For spent time.
    private long otaDexoptTimeStart;


    public OtaDexoptService(Context context, PackageManagerService packageManagerService) {
    public OtaDexoptService(Context context, PackageManagerService packageManagerService) {
        this.mContext = context;
        this.mContext = context;
        this.mPackageManagerService = packageManagerService;
        this.mPackageManagerService = packageManagerService;
@@ -133,13 +153,17 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
        }
        }
        completeSize = mDexoptCommands.size();
        completeSize = mDexoptCommands.size();


        if (getAvailableSpace() < BULK_DELETE_THRESHOLD) {
        long spaceAvailable = getAvailableSpace();
        if (spaceAvailable < BULK_DELETE_THRESHOLD) {
            Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: "
            Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: "
                    + PackageManagerServiceUtils.packagesToString(others));
                    + PackageManagerServiceUtils.packagesToString(others));
            for (PackageParser.Package pkg : others) {
            for (PackageParser.Package pkg : others) {
                deleteOatArtifactsOfPackage(pkg);
                deleteOatArtifactsOfPackage(pkg);
            }
            }
        }
        }
        long spaceAvailableNow = getAvailableSpace();

        prepareMetricsLogging(important.size(), others.size(), spaceAvailable, spaceAvailableNow);
    }
    }


    @Override
    @Override
@@ -148,6 +172,8 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
            Log.i(TAG, "Cleaning up OTA Dexopt state.");
            Log.i(TAG, "Cleaning up OTA Dexopt state.");
        }
        }
        mDexoptCommands = null;
        mDexoptCommands = null;

        performMetricsLogging();
    }
    }


    @Override
    @Override
@@ -182,6 +208,8 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
        String next = mDexoptCommands.remove(0);
        String next = mDexoptCommands.remove(0);


        if (getAvailableSpace() > 0) {
        if (getAvailableSpace() > 0) {
            dexoptCommandCountExecuted++;

            return next;
            return next;
        } else {
        } else {
            if (DEBUG_DEXOPT) {
            if (DEBUG_DEXOPT) {
@@ -320,6 +348,55 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
        }
        }
    }
    }


    /**
     * Initialize logging fields.
     */
    private void prepareMetricsLogging(int important, int others, long spaceBegin, long spaceBulk) {
        availableSpaceBefore = spaceBegin;
        availableSpaceAfterBulkDelete = spaceBulk;
        availableSpaceAfterDexopt = 0;

        importantPackageCount = important;
        otherPackageCount = others;

        dexoptCommandCountTotal = mDexoptCommands.size();
        dexoptCommandCountExecuted = 0;

        otaDexoptTimeStart = System.nanoTime();
    }

    private static int inMegabytes(long value) {
        long in_mega_bytes = value / (1024 * 1024);
        if (in_mega_bytes > Integer.MAX_VALUE) {
            Log.w(TAG, "Recording " + in_mega_bytes + "MB of free space, overflowing range");
            return Integer.MAX_VALUE;
        }
        return (int)in_mega_bytes;
    }

    private void performMetricsLogging() {
        long finalTime = System.nanoTime();

        MetricsLogger.histogram(mContext, "ota_dexopt_available_space_before_mb",
                inMegabytes(availableSpaceBefore));
        MetricsLogger.histogram(mContext, "ota_dexopt_available_space_after_bulk_delete_mb",
                inMegabytes(availableSpaceAfterBulkDelete));
        MetricsLogger.histogram(mContext, "ota_dexopt_available_space_after_dexopt_mb",
                inMegabytes(availableSpaceAfterDexopt));

        MetricsLogger.histogram(mContext, "ota_dexopt_num_important_packages",
                importantPackageCount);
        MetricsLogger.histogram(mContext, "ota_dexopt_num_other_packages", otherPackageCount);

        MetricsLogger.histogram(mContext, "ota_dexopt_num_commands", dexoptCommandCountTotal);
        MetricsLogger.histogram(mContext, "ota_dexopt_num_commands_executed",
                dexoptCommandCountExecuted);

        final int elapsedTimeSeconds =
                (int) TimeUnit.NANOSECONDS.toSeconds(finalTime - otaDexoptTimeStart);
        MetricsLogger.histogram(mContext, "ota_dexopt_time_s", elapsedTimeSeconds);
    }

    private static class OTADexoptPackageDexOptimizer extends
    private static class OTADexoptPackageDexOptimizer extends
            PackageDexOptimizer.ForcedUpdatePackageDexOptimizer {
            PackageDexOptimizer.ForcedUpdatePackageDexOptimizer {