Search in sources :

Example 36 with Message

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

the class ActivityManagerService method startProcessLocked.

private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr) {
    if (app.pid > 0 && app.pid != MY_PID) {
        synchronized (mPidsSelfLocked) {
            mPidsSelfLocked.remove(app.pid);
            mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);
        }
        app.setPid(0);
    }
    if (DEBUG_PROCESSES && mProcessesOnHold.contains(app))
        Slog.v(TAG, "startProcessLocked removing on hold: " + app);
    mProcessesOnHold.remove(app);
    updateCpuStats();
    System.arraycopy(mProcDeaths, 0, mProcDeaths, 1, mProcDeaths.length - 1);
    mProcDeaths[0] = 0;
    try {
        int uid = app.uid;
        int[] gids = null;
        int mountExternal = Zygote.MOUNT_EXTERNAL_NONE;
        if (!app.isolated) {
            int[] permGids = null;
            try {
                final PackageManager pm = mContext.getPackageManager();
                permGids = pm.getPackageGids(app.info.packageName);
                if (Environment.isExternalStorageEmulated()) {
                    if (pm.checkPermission(android.Manifest.permission.ACCESS_ALL_EXTERNAL_STORAGE, app.info.packageName) == PERMISSION_GRANTED) {
                        mountExternal = Zygote.MOUNT_EXTERNAL_MULTIUSER_ALL;
                    } else {
                        mountExternal = Zygote.MOUNT_EXTERNAL_MULTIUSER;
                    }
                }
            } catch (PackageManager.NameNotFoundException e) {
                Slog.w(TAG, "Unable to retrieve gids", e);
            }
            /*
                 * Add shared application GID so applications can share some
                 * resources like shared libraries
                 */
            if (permGids == null) {
                gids = new int[1];
            } else {
                gids = new int[permGids.length + 1];
                System.arraycopy(permGids, 0, gids, 1, permGids.length);
            }
            gids[0] = UserHandle.getSharedAppGid(UserHandle.getAppId(uid));
        }
        if (mFactoryTest != SystemServer.FACTORY_TEST_OFF) {
            if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL && mTopComponent != null && app.processName.equals(mTopComponent.getPackageName())) {
                uid = 0;
            }
            if (mFactoryTest == SystemServer.FACTORY_TEST_HIGH_LEVEL && (app.info.flags & ApplicationInfo.FLAG_FACTORY_TEST) != 0) {
                uid = 0;
            }
        }
        int debugFlags = 0;
        if ((app.info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
            debugFlags |= Zygote.DEBUG_ENABLE_DEBUGGER;
            // Also turn on CheckJNI for debuggable apps. It's quite
            // awkward to turn on otherwise.
            debugFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;
        }
        // system is booted in safe mode.
        if ((app.info.flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0 || Zygote.systemInSafeMode == true) {
            debugFlags |= Zygote.DEBUG_ENABLE_SAFEMODE;
        }
        if ("1".equals(SystemProperties.get("debug.checkjni"))) {
            debugFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;
        }
        if ("1".equals(SystemProperties.get("debug.jni.logging"))) {
            debugFlags |= Zygote.DEBUG_ENABLE_JNI_LOGGING;
        }
        if ("1".equals(SystemProperties.get("debug.assert"))) {
            debugFlags |= Zygote.DEBUG_ENABLE_ASSERT;
        }
        // Start the process.  It will either succeed and return a result containing
        // the PID of the new process, or else throw a RuntimeException.
        Process.ProcessStartResult startResult = Process.start("android.app.ActivityThread", app.processName, uid, uid, gids, debugFlags, mountExternal, app.info.targetSdkVersion, app.info.seinfo, null);
        BatteryStatsImpl bs = app.batteryStats.getBatteryStats();
        synchronized (bs) {
            if (bs.isOnBattery()) {
                app.batteryStats.incStartsLocked();
            }
        }
        EventLog.writeEvent(EventLogTags.AM_PROC_START, UserHandle.getUserId(uid), startResult.pid, uid, app.processName, hostingType, hostingNameStr != null ? hostingNameStr : "");
        if (app.persistent) {
            Watchdog.getInstance().processStarted(app.processName, startResult.pid);
        }
        StringBuilder buf = mStringBuilder;
        buf.setLength(0);
        buf.append("Start proc ");
        buf.append(app.processName);
        buf.append(" for ");
        buf.append(hostingType);
        if (hostingNameStr != null) {
            buf.append(" ");
            buf.append(hostingNameStr);
        }
        buf.append(": pid=");
        buf.append(startResult.pid);
        buf.append(" uid=");
        buf.append(uid);
        buf.append(" gids={");
        if (gids != null) {
            for (int gi = 0; gi < gids.length; gi++) {
                if (gi != 0)
                    buf.append(", ");
                buf.append(gids[gi]);
            }
        }
        buf.append("}");
        Slog.i(TAG, buf.toString());
        app.setPid(startResult.pid);
        app.usingWrapper = startResult.usingWrapper;
        app.removed = false;
        synchronized (mPidsSelfLocked) {
            this.mPidsSelfLocked.put(startResult.pid, app);
            Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
            msg.obj = app;
            mHandler.sendMessageDelayed(msg, startResult.usingWrapper ? PROC_START_TIMEOUT_WITH_WRAPPER : PROC_START_TIMEOUT);
        }
    } catch (RuntimeException e) {
        // XXX do better error recovery.
        app.setPid(0);
        Slog.e(TAG, "Failure starting process " + app.processName, e);
    }
}
Also used : PackageManager(android.content.pm.PackageManager) IPackageManager(android.content.pm.IPackageManager) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) Message(android.os.Message) Process(android.os.Process) BatteryStatsImpl(com.android.internal.os.BatteryStatsImpl)

Example 37 with Message

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

the class ActivityStack method showAskCompatModeDialogLocked.

final void showAskCompatModeDialogLocked(ActivityRecord r) {
    Message msg = Message.obtain();
    msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG;
    msg.obj = r.task.askedCompatMode ? null : r;
    mService.mHandler.sendMessage(msg);
}
Also used : Message(android.os.Message)

Example 38 with Message

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

the class ActivityStack method completeResumeLocked.

/**
     * Once we know that we have asked an application to put an activity in
     * the resumed state (either by launching it or explicitly telling it),
     * this function updates the rest of our state to match that fact.
     */
private final void completeResumeLocked(ActivityRecord next) {
    next.idle = false;
    next.results = null;
    next.newIntents = null;
    // schedule an idle timeout in case the app doesn't do it for us.
    Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
    msg.obj = next;
    mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
    if (false) {
        // The activity was never told to pause, so just keep
        // things going as-is.  To maintain our own state,
        // we need to emulate it coming back and saying it is
        // idle.
        msg = mHandler.obtainMessage(IDLE_NOW_MSG);
        msg.obj = next;
        mHandler.sendMessage(msg);
    }
    if (mMainStack) {
        mService.reportResumedActivityLocked(next);
    }
    if (mMainStack) {
        mService.setFocusedActivityLocked(next);
    }
    next.resumeKeyDispatchingLocked();
    ensureActivitiesVisibleLocked(null, 0);
    mService.mWindowManager.executeAppTransition();
    mNoAnimActivities.clear();
    //       not after the onResume. But for subsequent starts, onResume is fine.
    if (next.app != null) {
        synchronized (mService.mProcessStatsThread) {
            next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid);
        }
    } else {
        // Couldn't get the cpu time of process
        next.cpuTimeAtResume = 0;
    }
}
Also used : Message(android.os.Message)

Example 39 with Message

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

the class ActivityStack method destroyActivityLocked.

/**
     * Destroy the current CLIENT SIDE instance of an activity.  This may be
     * called both when actually finishing an activity, or when performing
     * a configuration switch where we destroy the current client-side object
     * but then create a new client-side object for this same HistoryRecord.
     */
final boolean destroyActivityLocked(ActivityRecord r, boolean removeFromApp, boolean oomAdj, String reason) {
    if (DEBUG_SWITCH || DEBUG_CLEANUP)
        Slog.v(TAG, "Removing activity from " + reason + ": token=" + r + ", app=" + (r.app != null ? r.app.processName : "(null)"));
    EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY, r.userId, System.identityHashCode(r), r.task.taskId, r.shortComponentName, reason);
    boolean removedFromHistory = false;
    cleanUpActivityLocked(r, false, false);
    final boolean hadApp = r.app != null;
    if (hadApp) {
        if (removeFromApp) {
            int idx = r.app.activities.indexOf(r);
            if (idx >= 0) {
                r.app.activities.remove(idx);
            }
            if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) {
                mService.mHeavyWeightProcess = null;
                mService.mHandler.sendEmptyMessage(ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
            }
            if (r.app.activities.size() == 0) {
                // No longer have activities, so update oom adj.
                mService.updateOomAdjLocked();
            }
        }
        boolean skipDestroy = false;
        try {
            if (DEBUG_SWITCH)
                Slog.i(TAG, "Destroying: " + r);
            r.app.thread.scheduleDestroyActivity(r.appToken, r.finishing, r.configChangeFlags);
        } catch (Exception e) {
            //Slog.w(TAG, "Exception thrown during finish", e);
            if (r.finishing) {
                removeActivityFromHistoryLocked(r);
                removedFromHistory = true;
                skipDestroy = true;
            }
        }
        r.nowVisible = false;
        // list.
        if (r.finishing && !skipDestroy) {
            if (DEBUG_STATES)
                Slog.v(TAG, "Moving to DESTROYING: " + r + " (destroy requested)");
            r.state = ActivityState.DESTROYING;
            Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG);
            msg.obj = r;
            mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT);
        } else {
            if (DEBUG_STATES)
                Slog.v(TAG, "Moving to DESTROYED: " + r + " (destroy skipped)");
            r.state = ActivityState.DESTROYED;
            if (DEBUG_APP)
                Slog.v(TAG, "Clearing app during destroy for activity " + r);
            r.app = null;
        }
    } else {
        // remove this record from the history.
        if (r.finishing) {
            removeActivityFromHistoryLocked(r);
            removedFromHistory = true;
        } else {
            if (DEBUG_STATES)
                Slog.v(TAG, "Moving to DESTROYED: " + r + " (no app)");
            r.state = ActivityState.DESTROYED;
            if (DEBUG_APP)
                Slog.v(TAG, "Clearing app during destroy for activity " + r);
            r.app = null;
        }
    }
    r.configChangeFlags = 0;
    if (!mLRUActivities.remove(r) && hadApp) {
        Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list");
    }
    return removedFromHistory;
}
Also used : Message(android.os.Message) RemoteException(android.os.RemoteException) IOException(java.io.IOException)

Example 40 with Message

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

the class BroadcastQueue method setBroadcastTimeoutLocked.

final void setBroadcastTimeoutLocked(long timeoutTime) {
    if (!mPendingBroadcastTimeoutMessage) {
        Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this);
        mHandler.sendMessageAtTime(msg, timeoutTime);
        mPendingBroadcastTimeoutMessage = true;
    }
}
Also used : Message(android.os.Message)

Aggregations

Message (android.os.Message)3198 Handler (android.os.Handler)347 RemoteException (android.os.RemoteException)263 Bundle (android.os.Bundle)210 Test (org.junit.Test)144 Intent (android.content.Intent)130 IOException (java.io.IOException)124 Point (android.graphics.Point)86 HashMap (java.util.HashMap)77 SomeArgs (com.android.internal.os.SomeArgs)67 SmallTest (android.test.suitebuilder.annotation.SmallTest)64 Messenger (android.os.Messenger)63 ArrayList (java.util.ArrayList)59 View (android.view.View)52 File (java.io.File)50 MediumTest (android.test.suitebuilder.annotation.MediumTest)43 TextView (android.widget.TextView)41 IBinder (android.os.IBinder)38 Map (java.util.Map)37 PendingIntent (android.app.PendingIntent)33