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

Commit 2c6657f8 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

"am dumpheap" is now synchronous.

- Wait until the dump finishes before returning.
- Also now the filename argument is optional, with the default name of:
"/data/local/tmp/heapdump-yyyymmdd-hhmmss.prof"

Test: adb shell am dumpheap system
Test: adb shell am dumpheap system /data/local/tmp/heapdump.prof
Change-Id: I6a4c815015b731a30ffbdda5a32da541c0b790ec
Fixes: 79413767
Fixes: 62189236
parent 7013e151
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StrictMode;
@@ -739,6 +740,7 @@ public final class ActivityThread extends ClientTransactionHandler {
        public boolean runGc;
        String path;
        ParcelFileDescriptor fd;
        RemoteCallback finishCallback;
    }

    static final class UpdateCompatibilityData {
@@ -998,13 +1000,14 @@ public final class ActivityThread extends ClientTransactionHandler {

        @Override
        public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String path,
                ParcelFileDescriptor fd) {
                ParcelFileDescriptor fd, RemoteCallback finishCallback) {
            DumpHeapData dhd = new DumpHeapData();
            dhd.managed = managed;
            dhd.mallocInfo = mallocInfo;
            dhd.runGc = runGc;
            dhd.path = path;
            dhd.fd = fd;
            dhd.finishCallback = finishCallback;
            sendMessage(H.DUMP_HEAP, dhd, 0, 0, true /*async*/);
        }

@@ -5310,6 +5313,9 @@ public final class ActivityThread extends ClientTransactionHandler {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        if (dhd.finishCallback != null) {
            dhd.finishCallback.sendResult(null);
        }
    }

    final void handleDispatchPackageBroadcast(int cmd, String[] packages) {
+3 −1
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ import android.os.IBinder;
import android.os.IProgressListener;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.RemoteCallback;
import android.os.StrictMode;
import android.os.WorkSource;
import android.service.voice.IVoiceInteractionSession;
@@ -288,7 +289,8 @@ interface IActivityManager {
            int modeFlags, int userId);
    // Cause the specified process to dump the specified heap.
    boolean dumpHeap(in String process, int userId, boolean managed, boolean mallocInfo,
            boolean runGc, in String path, in ParcelFileDescriptor fd);
            boolean runGc, in String path, in ParcelFileDescriptor fd,
            in RemoteCallback finishCallback);
    int startActivities(in IApplicationThread caller, in String callingPackage,
            in Intent[] intents, in String[] resolvedTypes, in IBinder resultTo,
            in Bundle options, int userId);
+2 −1
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import android.os.IBinder;
import android.os.IInterface;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.RemoteCallback;

import com.android.internal.app.IVoiceInteractor;
import com.android.internal.content.ReferrerIntent;
@@ -95,7 +96,7 @@ oneway interface IApplicationThread {
    void dispatchPackageBroadcast(int cmd, in String[] packages);
    void scheduleCrash(in String msg);
    void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, in String path,
            in ParcelFileDescriptor fd);
            in ParcelFileDescriptor fd, in RemoteCallback finishCallback);
    void dumpActivity(in ParcelFileDescriptor fd, IBinder servicetoken, in String prefix,
            in String[] args);
    void clearDnsCache();
+2 −1
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.PersistableBundle;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
@@ -609,7 +610,7 @@ public class TransactionParcelTests {

        @Override
        public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String path,
                ParcelFileDescriptor fd) {
                ParcelFileDescriptor fd, RemoteCallback finishCallback) {
        }

        @Override
+6 −3
Original line number Diff line number Diff line
@@ -342,6 +342,7 @@ import android.os.PowerManager;
import android.os.PowerManager.ServiceType;
import android.os.PowerManagerInternal;
import android.os.Process;
import android.os.RemoteCallback;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ResultReceiver;
@@ -23978,7 +23979,8 @@ public class ActivityManagerService extends IActivityManager.Stub
                                                + myProc + " to " + heapdumpFile);
                                        thread.dumpHeap(/* managed= */ true,
                                                /* mallocInfo= */ false, /* runGc= */ false,
                                                heapdumpFile.toString(), fd);
                                                heapdumpFile.toString(), fd,
                                                /* finishCallback= */ null);
                                    } catch (RemoteException e) {
                                    }
                                }
@@ -25871,8 +25873,9 @@ public class ActivityManagerService extends IActivityManager.Stub
        return proc;
    }
    @Override
    public boolean dumpHeap(String process, int userId, boolean managed, boolean mallocInfo,
            boolean runGc, String path, ParcelFileDescriptor fd) throws RemoteException {
            boolean runGc, String path, ParcelFileDescriptor fd, RemoteCallback finishCallback) {
        try {
            synchronized (this) {
@@ -25900,7 +25903,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                    }
                }
                proc.thread.dumpHeap(managed, mallocInfo, runGc, path, fd);
                proc.thread.dumpHeap(managed, mallocInfo, runGc, path, fd, finishCallback);
                fd = null;
                return true;
            }
Loading