Search in sources :

Example 41 with DropBoxManager

use of android.os.DropBoxManager in project platform_frameworks_base by android.

the class BootReceiver method logBootEvents.

private void logBootEvents(Context ctx) throws IOException {
    final DropBoxManager db = (DropBoxManager) ctx.getSystemService(Context.DROPBOX_SERVICE);
    final String headers = getBootHeadersToLogAndUpdate();
    final String bootReason = SystemProperties.get("ro.boot.bootreason", null);
    String recovery = RecoverySystem.handleAftermath(ctx);
    if (recovery != null && db != null) {
        db.addText("SYSTEM_RECOVERY_LOG", headers + recovery);
    }
    String lastKmsgFooter = "";
    if (bootReason != null) {
        lastKmsgFooter = new StringBuilder(512).append("\n").append("Boot info:\n").append("Last boot reason: ").append(bootReason).append("\n").toString();
    }
    HashMap<String, Long> timestamps = readTimestamps();
    if (SystemProperties.getLong("ro.runtime.firstboot", 0) == 0) {
        if (StorageManager.inCryptKeeperBounce()) {
        // Encrypted, first boot to get PIN/pattern/password so data is tmpfs
        // Don't set ro.runtime.firstboot so that we will do this again
        // when data is properly mounted
        } else {
            String now = Long.toString(System.currentTimeMillis());
            SystemProperties.set("ro.runtime.firstboot", now);
        }
        if (db != null)
            db.addText("SYSTEM_BOOT", headers);
        // Negative sizes mean to take the *tail* of the file (see FileUtils.readTextFile())
        addFileWithFootersToDropBox(db, timestamps, headers, lastKmsgFooter, "/proc/last_kmsg", -LOG_SIZE, "SYSTEM_LAST_KMSG");
        addFileWithFootersToDropBox(db, timestamps, headers, lastKmsgFooter, "/sys/fs/pstore/console-ramoops", -LOG_SIZE, "SYSTEM_LAST_KMSG");
        addFileToDropBox(db, timestamps, headers, "/cache/recovery/log", -LOG_SIZE, "SYSTEM_RECOVERY_LOG");
        addFileToDropBox(db, timestamps, headers, "/cache/recovery/last_kmsg", -LOG_SIZE, "SYSTEM_RECOVERY_KMSG");
        addAuditErrorsToDropBox(db, timestamps, headers, -LOG_SIZE, "SYSTEM_AUDIT");
        addFsckErrorsToDropBox(db, timestamps, headers, -LOG_SIZE, "SYSTEM_FSCK");
    } else {
        if (db != null)
            db.addText("SYSTEM_RESTART", headers);
    }
    // Scan existing tombstones (in case any new ones appeared)
    File[] tombstoneFiles = TOMBSTONE_DIR.listFiles();
    for (int i = 0; tombstoneFiles != null && i < tombstoneFiles.length; i++) {
        if (tombstoneFiles[i].isFile()) {
            addFileToDropBox(db, timestamps, headers, tombstoneFiles[i].getPath(), LOG_SIZE, "SYSTEM_TOMBSTONE");
        }
    }
    writeTimestamps(timestamps);
    // Start watching for new tombstone files; will record them as they occur.
    // This gets registered with the singleton file observer thread.
    sTombstoneObserver = new FileObserver(TOMBSTONE_DIR.getPath(), FileObserver.CLOSE_WRITE) {

        @Override
        public void onEvent(int event, String path) {
            HashMap<String, Long> timestamps = readTimestamps();
            try {
                File file = new File(TOMBSTONE_DIR, path);
                if (file.isFile()) {
                    addFileToDropBox(db, timestamps, headers, file.getPath(), LOG_SIZE, "SYSTEM_TOMBSTONE");
                }
            } catch (IOException e) {
                Slog.e(TAG, "Can't log tombstone", e);
            }
            writeTimestamps(timestamps);
        }
    };
    sTombstoneObserver.startWatching();
}
Also used : DropBoxManager(android.os.DropBoxManager) HashMap(java.util.HashMap) IOException(java.io.IOException) AtomicFile(android.util.AtomicFile) File(java.io.File) FileObserver(android.os.FileObserver)

Example 42 with DropBoxManager

use of android.os.DropBoxManager in project android_frameworks_base by ParanoidAndroid.

the class SamplingProfilerService method startWorking.

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");
}
Also used : DropBoxManager(android.os.DropBoxManager) File(java.io.File) FileObserver(android.os.FileObserver)

Example 43 with DropBoxManager

use of android.os.DropBoxManager in project android_frameworks_base by ParanoidAndroid.

the class ActivityManagerService method addErrorToDropBox.

/**
     * Write a description of an error (crash, WTF, ANR) to the drop box.
     * @param eventType to include in the drop box tag ("crash", "wtf", etc.)
     * @param process which caused the error, null means the system server
     * @param activity which triggered the error, null if unknown
     * @param parent activity related to the error, null if unknown
     * @param subject line related to the error, null if absent
     * @param report in long form describing the error, null if absent
     * @param logFile to include in the report, null if none
     * @param crashInfo giving an application stack trace, null if absent
     */
public void addErrorToDropBox(String eventType, ProcessRecord process, String processName, ActivityRecord activity, ActivityRecord parent, String subject, final String report, final File logFile, final ApplicationErrorReport.CrashInfo crashInfo) {
    // NOTE -- this must never acquire the ActivityManagerService lock,
    // otherwise the watchdog may be prevented from resetting the system.
    final String dropboxTag = processClass(process) + "_" + eventType;
    final DropBoxManager dbox = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE);
    // Exit early if the dropbox isn't configured to accept this report type.
    if (dbox == null || !dbox.isTagEnabled(dropboxTag))
        return;
    final StringBuilder sb = new StringBuilder(1024);
    appendDropBoxProcessHeaders(process, processName, sb);
    if (activity != null) {
        sb.append("Activity: ").append(activity.shortComponentName).append("\n");
    }
    if (parent != null && parent.app != null && parent.app.pid != process.pid) {
        sb.append("Parent-Process: ").append(parent.app.processName).append("\n");
    }
    if (parent != null && parent != activity) {
        sb.append("Parent-Activity: ").append(parent.shortComponentName).append("\n");
    }
    if (subject != null) {
        sb.append("Subject: ").append(subject).append("\n");
    }
    sb.append("Build: ").append(Build.FINGERPRINT).append("\n");
    if (Debug.isDebuggerConnected()) {
        sb.append("Debugger: Connected\n");
    }
    sb.append("\n");
    // Do the rest in a worker thread to avoid blocking the caller on I/O
    // (After this point, we shouldn't access AMS internal data structures.)
    Thread worker = new Thread("Error dump: " + dropboxTag) {

        @Override
        public void run() {
            if (report != null) {
                sb.append(report);
            }
            if (logFile != null) {
                try {
                    sb.append(FileUtils.readTextFile(logFile, 128 * 1024, "\n\n[[TRUNCATED]]"));
                } catch (IOException e) {
                    Slog.e(TAG, "Error reading " + logFile, e);
                }
            }
            if (crashInfo != null && crashInfo.stackTrace != null) {
                sb.append(crashInfo.stackTrace);
            }
            String setting = Settings.Global.ERROR_LOGCAT_PREFIX + dropboxTag;
            int lines = Settings.Global.getInt(mContext.getContentResolver(), setting, 0);
            if (lines > 0) {
                sb.append("\n");
                // Merge several logcat streams, and take the last N lines
                InputStreamReader input = null;
                try {
                    java.lang.Process logcat = new ProcessBuilder("/system/bin/logcat", "-v", "time", "-b", "events", "-b", "system", "-b", "main", "-t", String.valueOf(lines)).redirectErrorStream(true).start();
                    try {
                        logcat.getOutputStream().close();
                    } catch (IOException e) {
                    }
                    try {
                        logcat.getErrorStream().close();
                    } catch (IOException e) {
                    }
                    input = new InputStreamReader(logcat.getInputStream());
                    int num;
                    char[] buf = new char[8192];
                    while ((num = input.read(buf)) > 0) sb.append(buf, 0, num);
                } catch (IOException e) {
                    Slog.e(TAG, "Error running logcat", e);
                } finally {
                    if (input != null)
                        try {
                            input.close();
                        } catch (IOException e) {
                        }
                }
            }
            dbox.addText(dropboxTag, sb.toString());
        }
    };
    if (process == null) {
        // If process is null, we are being called from some internal code
        // and may be about to die -- run this synchronously.
        worker.run();
    } else {
        worker.start();
    }
}
Also used : DropBoxManager(android.os.DropBoxManager) InputStreamReader(java.io.InputStreamReader) IOException(java.io.IOException) IApplicationThread(android.app.IApplicationThread) ActivityThread(android.app.ActivityThread)

Example 44 with DropBoxManager

use of android.os.DropBoxManager in project android_frameworks_base by ParanoidAndroid.

the class ActivityManagerService method logStrictModeViolationToDropBox.

// Depending on the policy in effect, there could be a bunch of
// these in quick succession so we try to batch these together to
// minimize disk writes, number of dropbox entries, and maximize
// compression, by having more fewer, larger records.
private void logStrictModeViolationToDropBox(ProcessRecord process, StrictMode.ViolationInfo info) {
    if (info == null) {
        return;
    }
    final boolean isSystemApp = process == null || (process.info.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0;
    final String processName = process == null ? "unknown" : process.processName;
    final String dropboxTag = isSystemApp ? "system_app_strictmode" : "data_app_strictmode";
    final DropBoxManager dbox = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE);
    // Exit early if the dropbox isn't configured to accept this report type.
    if (dbox == null || !dbox.isTagEnabled(dropboxTag))
        return;
    boolean bufferWasEmpty;
    boolean needsFlush;
    final StringBuilder sb = isSystemApp ? mStrictModeBuffer : new StringBuilder(1024);
    synchronized (sb) {
        bufferWasEmpty = sb.length() == 0;
        appendDropBoxProcessHeaders(process, processName, sb);
        sb.append("Build: ").append(Build.FINGERPRINT).append("\n");
        sb.append("System-App: ").append(isSystemApp).append("\n");
        sb.append("Uptime-Millis: ").append(info.violationUptimeMillis).append("\n");
        if (info.violationNumThisLoop != 0) {
            sb.append("Loop-Violation-Number: ").append(info.violationNumThisLoop).append("\n");
        }
        if (info.numAnimationsRunning != 0) {
            sb.append("Animations-Running: ").append(info.numAnimationsRunning).append("\n");
        }
        if (info.broadcastIntentAction != null) {
            sb.append("Broadcast-Intent-Action: ").append(info.broadcastIntentAction).append("\n");
        }
        if (info.durationMillis != -1) {
            sb.append("Duration-Millis: ").append(info.durationMillis).append("\n");
        }
        if (info.numInstances != -1) {
            sb.append("Instance-Count: ").append(info.numInstances).append("\n");
        }
        if (info.tags != null) {
            for (String tag : info.tags) {
                sb.append("Span-Tag: ").append(tag).append("\n");
            }
        }
        sb.append("\n");
        if (info.crashInfo != null && info.crashInfo.stackTrace != null) {
            sb.append(info.crashInfo.stackTrace);
        }
        sb.append("\n");
        // Only buffer up to ~64k.  Various logging bits truncate
        // things at 128k.
        needsFlush = (sb.length() > 64 * 1024);
    }
    // thousands of separate files could be created on boot.
    if (!isSystemApp || needsFlush) {
        new Thread("Error dump: " + dropboxTag) {

            @Override
            public void run() {
                String report;
                synchronized (sb) {
                    report = sb.toString();
                    sb.delete(0, sb.length());
                    sb.trimToSize();
                }
                if (report.length() != 0) {
                    dbox.addText(dropboxTag, report);
                }
            }
        }.start();
        return;
    }
    // System app batching:
    if (!bufferWasEmpty) {
        // catch the buffer appends we just did.
        return;
    }
    // Worker thread to both batch writes and to avoid blocking the caller on I/O.
    // (After this point, we shouldn't access AMS internal data structures.)
    new Thread("Error dump: " + dropboxTag) {

        @Override
        public void run() {
            // 5 second sleep to let stacks arrive and be batched together
            try {
                // 5 seconds
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }
            String errorReport;
            synchronized (mStrictModeBuffer) {
                errorReport = mStrictModeBuffer.toString();
                if (errorReport.length() == 0) {
                    return;
                }
                mStrictModeBuffer.delete(0, mStrictModeBuffer.length());
                mStrictModeBuffer.trimToSize();
            }
            dbox.addText(dropboxTag, errorReport);
        }
    }.start();
}
Also used : DropBoxManager(android.os.DropBoxManager) IApplicationThread(android.app.IApplicationThread) ActivityThread(android.app.ActivityThread)

Example 45 with DropBoxManager

use of android.os.DropBoxManager in project android_frameworks_base by ParanoidAndroid.

the class DropBoxTest method testGetNextEntry.

public void testGetNextEntry() throws Exception {
    File dir = getEmptyDir("testGetNextEntry");
    DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
    DropBoxManager dropbox = new DropBoxManager(service);
    long before = System.currentTimeMillis();
    dropbox.addText("DropBoxTest.A", "A0");
    dropbox.addText("DropBoxTest.B", "B0");
    dropbox.addText("DropBoxTest.A", "A1");
    DropBoxManager.Entry a0 = dropbox.getNextEntry("DropBoxTest.A", before);
    DropBoxManager.Entry a1 = dropbox.getNextEntry("DropBoxTest.A", a0.getTimeMillis());
    assertTrue(null == dropbox.getNextEntry("DropBoxTest.A", a1.getTimeMillis()));
    DropBoxManager.Entry b0 = dropbox.getNextEntry("DropBoxTest.B", before);
    assertTrue(null == dropbox.getNextEntry("DropBoxTest.B", b0.getTimeMillis()));
    DropBoxManager.Entry x0 = dropbox.getNextEntry(null, before);
    DropBoxManager.Entry x1 = dropbox.getNextEntry(null, x0.getTimeMillis());
    DropBoxManager.Entry x2 = dropbox.getNextEntry(null, x1.getTimeMillis());
    assertTrue(null == dropbox.getNextEntry(null, x2.getTimeMillis()));
    assertEquals("DropBoxTest.A", a0.getTag());
    assertEquals("DropBoxTest.A", a1.getTag());
    assertEquals("A0", a0.getText(80));
    assertEquals("A1", a1.getText(80));
    assertEquals("DropBoxTest.B", b0.getTag());
    assertEquals("B0", b0.getText(80));
    assertEquals("DropBoxTest.A", x0.getTag());
    assertEquals("DropBoxTest.B", x1.getTag());
    assertEquals("DropBoxTest.A", x2.getTag());
    assertEquals("A0", x0.getText(80));
    assertEquals("B0", x1.getText(80));
    assertEquals("A1", x2.getText(80));
    a0.close();
    a1.close();
    b0.close();
    x0.close();
    x1.close();
    x2.close();
    service.stop();
}
Also used : DropBoxManager(android.os.DropBoxManager) DropBoxManagerService(com.android.server.DropBoxManagerService) File(java.io.File)

Aggregations

DropBoxManager (android.os.DropBoxManager)81 File (java.io.File)65 DropBoxManagerService (com.android.server.DropBoxManagerService)46 FileOutputStream (java.io.FileOutputStream)21 ContentResolver (android.content.ContentResolver)20 IOException (java.io.IOException)16 FileObserver (android.os.FileObserver)12 StatFs (android.os.StatFs)10 FileWriter (java.io.FileWriter)10 GZIPOutputStream (java.util.zip.GZIPOutputStream)10 ActivityThread (android.app.ActivityThread)8 IApplicationThread (android.app.IApplicationThread)8 IBinder (android.os.IBinder)8 RemoteException (android.os.RemoteException)6 AtomicFile (android.util.AtomicFile)5 HashMap (java.util.HashMap)5 BackgroundThread (com.android.internal.os.BackgroundThread)4 ServiceThread (com.android.server.ServiceThread)4 InputStreamReader (java.io.InputStreamReader)4 Point (android.graphics.Point)2