diff options
Diffstat (limited to 'services/core/java/com/android/server/am')
4 files changed, 262 insertions, 127 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 2f3cdf7..fb65a15 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1,6 +1,8 @@ /* * Copyright (C) 2006-2008 The Android Open Source Project - * + * This code has been modified. Portions copyright (C) 2010, T-Mobile USA, Inc. + * Copyright (c) 2010-2014, The Linux Foundation. All rights reserved. + * Not a Contribution. * 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 @@ -52,6 +54,7 @@ import android.app.usage.UsageStatsManagerInternal; import android.appwidget.AppWidgetManager; import android.content.pm.PermissionInfo; import android.content.res.Resources; +import android.content.res.ThemeConfig; import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; @@ -71,8 +74,8 @@ import android.util.ArraySet; import android.util.DebugUtils; import android.util.SparseIntArray; import android.view.Display; -import android.util.BoostFramework; +import android.view.InflateException; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.AssistUtils; @@ -171,6 +174,7 @@ import android.content.pm.InstrumentationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; +import android.content.pm.ThemeUtils; import android.content.pm.UserInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PathPermission; @@ -179,6 +183,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; +import android.content.res.ThemeConfig; import android.net.Proxy; import android.net.ProxyInfo; import android.net.Uri; @@ -389,6 +394,8 @@ public final class ActivityManagerService extends ActivityManagerNative // How many bytes to write into the dropbox log before truncating static final int DROPBOX_MAX_SIZE = 256 * 1024; + static final String PROP_REFRESH_THEME = "sys.refresh_theme"; + // Access modes for handleIncomingUser. static final int ALLOW_NON_FULL = 0; static final int ALLOW_NON_FULL_IN_PROFILE = 1; @@ -1012,6 +1019,7 @@ public final class ActivityManagerService extends ActivityManagerNative boolean mLaunchWarningShown = false; Context mContext; + Context mUiContext; int mFactoryTest; @@ -1363,6 +1371,8 @@ public final class ActivityManagerService extends ActivityManagerNative static final int REPORT_TIME_TRACKER_MSG = 55; static final int REPORT_USER_SWITCH_COMPLETE_MSG = 56; static final int SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG = 57; + static final int POST_PRIVACY_NOTIFICATION_MSG = 58; + static final int CANCEL_PRIVACY_NOTIFICATION_MSG = 59; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_BROADCAST_QUEUE_MSG = 200; @@ -1435,7 +1445,7 @@ public final class ActivityManagerService extends ActivityManagerNative return; } if (mShowDialogs && !mSleeping && !mShuttingDown) { - Dialog d = new AppErrorDialog(mContext, + Dialog d = new AppErrorDialog(getUiContext(), ActivityManagerService.this, res, proc); d.show(); proc.crashDialog = d; @@ -1470,7 +1480,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (mShowDialogs) { Dialog d = new AppNotRespondingDialog(ActivityManagerService.this, - mContext, proc, (ActivityRecord)data.get("activity"), + getUiContext(), proc, (ActivityRecord)data.get("activity"), msg.arg1 != 0); d.show(); proc.anrDialog = d; @@ -1496,7 +1506,7 @@ public final class ActivityManagerService extends ActivityManagerNative } AppErrorResult res = (AppErrorResult) data.get("result"); if (mShowDialogs && !mSleeping && !mShuttingDown) { - Dialog d = new StrictModeViolationDialog(mContext, + Dialog d = new StrictModeViolationDialog(getUiContext(), ActivityManagerService.this, res, proc); d.show(); proc.crashDialog = d; @@ -1510,7 +1520,7 @@ public final class ActivityManagerService extends ActivityManagerNative } break; case SHOW_FACTORY_ERROR_MSG: { Dialog d = new FactoryErrorDialog( - mContext, msg.getData().getCharSequence("msg")); + getUiContext(), msg.getData().getCharSequence("msg")); d.show(); ensureBootCompleted(); } break; @@ -1521,7 +1531,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (!app.waitedForDebugger) { Dialog d = new AppWaitingForDebuggerDialog( ActivityManagerService.this, - mContext, app); + getUiContext(), app); app.waitDialog = d; app.waitedForDebugger = true; d.show(); @@ -2048,6 +2058,69 @@ public final class ActivityManagerService extends ActivityManagerNative // it is finished we make sure it is reset to its default. mUserIsMonkey = false; } break; + case POST_PRIVACY_NOTIFICATION_MSG: { + INotificationManager inm = NotificationManager.getService(); + if (inm == null) { + return; + } + + ActivityRecord root = (ActivityRecord)msg.obj; + ProcessRecord process = root.app; + if (process == null) { + return; + } + + try { + Context context = mContext.createPackageContext(process.info.packageName, 0); + String text = mContext.getString(R.string.privacy_guard_notification_detail, + context.getApplicationInfo().loadLabel(context.getPackageManager())); + String title = mContext.getString(R.string.privacy_guard_notification); + + Intent infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + Uri.fromParts("package", root.packageName, null)); + + Notification notification = new Notification(); + notification.icon = com.android.internal.R.drawable.stat_notify_privacy_guard; + notification.when = 0; + notification.flags = Notification.FLAG_ONGOING_EVENT; + notification.priority = Notification.PRIORITY_LOW; + notification.defaults = 0; + notification.sound = null; + notification.vibrate = null; + notification.setLatestEventInfo(mContext, + title, text, + PendingIntent.getActivityAsUser(mContext, 0, infoIntent, + PendingIntent.FLAG_CANCEL_CURRENT, null, + new UserHandle(root.userId))); + + try { + int[] outId = new int[1]; + inm.enqueueNotificationWithTag("android", "android", null, + R.string.privacy_guard_notification, + notification, outId, root.userId); + } catch (RuntimeException e) { + Slog.w(ActivityManagerService.TAG, + "Error showing notification for privacy guard", e); + } catch (RemoteException e) { + } + } catch (NameNotFoundException e) { + Slog.w(TAG, "Unable to create context for privacy guard notification", e); + } + } break; + case CANCEL_PRIVACY_NOTIFICATION_MSG: { + INotificationManager inm = NotificationManager.getService(); + if (inm == null) { + return; + } + try { + inm.cancelNotificationWithTag("android", null, + R.string.privacy_guard_notification, msg.arg1); + } catch (RuntimeException e) { + Slog.w(ActivityManagerService.TAG, + "Error canceling notification for service", e); + } catch (RemoteException e) { + } + } break; } } }; @@ -2596,6 +2669,15 @@ public final class ActivityManagerService extends ActivityManagerNative -1, Process.SYSTEM_UID, UserHandle.USER_ALL); } + private Context getUiContext() { + synchronized (this) { + if (mUiContext == null && mBooted) { + mUiContext = ThemeUtils.createUiContext(mContext); + } + return mUiContext != null ? mUiContext : mContext; + } + } + /** * Initialize the application bind args. These are passed to each * process when the bindApplication() IPC is sent to the process. They're @@ -3320,6 +3402,13 @@ public final class ActivityManagerService extends ActivityManagerNative debugFlags |= Zygote.DEBUG_ENABLE_ASSERT; } + //Check if zygote should refresh its fonts + boolean refreshTheme = false; + if (SystemProperties.getBoolean(PROP_REFRESH_THEME, false)) { + SystemProperties.set(PROP_REFRESH_THEME, "false"); + refreshTheme = true; + } + String requiredAbi = (abiOverride != null) ? abiOverride : app.info.primaryCpuAbi; if (requiredAbi == null) { requiredAbi = Build.SUPPORTED_ABIS[0]; @@ -3344,7 +3433,7 @@ public final class ActivityManagerService extends ActivityManagerNative Process.ProcessStartResult startResult = Process.start(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet, - app.info.dataDir, entryPointArgs); + app.info.dataDir, refreshTheme, entryPointArgs); checkTime(startTime, "startProcess: returned from zygote!"); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); @@ -3366,17 +3455,6 @@ public final class ActivityManagerService extends ActivityManagerNative checkTime(startTime, "startProcess: building log message"); StringBuilder buf = mStringBuilder; buf.setLength(0); - if(hostingType.equals("activity")) - { - BoostFramework mPerf = null; - if (null == mPerf) { - mPerf = new BoostFramework(); - } - if (mPerf != null) { - mPerf.perfIOPrefetchStart(startResult.pid,app.processName); - } - } - buf.append("Start proc "); buf.append(startResult.pid); buf.append(':'); @@ -3866,7 +3944,8 @@ public final class ActivityManagerService extends ActivityManagerNative if (sourceRecord == null) { throw new SecurityException("Called with bad activity token: " + resultTo); } - if (!sourceRecord.info.packageName.equals("android")) { + if (!sourceRecord.info.packageName.equals("android") && + !sourceRecord.info.packageName.equals("org.cyanogenmod.resolver")) { throw new SecurityException( "Must be called from an activity that is declared in the android package"); } @@ -5115,7 +5194,7 @@ public final class ActivityManagerService extends ActivityManagerNative @Override public void run() { synchronized (ActivityManagerService.this) { - final Dialog d = new LaunchWarningWindow(mContext, cur, next); + final Dialog d = new LaunchWarningWindow(getUiContext(), cur, next); d.show(); mUiHandler.postDelayed(new Runnable() { @Override @@ -6315,14 +6394,16 @@ public final class ActivityManagerService extends ActivityManagerNative @Override public void keyguardGoingAway(boolean disableWindowAnimations, - boolean keyguardGoingToNotificationShade) { + boolean keyguardGoingToNotificationShade, + boolean keyguardShowingMedia) { enforceNotIsolatedCaller("keyguardGoingAway"); final long token = Binder.clearCallingIdentity(); try { synchronized (this) { if (DEBUG_LOCKSCREEN) logLockScreen(""); mWindowManager.keyguardGoingAway(disableWindowAnimations, - keyguardGoingToNotificationShade); + keyguardGoingToNotificationShade, + keyguardShowingMedia); if (mLockScreenShown == LOCK_SCREEN_SHOWN) { mLockScreenShown = LOCK_SCREEN_HIDDEN; updateSleepIfNeededLocked(); @@ -6388,6 +6469,13 @@ public final class ActivityManagerService extends ActivityManagerNative } }, dumpheapFilter); + ThemeUtils.registerThemeChangeReceiver(mContext, new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + mUiContext = null; + } + }); + // Let system services know. mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETED); @@ -6439,7 +6527,7 @@ public final class ActivityManagerService extends ActivityManagerNative }, 0, null, null, new String[] {android.Manifest.permission.RECEIVE_BOOT_COMPLETED}, - AppOpsManager.OP_NONE, null, true, false, + AppOpsManager.OP_BOOT_COMPLETED, null, true, false, MY_PID, Process.SYSTEM_UID, userId); } } @@ -10244,7 +10332,13 @@ public final class ActivityManagerService extends ActivityManagerNative if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) { app.persistent = true; - app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ; + + // The Adj score defines an order of processes to be killed. + // If a process is shared by multiple apps, maxAdj must be set by the highest + // prioritized app to avoid being killed. + if (app.maxAdj >= ProcessList.PERSISTENT_PROC_ADJ) { + app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ; + } } if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) { mPersistentStartingProcesses.add(app); @@ -10682,6 +10776,7 @@ public final class ActivityManagerService extends ActivityManagerNative public void requestBugReport() { enforceCallingPermission(android.Manifest.permission.DUMP, "requestBugReport"); + mContext.sendBroadcast(new Intent("android.intent.action.BUGREPORT_STARTED")); SystemProperties.set("ctl.start", "bugreport"); } @@ -10759,9 +10854,15 @@ public final class ActivityManagerService extends ActivityManagerNative return true; } } + final int anrPid = proc.pid; mHandler.post(new Runnable() { @Override public void run() { + if (anrPid != proc.pid) { + Slog.i(TAG, "Ignoring stale ANR (occurred in " + anrPid + + ", but current pid is " + proc.pid + ")"); + return; + } appNotResponding(proc, activity, parent, aboveSystem, annotation); } }); @@ -11984,6 +12085,28 @@ public final class ActivityManagerService extends ActivityManagerNative } } + private void sendAppFailureBroadcast(String pkgName) { + Intent intent = new Intent(Intent.ACTION_APP_FAILURE, + (pkgName != null)? Uri.fromParts("package", pkgName, null) : null); + mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT_OR_SELF); + } + + /** + * A possible theme crash is one that throws one of the following exceptions + * {@link android.content.res.Resources.NotFoundException} + * {@link android.view.InflateException} + * + * @param exceptionClassName + * @return True if exceptionClassName is one of the above exceptions + */ + private boolean isPossibleThemeCrash(String exceptionClassName) { + if (Resources.NotFoundException.class.getName().equals(exceptionClassName) || + InflateException.class.getName().equals(exceptionClassName)) { + return true; + } + return false; + } + private boolean handleAppCrashLocked(ProcessRecord app, String reason, String shortMsg, String longMsg, String stackTrace) { long now = SystemClock.uptimeMillis(); @@ -11994,6 +12117,9 @@ public final class ActivityManagerService extends ActivityManagerNative } else { crashTime = null; } + + if (isPossibleThemeCrash(shortMsg)) sendAppFailureBroadcast(app.info.packageName); + if (crashTime != null && now < crashTime+ProcessList.MIN_CRASH_INTERVAL) { // This process loses! Slog.w(TAG, "Process " + app.info.processName @@ -12793,6 +12919,9 @@ public final class ActivityManagerService extends ActivityManagerNative || (!allUids && app.uid != callingUid)) { continue; } + if (app.processName.equals("system")) { + continue; + } if ((app.thread != null) && (!app.crashing && !app.notResponding)) { // Generate process state info for running application ActivityManager.RunningAppProcessInfo currApp = @@ -17290,6 +17419,9 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(this) { ci = new Configuration(mConfiguration); ci.userSetLocale = false; + if (ci.themeConfig == null) { + ci.themeConfig = ThemeConfig.getBootTheme(mContext.getContentResolver()); + } } return ci; } @@ -17379,6 +17511,11 @@ public final class ActivityManagerService extends ActivityManagerNative values.locale)); } + if (values.themeConfig != null) { + saveThemeResourceLocked(values.themeConfig, + !values.themeConfig.equals(mConfiguration.themeConfig)); + } + mConfigurationSeq++; if (mConfigurationSeq <= 0) { mConfigurationSeq = 1; @@ -17434,6 +17571,10 @@ public final class ActivityManagerService extends ActivityManagerNative null, AppOpsManager.OP_NONE, null, false, false, MY_PID, Process.SYSTEM_UID, UserHandle.USER_ALL); if ((changes&ActivityInfo.CONFIG_LOCALE) != 0) { + // if locale changed, time format may have changed + final int is24Hour = android.text.format.DateFormat.is24HourFormat(mContext) ? 1 : 0; + mHandler.sendMessage(mHandler.obtainMessage(UPDATE_TIME, is24Hour, 0)); + // now send general broadcast intent = new Intent(Intent.ACTION_LOCALE_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); if (!mProcessesReady) { @@ -17531,6 +17672,14 @@ public final class ActivityManagerService extends ActivityManagerNative return srec.launchedFromPackage; } + private void saveThemeResourceLocked(ThemeConfig t, boolean isDiff){ + if(isDiff) { + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Configuration.THEME_PKG_CONFIGURATION_PERSISTENCE_PROPERTY, t.toJson(), + UserHandle.USER_CURRENT); + } + } + // ========================================================= // LIFETIME MANAGEMENT // ========================================================= @@ -20268,7 +20417,7 @@ public final class ActivityManagerService extends ActivityManagerNative broadcastIntentLocked(null, null, intent, null, null, 0, null, null, new String[] {android.Manifest.permission.RECEIVE_BOOT_COMPLETED}, - AppOpsManager.OP_NONE, null, true, false, MY_PID, Process.SYSTEM_UID, + AppOpsManager.OP_BOOT_COMPLETED, null, true, false, MY_PID, Process.SYSTEM_UID, userId); } } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index a254451..1f1ed6f 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -40,6 +40,7 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.AppGlobals; +import android.app.AppOpsManager; import android.app.IActivityController; import android.app.ResultInfo; import android.app.ActivityManager.RunningTaskInfo; @@ -66,8 +67,10 @@ import android.service.voice.IVoiceInteractionSession; import android.util.EventLog; import android.util.Slog; import android.view.Display; -import android.util.BoostFramework; -import com.android.internal.app.ActivityTrigger; + +import com.android.server.LocalServices; + +import cyanogenmod.power.PerformanceManagerInternal; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -153,10 +156,6 @@ final class ActivityStack { final WindowManagerService mWindowManager; private final RecentTasks mRecentTasks; - public BoostFramework mPerf = null; - public boolean mIsAnimationBoostEnabled = false; - public int aBoostTimeOut = 0; - public int aBoostParamVal[]; /** * The back history of all previous (and possibly still * running) activities. It contains #TaskRecord objects. @@ -270,9 +269,9 @@ final class ActivityStack { } } - final Handler mHandler; + private final PerformanceManagerInternal mPerf; - static final ActivityTrigger mActivityTrigger = new ActivityTrigger(); + final Handler mHandler; final class ActivityStackHandler extends Handler { @@ -370,14 +369,7 @@ final class ActivityStack { mCurrentUser = mService.mCurrentUserId; mRecentTasks = recentTasks; mOverrideConfig = Configuration.EMPTY; - mIsAnimationBoostEnabled = mService.mContext.getResources().getBoolean( - com.android.internal.R.bool.config_enablePerfBoostForAnimation); - if (mIsAnimationBoostEnabled) { - aBoostTimeOut = mService.mContext.getResources().getInteger( - com.android.internal.R.integer.animationboost_timeout_param); - aBoostParamVal = mService.mContext.getResources().getIntArray( - com.android.internal.R.array.animationboost_param_value); - } + mPerf = LocalServices.getService(PerformanceManagerInternal.class); } boolean okToShowLocked(ActivityRecord r) { @@ -1146,6 +1138,8 @@ final class ActivityStack { // When resuming an activity, require it to call requestVisibleBehind() again. mActivityContainer.mActivityDisplay.setVisibleBehindActivity(null); } + + updatePrivacyGuardNotificationLocked(next); } private void setVisible(ActivityRecord r, boolean visible) { @@ -1698,8 +1692,11 @@ final class ActivityStack { if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Resuming " + next); - mActivityTrigger.activityResumeTrigger(next.intent, next.info, next.appInfo); - + // Some activities may want to alter the system power management + if (mStackSupervisor.mPerf != null) { + mStackSupervisor.mPerf.activityResumed(next.intent); + } + // If we are currently pausing an activity, then don't do anything // until that is done. if (!mStackSupervisor.allPausedActivitiesComplete()) { @@ -1821,9 +1818,6 @@ final class ActivityStack { // that the previous one will be hidden soon. This way it can know // to ignore it when computing the desired screen orientation. boolean anim = true; - if (mIsAnimationBoostEnabled == true && mPerf == null) { - mPerf = new BoostFramework(); - } if (prev != null) { if (prev.finishing) { if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, @@ -1835,8 +1829,10 @@ final class ActivityStack { mWindowManager.prepareAppTransition(prev.task == next.task ? AppTransition.TRANSIT_ACTIVITY_CLOSE : AppTransition.TRANSIT_TASK_CLOSE, false); - if(prev.task != next.task && mPerf != null) { - mPerf.perfLockAcquire(aBoostTimeOut, aBoostParamVal); + if (prev.task != next.task) { + if (mStackSupervisor.mPerf != null) { + mStackSupervisor.mPerf.cpuBoost(2000 * 1000); + } } } mWindowManager.setAppWillBeHidden(prev.appToken); @@ -1853,8 +1849,10 @@ final class ActivityStack { : next.mLaunchTaskBehind ? AppTransition.TRANSIT_TASK_OPEN_BEHIND : AppTransition.TRANSIT_TASK_OPEN, false); - if(prev.task != next.task && mPerf != null) { - mPerf.perfLockAcquire(aBoostTimeOut, aBoostParamVal); + if (prev.task != next.task) { + if (mStackSupervisor.mPerf != null) { + mStackSupervisor.mPerf.cpuBoost(2000 * 1000); + } } } } @@ -2098,6 +2096,29 @@ final class ActivityStack { updateTaskMovement(task, true); } + private final void updatePrivacyGuardNotificationLocked(ActivityRecord next) { + + String privacyGuardPackageName = mStackSupervisor.mPrivacyGuardPackageName; + if (privacyGuardPackageName != null && privacyGuardPackageName.equals(next.packageName)) { + return; + } + + boolean privacy = mService.mAppOpsService.getPrivacyGuardSettingForPackage( + next.app.uid, next.packageName); + + if (privacyGuardPackageName != null && !privacy) { + Message msg = mService.mHandler.obtainMessage( + ActivityManagerService.CANCEL_PRIVACY_NOTIFICATION_MSG, next.userId); + msg.sendToTarget(); + mStackSupervisor.mPrivacyGuardPackageName = null; + } else if (privacy) { + Message msg = mService.mHandler.obtainMessage( + ActivityManagerService.POST_PRIVACY_NOTIFICATION_MSG, next); + msg.sendToTarget(); + mStackSupervisor.mPrivacyGuardPackageName = next.packageName; + } + } + final void startActivityLocked(ActivityRecord r, boolean newTask, boolean doResume, boolean keepCurTransition, Bundle options) { TaskRecord rTask = r.task; @@ -2168,7 +2189,6 @@ final class ActivityStack { task.setFrontOfTask(); r.putInHistory(); - mActivityTrigger.activityStartTrigger(r.intent, r.info, r.appInfo); if (!isHomeStack() || numActivities() > 0) { // We want to show the starting preview window if we are // switching to a new task, or the next activity's process is diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index a4c8882..81cb623 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -101,13 +101,12 @@ import android.util.ArraySet; import android.util.EventLog; import android.util.Slog; import android.util.SparseArray; -import android.util.BoostFramework; - import android.util.SparseIntArray; import android.view.Display; import android.view.DisplayInfo; import android.view.InputEvent; import android.view.Surface; + import com.android.internal.app.HeavyWeightSwitcherActivity; import com.android.internal.app.IVoiceInteractor; import com.android.internal.content.ReferrerIntent; @@ -119,6 +118,8 @@ import com.android.server.LocalServices; import com.android.server.am.ActivityStack.ActivityState; import com.android.server.wm.WindowManagerService; +import cyanogenmod.power.PerformanceManagerInternal; + import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; @@ -161,15 +162,6 @@ public final class ActivityStackSupervisor implements DisplayListener { static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2; static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3; static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4; - public BoostFramework mPerf_iop = null; - public BoostFramework mPerfBoost = null; - public BoostFramework mPerfPack = null; - public boolean mIsPerfBoostEnabled = false; - public boolean mIsperfDisablepackingEnable = false; - public int lBoostTimeOut = 0; - public int lDisPackTimeOut = 0; - public int lBoostCpuParamVal[]; - public int lBoostPackParamVal[]; static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5; static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6; static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7; @@ -282,6 +274,15 @@ public final class ActivityStackSupervisor implements DisplayListener { * setWindowManager is called. **/ private boolean mLeanbackOnlyDevice; + PowerManager mPm; + + PerformanceManagerInternal mPerf; + + /** + * Is the privacy guard currently enabled? Shared between ActivityStacks + */ + String mPrivacyGuardPackageName = null; + /** * We don't want to allow the device to go to sleep while in the process * of launching an activity. This is primarily to allow alarm intent @@ -351,35 +352,27 @@ public final class ActivityStackSupervisor implements DisplayListener { mService = service; mRecentTasks = recentTasks; mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper()); - /* Is perf lock for cpu-boost enabled during App 1st launch */ - mIsPerfBoostEnabled = mService.mContext.getResources().getBoolean( - com.android.internal.R.bool.config_enableCpuBoostForAppLaunch); - mIsperfDisablepackingEnable = mService.mContext.getResources().getBoolean( - com.android.internal.R.bool.config_disablePacking); + } - if(mIsPerfBoostEnabled) { - lBoostTimeOut = mService.mContext.getResources().getInteger( - com.android.internal.R.integer.launchboost_timeout_param); - lBoostCpuParamVal = mService.mContext.getResources().getIntArray( - com.android.internal.R.array.launchboost_param_value); + private void launchBoost() { + if (mPerf == null) { + mPerf = LocalServices.getService(PerformanceManagerInternal.class); + } + if (mPerf == null) { + Slog.e(TAG, "PerformanceManager not ready!"); + } else { + mPerf.launchBoost(); } - - if(mIsperfDisablepackingEnable) { - lDisPackTimeOut = mService.mContext.getResources().getInteger( - com.android.internal.R.integer.disablepacking_timeout_param); - lBoostPackParamVal = mService.mContext.getResources().getIntArray( - com.android.internal.R.array.launchboost_packing_param_value); - } } - + /** * At the time when the constructor runs, the power manager has not yet been * initialized. So we initialize our wakelocks afterwards. */ void initPowerManagement() { - PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE); - mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); - mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*launch*"); + mPm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE); + mGoingToSleep = mPm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); + mLaunchingActivity = mPm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*launch*"); mLaunchingActivity.setReferenceCounted(false); } @@ -1457,6 +1450,8 @@ public final class ActivityStackSupervisor implements DisplayListener { Display.DEFAULT_DISPLAY : mFocusedStack.mDisplayId) : (container.mActivityDisplay == null ? Display.DEFAULT_DISPLAY : container.mActivityDisplay.mDisplayId))); + /* Acquire perf lock during new app launch */ + launchBoost(); } ActivityRecord sourceRecord = null; @@ -1509,6 +1504,11 @@ public final class ActivityStackSupervisor implements DisplayListener { if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { // We couldn't find a class that can handle the given Intent. // That's the end of that! + final Uri data = intent.getData(); + final String strData = data != null ? data.toSafeString() : null; + EventLog.writeEvent(EventLogTags.AM_INTENT_NOT_RESOLVED, callingPackage, + intent.getAction(), intent.getType(), strData, intent.getFlags()); + err = ActivityManager.START_INTENT_NOT_RESOLVED; } @@ -2797,12 +2797,10 @@ public final class ActivityStackSupervisor implements DisplayListener { } void findTaskToMoveToFrontLocked(TaskRecord task, int flags, Bundle options, String reason) { - - ActivityRecord top_activity; - top_activity = task.stack.topRunningActivityLocked(null); + ActivityRecord top = task.stack.topRunningActivityLocked(null); /* App is launching from recent apps and it's a new process */ - if(top_activity != null && top_activity.state == ActivityState.DESTROYED) { - acquireAppLaunchPerfLock(); + if(top != null && top.state == ActivityState.DESTROYED) { + launchBoost(); } if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) { @@ -3069,23 +3067,6 @@ public final class ActivityStackSupervisor implements DisplayListener { resumeTopActivitiesLocked(); } - void acquireAppLaunchPerfLock() { - /* Acquire perf lock during new app launch */ - if (mIsperfDisablepackingEnable == true && mPerfPack == null) { - mPerfPack = new BoostFramework(); - } - if (mPerfPack != null) { - mPerfPack.perfLockAcquire(lDisPackTimeOut, lBoostPackParamVal); - } - - if (mIsPerfBoostEnabled == true && mPerfBoost == null) { - mPerfBoost = new BoostFramework(); - } - if (mPerfBoost != null) { - mPerfBoost.perfLockAcquire(lBoostTimeOut, lBoostCpuParamVal); - } - } - ActivityRecord findTaskLocked(ActivityRecord r) { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + r); for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { @@ -3103,33 +3084,16 @@ public final class ActivityStackSupervisor implements DisplayListener { } final ActivityRecord ar = stack.findTaskLocked(r); if (ar != null) { - if(ar.state == ActivityState.DESTROYED ) { - /*It's a new app launch */ - acquireAppLaunchPerfLock(); - - // Strat IOP - if (mPerf_iop == null) { - mPerf_iop = new BoostFramework(); - } - if (mPerf_iop != null) { - mPerf_iop.perfIOPrefetchStart(-1,r.packageName); - } + if (ar.state == ActivityState.DESTROYED) { + launchBoost(); } return ar; } } } - /* Acquire perf lock during new app launch */ - acquireAppLaunchPerfLock(); - //Start IOP - if (mPerf_iop == null) { - mPerf_iop = new BoostFramework(); - } - if (mPerf_iop != null) { - mPerf_iop.perfIOPrefetchStart(-1,r.packageName); - } - if (DEBUG_TASKS) Slog.d(TAG_TASKS, "No task found"); + launchBoost(); + return null; } diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags index 9a645df..33fa714 100644 --- a/services/core/java/com/android/server/am/EventLogTags.logtags +++ b/services/core/java/com/android/server/am/EventLogTags.logtags @@ -78,6 +78,8 @@ option java_package com.android.server.am 30036 am_provider_lost_process (User|1|5),(Package Name|3),(UID|1|5),(Name|3) # The activity manager gave up on a new process taking too long to start 30037 am_process_start_timeout (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3) +# The activity manager was unable to resolve the intent to an Activity +30038 am_intent_not_resolved (Calling Package Name|3),(Action|3),(MIME Type|3),(URI|3),(Flags|1|5) # Unhandled exception 30039 am_crash (User|1|5),(PID|1|5),(Process Name|3),(Flags|1|5),(Exception|3),(Message|3),(File|3),(Line|1|5) |