summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityThread.java31
-rw-r--r--core/java/com/android/internal/os/SamplingProfilerIntegration.java226
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java5
-rw-r--r--services/core/java/com/android/server/SamplingProfilerService.java122
-rw-r--r--services/java/com/android/server/SystemServer.java30
5 files changed, 0 insertions, 414 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 01e4ccebe82f..4aac830680db 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -122,7 +122,6 @@ import com.android.internal.app.IVoiceInteractor;
import com.android.internal.content.ReferrerIntent;
import com.android.internal.os.BinderInternal;
import com.android.internal.os.RuntimeInit;
-import com.android.internal.os.SamplingProfilerIntegration;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastPrintWriter;
@@ -1605,7 +1604,6 @@ public final class ActivityThread {
handlePauseActivity((IBinder) args.arg1, false,
(args.argi1 & USER_LEAVING) != 0, args.argi2,
(args.argi1 & DONT_REPORT) != 0, args.argi3);
- maybeSnapshot();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case PAUSE_ACTIVITY_FINISHING: {
@@ -1675,7 +1673,6 @@ public final class ActivityThread {
case RECEIVER:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveComp");
handleReceiver((ReceiverData)msg.obj);
- maybeSnapshot();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
case CREATE_SERVICE:
@@ -1701,7 +1698,6 @@ public final class ActivityThread {
case STOP_SERVICE:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStop");
handleStopService((IBinder)msg.obj);
- maybeSnapshot();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
case CONFIGURATION_CHANGED:
@@ -1863,32 +1859,6 @@ public final class ActivityThread {
}
if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + codeToString(msg.what));
}
-
- private void maybeSnapshot() {
- if (mBoundApplication != null && SamplingProfilerIntegration.isEnabled()) {
- // convert the *private* ActivityThread.PackageInfo to *public* known
- // android.content.pm.PackageInfo
- String packageName = mBoundApplication.info.mPackageName;
- android.content.pm.PackageInfo packageInfo = null;
- try {
- Context context = getSystemContext();
- if(context == null) {
- Log.e(TAG, "cannot get a valid context");
- return;
- }
- PackageManager pm = context.getPackageManager();
- if(pm == null) {
- Log.e(TAG, "cannot get a valid PackageManager");
- return;
- }
- packageInfo = pm.getPackageInfo(
- packageName, PackageManager.GET_ACTIVITIES);
- } catch (NameNotFoundException e) {
- Log.e(TAG, "cannot get package info for " + packageName, e);
- }
- SamplingProfilerIntegration.writeSnapshot(mBoundApplication.processName, packageInfo);
- }
- }
}
private class Idler implements MessageQueue.IdleHandler {
@@ -6504,7 +6474,6 @@ public final class ActivityThread {
public static void main(String[] args) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
- SamplingProfilerIntegration.start();
// CloseGuard defaults to true and can be quite spammy. We
// disable it here, but selectively enable it later (via
diff --git a/core/java/com/android/internal/os/SamplingProfilerIntegration.java b/core/java/com/android/internal/os/SamplingProfilerIntegration.java
deleted file mode 100644
index 6429aa420fd0..000000000000
--- a/core/java/com/android/internal/os/SamplingProfilerIntegration.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.os;
-
-import android.content.pm.PackageInfo;
-import android.os.Build;
-import android.os.SystemProperties;
-import android.util.Log;
-import dalvik.system.profiler.BinaryHprofWriter;
-import dalvik.system.profiler.SamplingProfiler;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.util.Date;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicBoolean;
-import libcore.io.IoUtils;
-
-/**
- * Integrates the framework with Dalvik's sampling profiler.
- */
-public class SamplingProfilerIntegration {
-
- private static final String TAG = "SamplingProfilerIntegration";
-
- public static final String SNAPSHOT_DIR = "/data/snapshots";
-
- private static final boolean enabled;
- private static final Executor snapshotWriter;
- private static final int samplingProfilerMilliseconds;
- private static final int samplingProfilerDepth;
-
- /** Whether or not a snapshot is being persisted. */
- private static final AtomicBoolean pending = new AtomicBoolean(false);
-
- static {
- samplingProfilerMilliseconds = SystemProperties.getInt("persist.sys.profiler_ms", 0);
- samplingProfilerDepth = SystemProperties.getInt("persist.sys.profiler_depth", 4);
- if (samplingProfilerMilliseconds > 0) {
- File dir = new File(SNAPSHOT_DIR);
- dir.mkdirs();
- // the directory needs to be writable to anybody to allow file writing
- dir.setWritable(true, false);
- // the directory needs to be executable to anybody to allow file creation
- dir.setExecutable(true, false);
- if (dir.isDirectory()) {
- snapshotWriter = Executors.newSingleThreadExecutor(new ThreadFactory() {
- public Thread newThread(Runnable r) {
- return new Thread(r, TAG);
- }
- });
- enabled = true;
- Log.i(TAG, "Profiling enabled. Sampling interval ms: "
- + samplingProfilerMilliseconds);
- } else {
- snapshotWriter = null;
- enabled = true;
- Log.w(TAG, "Profiling setup failed. Could not create " + SNAPSHOT_DIR);
- }
- } else {
- snapshotWriter = null;
- enabled = false;
- Log.i(TAG, "Profiling disabled.");
- }
- }
-
- private static SamplingProfiler samplingProfiler;
- private static long startMillis;
-
- /**
- * Is profiling enabled?
- */
- public static boolean isEnabled() {
- return enabled;
- }
-
- /**
- * Starts the profiler if profiling is enabled.
- */
- public static void start() {
- if (!enabled) {
- return;
- }
- if (samplingProfiler != null) {
- Log.e(TAG, "SamplingProfilerIntegration already started at " + new Date(startMillis));
- return;
- }
-
- ThreadGroup group = Thread.currentThread().getThreadGroup();
- SamplingProfiler.ThreadSet threadSet = SamplingProfiler.newThreadGroupThreadSet(group);
- samplingProfiler = new SamplingProfiler(samplingProfilerDepth, threadSet);
- samplingProfiler.start(samplingProfilerMilliseconds);
- startMillis = System.currentTimeMillis();
- }
-
- /**
- * Writes a snapshot if profiling is enabled.
- */
- public static void writeSnapshot(final String processName, final PackageInfo packageInfo) {
- if (!enabled) {
- return;
- }
- if (samplingProfiler == null) {
- Log.e(TAG, "SamplingProfilerIntegration is not started");
- return;
- }
-
- /*
- * If we're already writing a snapshot, don't bother enqueueing another
- * request right now. This will reduce the number of individual
- * snapshots and in turn the total amount of memory consumed (one big
- * snapshot is smaller than N subset snapshots).
- */
- if (pending.compareAndSet(false, true)) {
- snapshotWriter.execute(new Runnable() {
- public void run() {
- try {
- writeSnapshotFile(processName, packageInfo);
- } finally {
- pending.set(false);
- }
- }
- });
- }
- }
-
- /**
- * Writes the zygote's snapshot to internal storage if profiling is enabled.
- */
- public static void writeZygoteSnapshot() {
- if (!enabled) {
- return;
- }
- writeSnapshotFile("zygote", null);
- samplingProfiler.shutdown();
- samplingProfiler = null;
- startMillis = 0;
- }
-
- /**
- * pass in PackageInfo to retrieve various values for snapshot header
- */
- private static void writeSnapshotFile(String processName, PackageInfo packageInfo) {
- if (!enabled) {
- return;
- }
- samplingProfiler.stop();
-
- /*
- * We use the global start time combined with the process name
- * as a unique ID. We can't use a counter because processes
- * restart. This could result in some overlap if we capture
- * two snapshots in rapid succession.
- */
- String name = processName.replaceAll(":", ".");
- String path = SNAPSHOT_DIR + "/" + name + "-" + startMillis + ".snapshot";
- long start = System.currentTimeMillis();
- OutputStream outputStream = null;
- try {
- outputStream = new BufferedOutputStream(new FileOutputStream(path));
- PrintStream out = new PrintStream(outputStream);
- generateSnapshotHeader(name, packageInfo, out);
- if (out.checkError()) {
- throw new IOException();
- }
- BinaryHprofWriter.write(samplingProfiler.getHprofData(), outputStream);
- } catch (IOException e) {
- Log.e(TAG, "Error writing snapshot to " + path, e);
- return;
- } finally {
- IoUtils.closeQuietly(outputStream);
- }
- // set file readable to the world so that SamplingProfilerService
- // can put it to dropbox
- new File(path).setReadable(true, false);
-
- long elapsed = System.currentTimeMillis() - start;
- Log.i(TAG, "Wrote snapshot " + path + " in " + elapsed + "ms.");
- samplingProfiler.start(samplingProfilerMilliseconds);
- }
-
- /**
- * generate header for snapshots, with the following format
- * (like an HTTP header but without the \r):
- *
- * Version: <version number of profiler>\n
- * Process: <process name>\n
- * Package: <package name, if exists>\n
- * Package-Version: <version number of the package, if exists>\n
- * Build: <fingerprint>\n
- * \n
- * <the actual snapshot content begins here...>
- */
- private static void generateSnapshotHeader(String processName, PackageInfo packageInfo,
- PrintStream out) {
- // profiler version
- out.println("Version: 3");
- out.println("Process: " + processName);
- if (packageInfo != null) {
- out.println("Package: " + packageInfo.packageName);
- out.println("Package-Version: " + packageInfo.versionCode);
- }
- out.println("Build: " + Build.FINGERPRINT);
- // single blank line means the end of snapshot header.
- out.println();
- }
-}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 142effbbf0c7..fdc723e8d424 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -694,8 +694,6 @@ public class ZygoteInit {
Trace.TRACE_TAG_DALVIK);
bootTimingsTraceLog.traceBegin("ZygoteInit");
RuntimeInit.enableDdms();
- // Start profiling the zygote initialization.
- SamplingProfilerIntegration.start();
boolean startSystemServer = false;
String socketName = "zygote";
@@ -734,9 +732,6 @@ public class ZygoteInit {
Zygote.resetNicePriority();
}
- // Finish profiling the zygote initialization.
- SamplingProfilerIntegration.writeZygoteSnapshot();
-
// Do an initial gc to clean up after startup
bootTimingsTraceLog.traceBegin("PostZygoteInitGC");
gcAndFinalize();
diff --git a/services/core/java/com/android/server/SamplingProfilerService.java b/services/core/java/com/android/server/SamplingProfilerService.java
deleted file mode 100644
index 5f9269570e9d..000000000000
--- a/services/core/java/com/android/server/SamplingProfilerService.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server;
-
-import android.content.ContentResolver;
-import android.os.DropBoxManager;
-import android.os.FileObserver;
-import android.os.Binder;
-
-import android.util.Slog;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.os.SystemProperties;
-import android.provider.Settings;
-import com.android.internal.os.SamplingProfilerIntegration;
-import com.android.internal.util.DumpUtils;
-
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-public class SamplingProfilerService extends Binder {
-
- private static final String TAG = "SamplingProfilerService";
- private static final boolean LOCAL_LOGV = false;
- public static final String SNAPSHOT_DIR = SamplingProfilerIntegration.SNAPSHOT_DIR;
-
- private final Context mContext;
- private FileObserver snapshotObserver;
-
- public SamplingProfilerService(Context context) {
- mContext = context;
- registerSettingObserver(context);
- startWorking(context);
- }
-
- private void startWorking(Context context) {
- if (LOCAL_LOGV) Slog.v(TAG, "starting SamplingProfilerService!");
-
- final DropBoxManager dropbox =
- (DropBoxManager) context.getSystemService(Context.DROPBOX_SERVICE);
-
- // before FileObserver is ready, there could have already been some snapshots
- // in the directory, we don't want to miss them
- File[] snapshotFiles = new File(SNAPSHOT_DIR).listFiles();
- for (int i = 0; snapshotFiles != null && i < snapshotFiles.length; i++) {
- handleSnapshotFile(snapshotFiles[i], dropbox);
- }
-
- // detect new snapshot and put it in dropbox
- // delete it afterwards no matter what happened before
- // Note: needs listening at event ATTRIB rather than CLOSE_WRITE, because we set the
- // readability of snapshot files after writing them!
- snapshotObserver = new FileObserver(SNAPSHOT_DIR, FileObserver.ATTRIB) {
- @Override
- public void onEvent(int event, String path) {
- handleSnapshotFile(new File(SNAPSHOT_DIR, path), dropbox);
- }
- };
- snapshotObserver.startWatching();
-
- if (LOCAL_LOGV) Slog.v(TAG, "SamplingProfilerService activated");
- }
-
- private void handleSnapshotFile(File file, DropBoxManager dropbox) {
- try {
- dropbox.addFile(TAG, file, 0);
- if (LOCAL_LOGV) Slog.v(TAG, file.getPath() + " added to dropbox");
- } catch (IOException e) {
- Slog.e(TAG, "Can't add " + file.getPath() + " to dropbox", e);
- } finally {
- file.delete();
- }
- }
-
- private void registerSettingObserver(Context context) {
- ContentResolver contentResolver = context.getContentResolver();
- contentResolver.registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.SAMPLING_PROFILER_MS),
- false, new SamplingProfilerSettingsObserver(contentResolver));
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
-
- pw.println("SamplingProfilerService:");
- pw.println("Watching directory: " + SNAPSHOT_DIR);
- }
-
- private class SamplingProfilerSettingsObserver extends ContentObserver {
- private ContentResolver mContentResolver;
- public SamplingProfilerSettingsObserver(ContentResolver contentResolver) {
- super(null);
- mContentResolver = contentResolver;
- onChange(false);
- }
- @Override
- public void onChange(boolean selfChange) {
- Integer samplingProfilerMs = Settings.Global.getInt(
- mContentResolver, Settings.Global.SAMPLING_PROFILER_MS, 0);
- // setting this secure property will start or stop sampling profiler,
- // as well as adjust the the time between taking snapshots.
- SystemProperties.set("persist.sys.profiler_ms", samplingProfilerMs.toString());
- }
- }
-}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index e8920cdd9511..ec1a569b5dd9 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -55,7 +55,6 @@ import com.android.internal.app.NightDisplayController;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.BinderInternal;
-import com.android.internal.os.SamplingProfilerIntegration;
import com.android.internal.util.EmergencyAffordanceManager;
import com.android.internal.util.ConcurrentUtils;
import com.android.internal.widget.ILockSettings;
@@ -325,18 +324,6 @@ public final class SystemServer {
// the property. http://b/11463182
SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());
- // Enable the sampling profiler.
- if (SamplingProfilerIntegration.isEnabled()) {
- SamplingProfilerIntegration.start();
- mProfilerSnapshotTimer = new Timer();
- mProfilerSnapshotTimer.schedule(new TimerTask() {
- @Override
- public void run() {
- SamplingProfilerIntegration.writeSnapshot("system_server", null);
- }
- }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
- }
-
// Mmmmmm... more memory!
VMRuntime.getRuntime().clearGrowthLimit();
@@ -705,8 +692,6 @@ public final class SystemServer {
false);
boolean disableTextServices = SystemProperties.getBoolean("config.disable_textservices",
false);
- boolean disableSamplingProfiler = SystemProperties.getBoolean("config.disable_samplingprof",
- false);
boolean disableConsumerIr = SystemProperties.getBoolean("config.disable_consumerir", false);
boolean disableVrManager = SystemProperties.getBoolean("config.disable_vrmanager", false);
boolean disableCameraService = SystemProperties.getBoolean("config.disable_cameraservice",
@@ -1336,21 +1321,6 @@ public final class SystemServer {
}
traceEnd();
- if (!disableSamplingProfiler) {
- traceBeginAndSlog("StartSamplingProfilerService");
- try {
- // need to add this service even if SamplingProfilerIntegration.isEnabled()
- // is false, because it is this service that detects system property change and
- // turns on SamplingProfilerIntegration. Plus, when sampling profiler doesn't work,
- // there is little overhead for running this service.
- ServiceManager.addService("samplingprofiler",
- new SamplingProfilerService(context));
- } catch (Throwable e) {
- reportWtf("starting SamplingProfiler Service", e);
- }
- traceEnd();
- }
-
if (!disableNetwork && !disableNetworkTime) {
traceBeginAndSlog("StartNetworkTimeUpdateService");
try {