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 Original line Diff line number Diff line
@@ -94,6 +94,7 @@ import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.PersistableBundle;
import android.os.Process;
import android.os.Process;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.StrictMode;
import android.os.StrictMode;
@@ -739,6 +740,7 @@ public final class ActivityThread extends ClientTransactionHandler {
        public boolean runGc;
        public boolean runGc;
        String path;
        String path;
        ParcelFileDescriptor fd;
        ParcelFileDescriptor fd;
        RemoteCallback finishCallback;
    }
    }


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


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


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


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


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


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


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