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

Commit e33d9740 authored by Dianne Hackborn's avatar Dianne Hackborn Committed by Android Git Automerger
Browse files

am 0a3a387a: am 6d61faad: am d64744cc: Merge "Help out with issue #11497149:...

am 0a3a387a: am 6d61faad: am d64744cc: Merge "Help out with issue #11497149: Clock app crashes when opened during..." into klp-dev

* commit '0a3a387a':
  Help out with issue #11497149: Clock app crashes when opened during...
parents 3a8fe6ff 0a3a387a
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ import java.util.List;


import android.os.Handler;
import android.os.Handler;
import android.os.Looper;
import android.os.Looper;
import android.os.SystemProperties;
import android.util.ArrayMap;
import android.util.ArrayMap;
import com.android.internal.app.ProcessStats;
import com.android.internal.app.ProcessStats;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.BatteryStatsImpl;
@@ -239,7 +240,12 @@ public final class ActiveServices {


    public ActiveServices(ActivityManagerService service) {
    public ActiveServices(ActivityManagerService service) {
        mAm = service;
        mAm = service;
        mMaxStartingBackground = ActivityManager.isLowRamDeviceStatic() ? 1 : 3;
        int maxBg = 0;
        try {
            maxBg = Integer.parseInt(SystemProperties.get("ro.config.max_starting_bg", "0"));
        } catch(RuntimeException e) {
        }
        mMaxStartingBackground = maxBg > 0 ? maxBg : ActivityManager.isLowRamDeviceStatic() ? 1 : 3;
    }
    }


    ServiceRecord getServiceByName(ComponentName name, int callingUser) {
    ServiceRecord getServiceByName(ComponentName name, int callingUser) {
+51 −9
Original line number Original line Diff line number Diff line
@@ -456,6 +456,23 @@ public final class ActivityManagerService extends ActivityManagerNative
     */
     */
    final ProcessMap<Long> mProcessCrashTimes = new ProcessMap<Long>();
    final ProcessMap<Long> mProcessCrashTimes = new ProcessMap<Long>();
    /**
     * Information about a process that is currently marked as bad.
     */
    static final class BadProcessInfo {
        BadProcessInfo(long time, String shortMsg, String longMsg, String stack) {
            this.time = time;
            this.shortMsg = shortMsg;
            this.longMsg = longMsg;
            this.stack = stack;
        }
        final long time;
        final String shortMsg;
        final String longMsg;
        final String stack;
    }
    /**
    /**
     * Set of applications that we consider to be bad, and will reject
     * Set of applications that we consider to be bad, and will reject
     * incoming broadcasts from (which the user has no control over).
     * incoming broadcasts from (which the user has no control over).
@@ -464,7 +481,7 @@ public final class ActivityManagerService extends ActivityManagerNative
     * later restarted (hopefully due to some user action).  The value is the
     * later restarted (hopefully due to some user action).  The value is the
     * time it was added to the list.
     * time it was added to the list.
     */
     */
    final ProcessMap<Long> mBadProcesses = new ProcessMap<Long>();
    final ProcessMap<BadProcessInfo> mBadProcesses = new ProcessMap<BadProcessInfo>();
    /**
    /**
     * All of the processes we currently have running organized by pid.
     * All of the processes we currently have running organized by pid.
@@ -9422,7 +9439,7 @@ public final class ActivityManagerService extends ActivityManagerNative
                ActivityManager.ProcessErrorStateInfo.CRASHED, null, shortMsg, longMsg, stackTrace);
                ActivityManager.ProcessErrorStateInfo.CRASHED, null, shortMsg, longMsg, stackTrace);
        startAppProblemLocked(app);
        startAppProblemLocked(app);
        app.stopFreezingAllLocked();
        app.stopFreezingAllLocked();
        return handleAppCrashLocked(app);
        return handleAppCrashLocked(app, shortMsg, longMsg, stackTrace);
    }
    }
    private void makeAppNotRespondingLocked(ProcessRecord app,
    private void makeAppNotRespondingLocked(ProcessRecord app,
@@ -9477,13 +9494,14 @@ public final class ActivityManagerService extends ActivityManagerNative
                app.waitDialog = null;
                app.waitDialog = null;
            }
            }
            if (app.pid > 0 && app.pid != MY_PID) {
            if (app.pid > 0 && app.pid != MY_PID) {
                handleAppCrashLocked(app);
                handleAppCrashLocked(app, null, null, null);
                killUnneededProcessLocked(app, "user request after error");
                killUnneededProcessLocked(app, "user request after error");
            }
            }
        }
        }
    }
    }
    private boolean handleAppCrashLocked(ProcessRecord app) {
    private boolean handleAppCrashLocked(ProcessRecord app, String shortMsg, String longMsg,
            String stackTrace) {
        if (mHeadless) {
        if (mHeadless) {
            Log.e(TAG, "handleAppCrashLocked: " + app.processName);
            Log.e(TAG, "handleAppCrashLocked: " + app.processName);
            return false;
            return false;
@@ -9513,7 +9531,8 @@ public final class ActivityManagerService extends ActivityManagerNative
                if (!app.isolated) {
                if (!app.isolated) {
                    // XXX We don't have a way to mark isolated processes
                    // XXX We don't have a way to mark isolated processes
                    // as bad, since they don't have a peristent identity.
                    // as bad, since they don't have a peristent identity.
                    mBadProcesses.put(app.info.processName, app.uid, now);
                    mBadProcesses.put(app.info.processName, app.uid,
                            new BadProcessInfo(now, shortMsg, longMsg, stackTrace));
                    mProcessCrashTimes.remove(app.info.processName, app.uid);
                    mProcessCrashTimes.remove(app.info.processName, app.uid);
                }
                }
                app.bad = true;
                app.bad = true;
@@ -10775,11 +10794,11 @@ public final class ActivityManagerService extends ActivityManagerNative
        if (mBadProcesses.getMap().size() > 0) {
        if (mBadProcesses.getMap().size() > 0) {
            boolean printed = false;
            boolean printed = false;
            final ArrayMap<String, SparseArray<Long>> pmap = mBadProcesses.getMap();
            final ArrayMap<String, SparseArray<BadProcessInfo>> pmap = mBadProcesses.getMap();
            final int NP = pmap.size();
            final int NP = pmap.size();
            for (int ip=0; ip<NP; ip++) {
            for (int ip=0; ip<NP; ip++) {
                String pname = pmap.keyAt(ip);
                String pname = pmap.keyAt(ip);
                SparseArray<Long> uids = pmap.valueAt(ip);
                SparseArray<BadProcessInfo> uids = pmap.valueAt(ip);
                final int N = uids.size();
                final int N = uids.size();
                for (int i=0; i<N; i++) {
                for (int i=0; i<N; i++) {
                    int puid = uids.keyAt(i);
                    int puid = uids.keyAt(i);
@@ -10794,10 +10813,33 @@ public final class ActivityManagerService extends ActivityManagerNative
                        pw.println("  Bad processes:");
                        pw.println("  Bad processes:");
                        printedAnything = true;
                        printedAnything = true;
                    }
                    }
                    BadProcessInfo info = uids.valueAt(i);
                    pw.print("    Bad process "); pw.print(pname);
                    pw.print("    Bad process "); pw.print(pname);
                            pw.print(" uid "); pw.print(puid);
                            pw.print(" uid "); pw.print(puid);
                            pw.print(": crashed at time ");
                            pw.print(": crashed at time "); pw.println(info.time);
                            pw.println(uids.valueAt(i));
                    if (info.shortMsg != null) {
                        pw.print("      Short msg: "); pw.println(info.shortMsg);
                    }
                    if (info.longMsg != null) {
                        pw.print("      Long msg: "); pw.println(info.longMsg);
                    }
                    if (info.stack != null) {
                        pw.println("      Stack:");
                        int lastPos = 0;
                        for (int pos=0; pos<info.stack.length(); pos++) {
                            if (info.stack.charAt(pos) == '\n') {
                                pw.print("        ");
                                pw.write(info.stack, lastPos, pos-lastPos);
                                pw.println();
                                lastPos = pos+1;
                            }
                        }
                        if (lastPos < info.stack.length()) {
                            pw.print("        ");
                            pw.write(info.stack, lastPos, info.stack.length()-lastPos);
                            pw.println();
                        }
                    }
                }
                }
            }
            }
        }
        }