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

Commit 4444fb85 authored by Adam Lesinski's avatar Adam Lesinski
Browse files

Merge dex2oat with app being installed

Bug:22008744
Change-Id: Id87fe215760202e2969c27d686fa8ba106b00754
parent 8ac57a16
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -27,9 +27,15 @@ import android.util.SparseArray;
 */
 */
public class FakeUid extends Uid {
public class FakeUid extends Uid {


    private final int mUid;

    public FakeUid(int uid) {
        mUid = uid;
    }

    @Override
    @Override
    public int getUid() {
    public int getUid() {
        return Process.FIRST_APPLICATION_UID;
        return mUid;
    }
    }


    @Override
    @Override
+72 −3
Original line number Original line Diff line number Diff line
@@ -23,11 +23,13 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler;
import android.os.Message;
import android.os.Message;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserHandle;
import android.preference.Preference;
import android.preference.Preference;
import android.preference.PreferenceGroup;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.preference.PreferenceScreen;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.SparseArray;
import android.util.TypedValue;
import android.util.TypedValue;
import android.view.Menu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuInflater;
@@ -44,6 +46,8 @@ import com.android.settings.SettingsActivity;
import com.android.settings.applications.ManageApplications;
import com.android.settings.applications.ManageApplications;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.List;


/**
/**
@@ -178,6 +182,64 @@ public class PowerUsageSummary extends PowerUsageBase {
        mAppListGroup.addPreference(notAvailable);
        mAppListGroup.addPreference(notAvailable);
    }
    }


    /**
     * We want to coalesce some UIDs. For example, dex2oat runs under a shared gid that
     * exists for all users of the same app. We detect this case and merge the power use
     * for dex2oat to the device OWNER's use of the app.
     * @return A sorted list of app's using power.
     */
    private static List<BatterySipper> getCoalescedUsageList(final List<BatterySipper> sippers) {
        final SparseArray<BatterySipper> uidList = new SparseArray<>();

        final ArrayList<BatterySipper> results = new ArrayList<>();
        final int numSippers = sippers.size();
        for (int i = 0; i < numSippers; i++) {
            final BatterySipper sipper = sippers.get(i);
            if (sipper.getUid() > 0) {
                int realUid = sipper.getUid();
                if (sipper.getUid() >= Process.FIRST_SHARED_APPLICATION_GID &&
                        sipper.getUid() <= Process.LAST_SHARED_APPLICATION_GID) {
                    // This is a shared gid being used to do work on behalf of an app across all
                    // users. But we'll blame the power on the device OWNER.
                    realUid = UserHandle.getUid(UserHandle.USER_OWNER,
                            UserHandle.getAppIdFromSharedAppGid(sipper.getUid()));
                }

                int index = uidList.indexOfKey(realUid);
                if (index < 0) {
                    uidList.put(realUid, sipper);
                } else {
                    BatterySipper existingSipper = uidList.valueAt(index);
                    if (existingSipper.getUid() >= Process.FIRST_SHARED_APPLICATION_GID &&
                            existingSipper.getUid() <= Process.FIRST_SHARED_APPLICATION_GID) {
                        // If the app already under this uid is a dex2oat run, then combine and
                        // substitute it with the actual app.
                        sipper.add(existingSipper);
                        uidList.setValueAt(index, sipper);
                    } else {
                        existingSipper.add(sipper);
                    }
                }
            } else {
                results.add(sipper);
            }
        }

        final int numUidSippers = uidList.size();
        for (int i = 0; i < numUidSippers; i++) {
            results.add(uidList.valueAt(i));
        }

        // The sort order must have changed, so re-sort based on total power use.
        Collections.sort(results, new Comparator<BatterySipper>() {
            @Override
            public int compare(BatterySipper a, BatterySipper b) {
                return Double.compare(b.totalPowerMah, a.totalPowerMah);
            }
        });
        return results;
    }

    protected void refreshStats() {
    protected void refreshStats() {
        super.refreshStats();
        super.refreshStats();
        updatePreference(mHistPref);
        updatePreference(mHistPref);
@@ -194,8 +256,8 @@ public class PowerUsageSummary extends PowerUsageBase {
        int colorControl = getContext().getColor(value.resourceId);
        int colorControl = getContext().getColor(value.resourceId);


        if (averagePower >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP || USE_FAKE_DATA) {
        if (averagePower >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP || USE_FAKE_DATA) {
            final List<BatterySipper> usageList = USE_FAKE_DATA ? getFakeStats()
            final List<BatterySipper> usageList = getCoalescedUsageList(
                    : mStatsHelper.getUsageList();
                    USE_FAKE_DATA ? getFakeStats() : mStatsHelper.getUsageList());


            final int dischargeAmount = USE_FAKE_DATA ? 5000
            final int dischargeAmount = USE_FAKE_DATA ? 5000
                    : stats != null ? stats.getDischargeAmount(mStatsType) : 0;
                    : stats != null ? stats.getDischargeAmount(mStatsType) : 0;
@@ -282,8 +344,15 @@ public class PowerUsageSummary extends PowerUsageBase {
            stats.add(new BatterySipper(type, null, use));
            stats.add(new BatterySipper(type, null, use));
            use += 5;
            use += 5;
        }
        }
        BatterySipper sipper = new BatterySipper(DrainType.APP, new FakeUid(), use);
        stats.add(new BatterySipper(DrainType.APP,
                new FakeUid(Process.FIRST_APPLICATION_UID), use));

        // Simulate dex2oat process.
        BatterySipper sipper = new BatterySipper(DrainType.APP,
                new FakeUid(UserHandle.getSharedAppGid(Process.FIRST_APPLICATION_UID)), 10.0f);
        sipper.packageWithHighestDrain = "dex2oat";
        stats.add(sipper);
        stats.add(sipper);

        return stats;
        return stats;
    }
    }