diff options
12 files changed, 123 insertions, 27 deletions
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 1d3ac6a9f14f..1a10753d7bcb 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -2079,9 +2079,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { HistoricalOps histOps = ops.get(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); - StatsLogEventWrapper e = new StatsLogEventWrapper(StatsLog.APP_OPS, elapsedNanos, - wallClockNanos); - for (int uidIdx = 0; uidIdx < histOps.getUidCount(); uidIdx++) { final HistoricalUidOps uidOps = histOps.getUidOpsAt(uidIdx); final int uid = uidOps.getUid(); @@ -2089,6 +2086,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { final HistoricalPackageOps packageOps = uidOps.getPackageOpsAt(pkgIdx); for (int opIdx = 0; opIdx < packageOps.getOpCount(); opIdx++) { final AppOpsManager.HistoricalOp op = packageOps.getOpAt(opIdx); + StatsLogEventWrapper e = new StatsLogEventWrapper(StatsLog.APP_OPS, + elapsedNanos, wallClockNanos); + e.writeInt(uid); e.writeString(packageOps.getPackageName()); e.writeInt(op.getOpCode()); diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 3cc28197503a..bc32df42ea4f 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -278,11 +278,13 @@ public final class Debug /** @hide */ public static final int OTHER_DALVIK_OTHER_ACCOUNTING = 22; /** @hide */ - public static final int OTHER_DALVIK_OTHER_CODE_CACHE = 23; + public static final int OTHER_DALVIK_OTHER_ZYGOTE_CODE_CACHE = 23; /** @hide */ - public static final int OTHER_DALVIK_OTHER_COMPILER_METADATA = 24; + public static final int OTHER_DALVIK_OTHER_APP_CODE_CACHE = 24; /** @hide */ - public static final int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE = 25; + public static final int OTHER_DALVIK_OTHER_COMPILER_METADATA = 25; + /** @hide */ + public static final int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE = 26; /** @hide */ public static final int OTHER_DVK_STAT_DALVIK_OTHER_START = OTHER_DALVIK_OTHER_LINEARALLOC - NUM_OTHER_STATS; @@ -292,11 +294,11 @@ public final class Debug // Dex subsections (Boot vdex, App dex, and App vdex). /** @hide */ - public static final int OTHER_DEX_BOOT_VDEX = 26; + public static final int OTHER_DEX_BOOT_VDEX = 27; /** @hide */ - public static final int OTHER_DEX_APP_DEX = 27; + public static final int OTHER_DEX_APP_DEX = 28; /** @hide */ - public static final int OTHER_DEX_APP_VDEX = 28; + public static final int OTHER_DEX_APP_VDEX = 29; /** @hide */ public static final int OTHER_DVK_STAT_DEX_START = OTHER_DEX_BOOT_VDEX - NUM_OTHER_STATS; /** @hide */ @@ -304,9 +306,9 @@ public final class Debug // Art subsections (App image, boot image). /** @hide */ - public static final int OTHER_ART_APP = 29; + public static final int OTHER_ART_APP = 30; /** @hide */ - public static final int OTHER_ART_BOOT = 30; + public static final int OTHER_ART_BOOT = 31; /** @hide */ public static final int OTHER_DVK_STAT_ART_START = OTHER_ART_APP - NUM_OTHER_STATS; /** @hide */ @@ -314,7 +316,7 @@ public final class Debug /** @hide */ @UnsupportedAppUsage - public static final int NUM_DVK_STATS = 14; + public static final int NUM_DVK_STATS = OTHER_ART_BOOT + 1 - OTHER_DALVIK_NORMAL; /** @hide */ public static final int NUM_CATEGORIES = 9; @@ -540,7 +542,8 @@ public final class Debug case OTHER_DALVIK_NON_MOVING: return ".NonMoving"; case OTHER_DALVIK_OTHER_LINEARALLOC: return ".LinearAlloc"; case OTHER_DALVIK_OTHER_ACCOUNTING: return ".GC"; - case OTHER_DALVIK_OTHER_CODE_CACHE: return ".JITCache"; + case OTHER_DALVIK_OTHER_ZYGOTE_CODE_CACHE: return ".ZygoteJIT"; + case OTHER_DALVIK_OTHER_APP_CODE_CACHE: return ".AppJIT"; case OTHER_DALVIK_OTHER_COMPILER_METADATA: return ".CompilerMetadata"; case OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE: return ".IndirectRef"; case OTHER_DEX_BOOT_VDEX: return ".Boot vdex"; @@ -722,7 +725,9 @@ public final class Debug + getOtherPrivate(OTHER_APK) + getOtherPrivate(OTHER_TTF) + getOtherPrivate(OTHER_DEX) - + getOtherPrivate(OTHER_OAT); + + getOtherPrivate(OTHER_OAT) + + getOtherPrivate(OTHER_DALVIK_OTHER_ZYGOTE_CODE_CACHE) + + getOtherPrivate(OTHER_DALVIK_OTHER_APP_CODE_CACHE); } /** @@ -813,7 +818,9 @@ public final class Debug + getOtherRss(OTHER_APK) + getOtherRss(OTHER_TTF) + getOtherRss(OTHER_DEX) - + getOtherRss(OTHER_OAT); + + getOtherRss(OTHER_OAT) + + getOtherRss(OTHER_DALVIK_OTHER_ZYGOTE_CODE_CACHE) + + getOtherRss(OTHER_DALVIK_OTHER_APP_CODE_CACHE); } /** diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index f34f9e6d5ce8..4b872d3ad758 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -73,6 +73,14 @@ oneway interface IWindow { */ void insetsControlChanged(in InsetsState insetsState, in InsetsSourceControl[] activeControls); + /** + * Called when a set of insets source window should be shown by policy. + * + * @param types internal inset types (WindowInsets.Type.InsetType) to show + * @param fromIme true if this request originated from IME (InputMethodService). + */ + void showInsets(int types, boolean fromIme); + void moved(int newX, int newY); void dispatchAppVisibility(boolean visible); void dispatchGetNewSurface(); diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index c798d85f0fea..5a8636d85a08 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -224,7 +224,7 @@ public class InsetsController implements WindowInsetsController { show(types, false /* fromIme */); } - private void show(@InsetType int types, boolean fromIme) { + void show(@InsetType int types, boolean fromIme) { // TODO: Support a ResultReceiver for IME. // TODO(b/123718661): Make show() work for multi-session IME. int typesReady = 0; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 3756a7de47c0..fedd6fbe56ed 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -91,6 +91,7 @@ import android.view.SurfaceControl.Transaction; import android.view.View.AttachInfo; import android.view.View.FocusDirection; import android.view.View.MeasureSpec; +import android.view.WindowInsets.Type.InsetType; import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; @@ -4528,6 +4529,8 @@ public final class ViewRootImpl implements ViewParent, private static final int MSG_INSETS_CONTROL_CHANGED = 31; private static final int MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED = 32; private static final int MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED = 33; + private static final int MSG_SHOW_INSETS = 34; + final class ViewRootHandler extends Handler { @Override @@ -4591,6 +4594,8 @@ public final class ViewRootImpl implements ViewParent, return "MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED"; case MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED: return "MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED"; + case MSG_SHOW_INSETS: + return "MSG_SHOW_INSETS"; } return super.getMessageName(message); } @@ -4705,6 +4710,10 @@ public final class ViewRootImpl implements ViewParent, mInsetsController.onStateChanged((InsetsState) args.arg1); break; } + case MSG_SHOW_INSETS: { + mInsetsController.show(msg.arg1, msg.arg2 == 1); + break; + } case MSG_WINDOW_MOVED: if (mAdded) { final int w = mWinFrame.width(); @@ -7484,6 +7493,10 @@ public final class ViewRootImpl implements ViewParent, mHandler.obtainMessage(MSG_INSETS_CONTROL_CHANGED, args).sendToTarget(); } + private void showInsets(@InsetType int types, boolean fromIme) { + mHandler.obtainMessage(MSG_SHOW_INSETS, types, fromIme ? 1 : 0).sendToTarget(); + } + public void dispatchMoved(int newX, int newY) { if (DEBUG_LAYOUT) Log.v(mTag, "Window moved " + this + ": newX=" + newX + " newY=" + newY); if (mTranslator != null) { @@ -8599,6 +8612,14 @@ public final class ViewRootImpl implements ViewParent, } @Override + public void showInsets(@InsetType int types, boolean fromIme) { + final ViewRootImpl viewAncestor = mViewAncestor.get(); + if (viewAncestor != null) { + viewAncestor.showInsets(types, fromIme); + } + } + + @Override public void moved(int newX, int newY) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index cc468f41a7f3..0e078dd3732d 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -30,6 +30,7 @@ import android.view.IWindowSession; import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.PointerIcon; +import android.view.WindowInsets.Type.InsetType; import com.android.internal.os.IResultReceiver; @@ -75,6 +76,10 @@ public class BaseIWindow extends IWindow.Stub { } @Override + public void showInsets(@InsetType int types, boolean fromIme) throws RemoteException { + } + + @Override public void moved(int newX, int newY) { } diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index f2a4f4fd203c..cbb74dff0e49 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -85,7 +85,8 @@ enum { // Dalvik other extra sections. HEAP_DALVIK_OTHER_LINEARALLOC, HEAP_DALVIK_OTHER_ACCOUNTING, - HEAP_DALVIK_OTHER_CODE_CACHE, + HEAP_DALVIK_OTHER_ZYGOTE_CODE_CACHE, + HEAP_DALVIK_OTHER_APP_CODE_CACHE, HEAP_DALVIK_OTHER_COMPILER_METADATA, HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE, @@ -282,9 +283,10 @@ static void load_maps(int pid, stats_t* stats, bool* foundSwapPss) is_swappable = true; } else if (base::EndsWith(name, ".vdex")) { which_heap = HEAP_DEX; - // Handle system@framework@boot and system/framework/boot + // Handle system@framework@boot and system/framework/boot|apex if ((strstr(name.c_str(), "@boot") != nullptr) || - (strstr(name.c_str(), "/boot"))) { + (strstr(name.c_str(), "/boot") != nullptr) || + (strstr(name.c_str(), "/apex") != nullptr)) { sub_heap = HEAP_DEX_BOOT_VDEX; } else { sub_heap = HEAP_DEX_APP_VDEX; @@ -295,9 +297,10 @@ static void load_maps(int pid, stats_t* stats, bool* foundSwapPss) is_swappable = true; } else if (base::EndsWith(name, ".art") || base::EndsWith(name, ".art]")) { which_heap = HEAP_ART; - // Handle system@framework@boot* and system/framework/boot* + // Handle system@framework@boot* and system/framework/boot|apex* if ((strstr(name.c_str(), "@boot") != nullptr) || - (strstr(name.c_str(), "/boot"))) { + (strstr(name.c_str(), "/boot") != nullptr) || + (strstr(name.c_str(), "/apex") != nullptr)) { sub_heap = HEAP_ART_BOOT; } else { sub_heap = HEAP_ART_APP; @@ -309,9 +312,15 @@ static void load_maps(int pid, stats_t* stats, bool* foundSwapPss) which_heap = HEAP_GL_DEV; } else if (base::StartsWith(name, "/dev/ashmem/CursorWindow")) { which_heap = HEAP_CURSOR; + } else if (base::StartsWith(name, "/dev/ashmem/jit-zygote-cache")) { + which_heap = HEAP_DALVIK_OTHER; + sub_heap = HEAP_DALVIK_OTHER_ZYGOTE_CODE_CACHE; } else if (base::StartsWith(name, "/dev/ashmem")) { which_heap = HEAP_ASHMEM; } + } else if (base::StartsWith(name, "/memfd:jit-cache")) { + which_heap = HEAP_DALVIK_OTHER; + sub_heap = HEAP_DALVIK_OTHER_APP_CODE_CACHE; } else if (base::StartsWith(name, "[anon:")) { which_heap = HEAP_UNKNOWN; if (base::StartsWith(name, "[anon:dalvik-")) { @@ -339,7 +348,7 @@ static void load_maps(int pid, stats_t* stats, bool* foundSwapPss) sub_heap = HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE; } else if (base::StartsWith(name, "[anon:dalvik-jit-code-cache") || base::StartsWith(name, "[anon:dalvik-data-code-cache")) { - sub_heap = HEAP_DALVIK_OTHER_CODE_CACHE; + sub_heap = HEAP_DALVIK_OTHER_APP_CODE_CACHE; } else if (base::StartsWith(name, "[anon:dalvik-CompilerMetadata")) { sub_heap = HEAP_DALVIK_OTHER_COMPILER_METADATA; } else { diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 058afd3b4d68..8be2438b4f2f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -2859,7 +2859,21 @@ final class ActivityManagerShellCommand extends ShellCommand { return 0; } - private int runCompat(PrintWriter pw) { + private void killPackage(String packageName, PrintWriter pw) throws RemoteException { + int uid = mPm.getPackageUid(packageName, 0, mUserId); + if (uid < 0) { + // uid is negative if the package wasn't found. + pw.println("Didn't find package " + packageName + " on device."); + } else { + pw.println("Killing package " + packageName + " (UID " + uid + ")."); + final long origId = Binder.clearCallingIdentity(); + mInterface.killUid(UserHandle.getAppId(uid), + UserHandle.USER_ALL, "killPackage"); + Binder.restoreCallingIdentity(origId); + } + } + + private int runCompat(PrintWriter pw) throws RemoteException { final CompatConfig config = CompatConfig.get(); String toggleValue = getNextArgRequired(); long changeId; @@ -2873,13 +2887,14 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println("Unknown or invalid change: '" + changeIdString + "'."); } String packageName = getNextArgRequired(); - switch(toggleValue) { + switch (toggleValue) { case "enable": if (!config.addOverride(changeId, packageName, true)) { pw.println("Warning! Change " + changeId + " is not known yet. Enabling it" + " could have no effect."); } pw.println("Enabled change " + changeId + " for " + packageName + "."); + killPackage(packageName, pw); return 0; case "disable": if (!config.addOverride(changeId, packageName, false)) { @@ -2887,11 +2902,13 @@ final class ActivityManagerShellCommand extends ShellCommand { + " could have no effect."); } pw.println("Disabled change " + changeId + " for " + packageName + "."); + killPackage(packageName, pw); return 0; case "reset": if (config.removeOverride(changeId, packageName)) { pw.println("Reset change " + changeId + " for " + packageName + " to default value."); + killPackage(packageName, pw); } else { pw.println("No override exists for changeId " + changeId + "."); } @@ -3210,6 +3227,7 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println(" Write all pending state to storage."); pw.println(" compat enable|disable|reset <CHANGE_ID|CHANGE_NAME> <PACKAGE_NAME>"); pw.println(" Toggles a change either by id or by name for <PACKAGE_NAME>."); + pw.println(" It kills <PACKAGE_NAME> (to allow the toggle to take effect)."); pw.println(); Intent.printIntentArgsHelp(pw, ""); } diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index 919141c13622..6ee64f348a55 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -386,6 +386,8 @@ public class ActivityStartController { throw new IllegalArgumentException("File descriptors passed in Intent"); } + // Get the flag earlier because the intent may be modified in resolveActivity below. + final boolean componentSpecified = intent.getComponent() != null; // Don't modify the client's object! intent = new Intent(intent); @@ -409,7 +411,6 @@ public class ActivityStartController { .setCaller(caller) .setResolvedType(resolvedTypes[i]) .setActivityInfo(aInfo) - .setResultTo(resultTo) .setRequestCode(-1) .setCallingPid(callingPid) .setCallingUid(callingUid) @@ -417,7 +418,7 @@ public class ActivityStartController { .setRealCallingPid(realCallingPid) .setRealCallingUid(realCallingUid) .setActivityOptions(checkedOptions) - .setComponentSpecified(intent.getComponent() != null) + .setComponentSpecified(componentSpecified) // Top activity decides on animation being run, so we allow only for the // top one as otherwise an activity below might consume it. @@ -430,7 +431,8 @@ public class ActivityStartController { // Lock the loop to ensure the activities launched in a sequence. synchronized (mService.mGlobalLock) { for (int i = 0; i < starters.length; i++) { - final int startResult = starters[i].setOutActivity(outActivity).execute(); + final int startResult = starters[i].setResultTo(resultTo) + .setOutActivity(outActivity).execute(); if (startResult < START_SUCCESS) { // Abort by error result and recycle unused starters. for (int j = i + 1; j < starters.length; j++) { diff --git a/services/core/java/com/android/server/wm/InsetsControlTarget.java b/services/core/java/com/android/server/wm/InsetsControlTarget.java index 3db6dcf07abf..b7184a5e83d5 100644 --- a/services/core/java/com/android/server/wm/InsetsControlTarget.java +++ b/services/core/java/com/android/server/wm/InsetsControlTarget.java @@ -16,9 +16,21 @@ package com.android.server.wm; +import android.inputmethodservice.InputMethodService; +import android.view.WindowInsets.Type.InsetType; + /** * Generalization of an object that can control insets state. */ interface InsetsControlTarget { void notifyInsetsControlChanged(); + + /** + * Instructs the control target to show inset sources. + * + * @param types to specify which types of insets source window should be shown. + * @param fromIme {@code true} if IME show request originated from {@link InputMethodService}. + */ + default void showInsets(@InsetType int types, boolean fromIme) { + } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index d459f14564d0..569d248d8efb 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -197,6 +197,7 @@ import android.view.SurfaceSession; import android.view.View; import android.view.ViewTreeObserver; import android.view.WindowInfo; +import android.view.WindowInsets.Type.InsetType; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; @@ -3365,6 +3366,15 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } + @Override + public void showInsets(@InsetType int types, boolean fromIme) { + try { + mClient.showInsets(types, fromIme); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to deliver showInsets", e); + } + } + Rect getBackdropFrame(Rect frame) { // When the task is docked, we send fullscreen sized backDropFrame as soon as resizing // start even if we haven't received the relayout window, so that the client requests diff --git a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java index a7586810a824..09e5027c1faa 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java @@ -111,4 +111,8 @@ public class TestIWindow extends IWindow.Stub { @Override public void dispatchPointerCaptureChanged(boolean hasCapture) { } + + @Override + public void showInsets(int types, boolean fromIme) throws RemoteException { + } } |