Loading cmds/statsd/src/atoms.proto +5 −0 Original line number Diff line number Diff line Loading @@ -940,6 +940,11 @@ message AppStartChanged { // Empty if not set. optional string launch_token = 13; // The compiler filter used when when the package was optimized. optional string package_optimization_compilation_filter = 14; // The reason why the package was optimized. optional string package_optimization_compilation_reason = 15; } message AppStartCancelChanged { Loading core/java/android/content/pm/dex/ArtManagerInternal.java 0 → 100644 +34 −0 Original line number Diff line number Diff line /** * Copyright 2018 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 android.content.pm.dex; import android.content.pm.ApplicationInfo; /** * Art manager local system service interface. * * @hide Only for use within the system server. */ public abstract class ArtManagerInternal { /** * Return optimization information about the application {@code info} when * in executes using the specified {@code abi}. */ public abstract PackageOptimizationInfo getPackageOptimizationInfo( ApplicationInfo info, String abi); } core/java/android/content/pm/dex/PackageOptimizationInfo.java 0 → 100644 +47 −0 Original line number Diff line number Diff line /** * Copyright 2018 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 android.content.pm.dex; /** * Encapsulates information about the optimizations performed on a package. * * @hide */ public class PackageOptimizationInfo { private final String mCompilationFilter; private final String mCompilationReason; public PackageOptimizationInfo(String compilerFilter, String compilationReason) { this.mCompilationReason = compilationReason; this.mCompilationFilter = compilerFilter; } public String getCompilationReason() { return mCompilationReason; } public String getCompilationFilter() { return mCompilationFilter; } /** * Create a default optimization info object for the case when we have no information. */ public static PackageOptimizationInfo createWithNoInfo() { return new PackageOptimizationInfo("no-info", "no-info"); } } proto/src/metrics_constants.proto +11 −0 Original line number Diff line number Diff line Loading @@ -5278,6 +5278,7 @@ message MetricsEvent { // OS: P FIELD_QS_MODE = 1311; // OPEN: Settings->Developer Options->Default USB // CATEGORY: SETTINGS // OS: P Loading Loading @@ -5317,6 +5318,16 @@ message MetricsEvent { // OS: P FIELD_LINKIFY_CALL_ID = 1319; // FIELD: The compiler filter used when when optimizing the package. // Logged together with app transition events. // OS: P PACKAGE_OPTIMIZATION_COMPILATION_FILTER = 1320; // FIELD: The reason for optimizing the package. // Logged together with app transition events. // OS: P PACKAGE_OPTIMIZATION_COMPILATION_REASON = 1321; // ---- End P Constants, all P constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS Loading services/core/java/com/android/server/am/ActivityMetricsLogger.java +126 −46 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TR import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CLASS_NAME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_INSTANT_APP_LAUNCH_TOKEN; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_REASON; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_FILTER; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_HOT_LAUNCH; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE; Loading @@ -35,6 +37,9 @@ import static com.android.server.am.MemoryStatUtil.MemoryStat; import static com.android.server.am.MemoryStatUtil.readMemoryStatFromMemcg; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.dex.ArtManagerInternal; import android.content.pm.dex.PackageOptimizationInfo; import android.metrics.LogMaker; import android.os.Handler; import android.os.Looper; Loading @@ -47,6 +52,7 @@ import android.util.StatsLog; import com.android.internal.logging.MetricsLogger; import com.android.internal.os.SomeArgs; import com.android.server.LocalServices; import java.util.ArrayList; Loading @@ -68,7 +74,8 @@ class ActivityMetricsLogger { private static final long INVALID_START_TIME = -1; private static final int MSG_CHECK_VISIBILITY = 0; private static final int MSG_LOG_APP_START_MEMORY_STATE_CAPTURE = 1; private static final int MSG_LOG_APP_TRANSITION = 1; private static final int MSG_LOG_APP_START_MEMORY_STATE_CAPTURE = 2; // Preallocated strings we are sending to tron, so we don't have to allocate a new one every // time we log. Loading @@ -93,6 +100,9 @@ class ActivityMetricsLogger { private final SparseArray<WindowingModeTransitionInfo> mLastWindowingModeTransitionInfo = new SparseArray<>(); private final H mHandler; private ArtManagerInternal mArtManagerInternal; private final class H extends Handler { public H(Looper looper) { Loading @@ -106,12 +116,16 @@ class ActivityMetricsLogger { final SomeArgs args = (SomeArgs) msg.obj; checkVisibility((TaskRecord) args.arg1, (ActivityRecord) args.arg2); break; case MSG_LOG_APP_TRANSITION: logAppTransition(msg.arg1, msg.arg2, (WindowingModeTransitionInfoSnapshot) msg.obj); break; case MSG_LOG_APP_START_MEMORY_STATE_CAPTURE: logAppStartMemoryStateCapture((WindowingModeTransitionInfo) msg.obj); break; } } }; } private final class WindowingModeTransitionInfo { private ActivityRecord launchedActivity; Loading @@ -125,6 +139,36 @@ class ActivityMetricsLogger { private boolean loggedStartingWindowDrawn; } private final class WindowingModeTransitionInfoSnapshot { final private ApplicationInfo applicationInfo; final private String packageName; final private String launchedActivityName; final private String launchedActivityLaunchedFromPackage; final private String launchedActivityLaunchToken; final private String launchedActivityAppRecordRequiredAbi; final private int reason; final private int startingWindowDelayMs; final private int bindApplicationDelayMs; final private int windowsDrawnDelayMs; final private int type; private WindowingModeTransitionInfoSnapshot(WindowingModeTransitionInfo info) { applicationInfo = info.launchedActivity.appInfo; packageName = info.launchedActivity.packageName; launchedActivityName = info.launchedActivity.info.name; launchedActivityLaunchedFromPackage = info.launchedActivity.launchedFromPackage; launchedActivityLaunchToken = info.launchedActivity.info.launchToken; launchedActivityAppRecordRequiredAbi = info.launchedActivity.app == null ? null : info.launchedActivity.app.requiredAbi; reason = info.reason; startingWindowDelayMs = info.startingWindowDelayMs; bindApplicationDelayMs = info.bindApplicationDelayMs; windowsDrawnDelayMs = info.windowsDrawnDelayMs; type = getTransitionType(info); } } ActivityMetricsLogger(ActivityStackSupervisor supervisor, Context context, Looper looper) { mLastLogTimeSecs = SystemClock.elapsedRealtime() / 1000; mSupervisor = supervisor; Loading Loading @@ -456,24 +500,39 @@ class ActivityMetricsLogger { if (type == -1) { return; } // Take a snapshot of the transition info before sending it to the handler for logging. // This will avoid any races with other operations that modify the ActivityRecord. final WindowingModeTransitionInfoSnapshot infoSnapshot = new WindowingModeTransitionInfoSnapshot(info); mHandler.obtainMessage(MSG_LOG_APP_TRANSITION, mCurrentTransitionDeviceUptime, mCurrentTransitionDelayMs, infoSnapshot).sendToTarget(); info.launchedActivity.info.launchToken = null; mHandler.obtainMessage(MSG_LOG_APP_START_MEMORY_STATE_CAPTURE, info).sendToTarget(); } } // This gets called on the handler without holding the activity manager lock. private void logAppTransition(int currentTransitionDeviceUptime, int currentTransitionDelayMs, WindowingModeTransitionInfoSnapshot info) { final LogMaker builder = new LogMaker(APP_TRANSITION); builder.setPackageName(info.launchedActivity.packageName); builder.setType(type); builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivity.info.name); final boolean isInstantApp = info.launchedActivity.info.applicationInfo.isInstantApp(); if (info.launchedActivity.launchedFromPackage != null) { builder.setPackageName(info.packageName); builder.setType(info.type); builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivityName); final boolean isInstantApp = info.applicationInfo.isInstantApp(); if (info.launchedActivityLaunchedFromPackage != null) { builder.addTaggedData(APP_TRANSITION_CALLING_PACKAGE_NAME, info.launchedActivity.launchedFromPackage); info.launchedActivityLaunchedFromPackage); } String launchToken = info.launchedActivity.info.launchToken; String launchToken = info.launchedActivityLaunchToken; if (launchToken != null) { builder.addTaggedData(FIELD_INSTANT_APP_LAUNCH_TOKEN, launchToken); info.launchedActivity.info.launchToken = null; } builder.addTaggedData(APP_TRANSITION_IS_EPHEMERAL, isInstantApp ? 1 : 0); builder.addTaggedData(APP_TRANSITION_DEVICE_UPTIME_SECONDS, mCurrentTransitionDeviceUptime); builder.addTaggedData(APP_TRANSITION_DELAY_MS, mCurrentTransitionDelayMs); currentTransitionDeviceUptime); builder.addTaggedData(APP_TRANSITION_DELAY_MS, currentTransitionDelayMs); builder.setSubtype(info.reason); if (info.startingWindowDelayMs != -1) { builder.addTaggedData(APP_TRANSITION_STARTING_WINDOW_DELAY_MS, Loading @@ -484,24 +543,35 @@ class ActivityMetricsLogger { info.bindApplicationDelayMs); } builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs); final ArtManagerInternal artManagerInternal = getArtManagerInternal(); final PackageOptimizationInfo packageOptimizationInfo = (artManagerInternal == null) || (info.launchedActivityAppRecordRequiredAbi == null) ? PackageOptimizationInfo.createWithNoInfo() : artManagerInternal.getPackageOptimizationInfo( info.applicationInfo, info.launchedActivityAppRecordRequiredAbi); builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_REASON, packageOptimizationInfo.getCompilationReason()); builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_FILTER, packageOptimizationInfo.getCompilationFilter()); mMetricsLogger.write(builder); StatsLog.write( StatsLog.APP_START_CHANGED, info.launchedActivity.appInfo.uid, info.launchedActivity.packageName, convertAppStartTransitionType(type), info.launchedActivity.info.name, info.launchedActivity.launchedFromPackage, info.applicationInfo.uid, info.packageName, convertAppStartTransitionType(info.type), info.launchedActivityName, info.launchedActivityLaunchedFromPackage, isInstantApp, mCurrentTransitionDeviceUptime * 1000, currentTransitionDeviceUptime * 1000, info.reason, mCurrentTransitionDelayMs, currentTransitionDelayMs, info.startingWindowDelayMs, info.bindApplicationDelayMs, info.windowsDrawnDelayMs, launchToken); mHandler.obtainMessage(MSG_LOG_APP_START_MEMORY_STATE_CAPTURE, info).sendToTarget(); } launchToken, packageOptimizationInfo.getCompilationReason(), packageOptimizationInfo.getCompilationFilter()); } private int convertAppStartTransitionType(int tronType) { Loading Loading @@ -592,4 +662,14 @@ class ActivityMetricsLogger { launchedActivity.appInfo.uid) : null; } private ArtManagerInternal getArtManagerInternal() { if (mArtManagerInternal == null) { // Note that this may be null. // ArtManagerInternal is registered during PackageManagerService // initialization which happens after ActivityManagerService. mArtManagerInternal = LocalServices.getService(ArtManagerInternal.class); } return mArtManagerInternal; } } Loading
cmds/statsd/src/atoms.proto +5 −0 Original line number Diff line number Diff line Loading @@ -940,6 +940,11 @@ message AppStartChanged { // Empty if not set. optional string launch_token = 13; // The compiler filter used when when the package was optimized. optional string package_optimization_compilation_filter = 14; // The reason why the package was optimized. optional string package_optimization_compilation_reason = 15; } message AppStartCancelChanged { Loading
core/java/android/content/pm/dex/ArtManagerInternal.java 0 → 100644 +34 −0 Original line number Diff line number Diff line /** * Copyright 2018 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 android.content.pm.dex; import android.content.pm.ApplicationInfo; /** * Art manager local system service interface. * * @hide Only for use within the system server. */ public abstract class ArtManagerInternal { /** * Return optimization information about the application {@code info} when * in executes using the specified {@code abi}. */ public abstract PackageOptimizationInfo getPackageOptimizationInfo( ApplicationInfo info, String abi); }
core/java/android/content/pm/dex/PackageOptimizationInfo.java 0 → 100644 +47 −0 Original line number Diff line number Diff line /** * Copyright 2018 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 android.content.pm.dex; /** * Encapsulates information about the optimizations performed on a package. * * @hide */ public class PackageOptimizationInfo { private final String mCompilationFilter; private final String mCompilationReason; public PackageOptimizationInfo(String compilerFilter, String compilationReason) { this.mCompilationReason = compilationReason; this.mCompilationFilter = compilerFilter; } public String getCompilationReason() { return mCompilationReason; } public String getCompilationFilter() { return mCompilationFilter; } /** * Create a default optimization info object for the case when we have no information. */ public static PackageOptimizationInfo createWithNoInfo() { return new PackageOptimizationInfo("no-info", "no-info"); } }
proto/src/metrics_constants.proto +11 −0 Original line number Diff line number Diff line Loading @@ -5278,6 +5278,7 @@ message MetricsEvent { // OS: P FIELD_QS_MODE = 1311; // OPEN: Settings->Developer Options->Default USB // CATEGORY: SETTINGS // OS: P Loading Loading @@ -5317,6 +5318,16 @@ message MetricsEvent { // OS: P FIELD_LINKIFY_CALL_ID = 1319; // FIELD: The compiler filter used when when optimizing the package. // Logged together with app transition events. // OS: P PACKAGE_OPTIMIZATION_COMPILATION_FILTER = 1320; // FIELD: The reason for optimizing the package. // Logged together with app transition events. // OS: P PACKAGE_OPTIMIZATION_COMPILATION_REASON = 1321; // ---- End P Constants, all P constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS Loading
services/core/java/com/android/server/am/ActivityMetricsLogger.java +126 −46 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TR import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CLASS_NAME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_INSTANT_APP_LAUNCH_TOKEN; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_REASON; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_FILTER; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_HOT_LAUNCH; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE; Loading @@ -35,6 +37,9 @@ import static com.android.server.am.MemoryStatUtil.MemoryStat; import static com.android.server.am.MemoryStatUtil.readMemoryStatFromMemcg; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.dex.ArtManagerInternal; import android.content.pm.dex.PackageOptimizationInfo; import android.metrics.LogMaker; import android.os.Handler; import android.os.Looper; Loading @@ -47,6 +52,7 @@ import android.util.StatsLog; import com.android.internal.logging.MetricsLogger; import com.android.internal.os.SomeArgs; import com.android.server.LocalServices; import java.util.ArrayList; Loading @@ -68,7 +74,8 @@ class ActivityMetricsLogger { private static final long INVALID_START_TIME = -1; private static final int MSG_CHECK_VISIBILITY = 0; private static final int MSG_LOG_APP_START_MEMORY_STATE_CAPTURE = 1; private static final int MSG_LOG_APP_TRANSITION = 1; private static final int MSG_LOG_APP_START_MEMORY_STATE_CAPTURE = 2; // Preallocated strings we are sending to tron, so we don't have to allocate a new one every // time we log. Loading @@ -93,6 +100,9 @@ class ActivityMetricsLogger { private final SparseArray<WindowingModeTransitionInfo> mLastWindowingModeTransitionInfo = new SparseArray<>(); private final H mHandler; private ArtManagerInternal mArtManagerInternal; private final class H extends Handler { public H(Looper looper) { Loading @@ -106,12 +116,16 @@ class ActivityMetricsLogger { final SomeArgs args = (SomeArgs) msg.obj; checkVisibility((TaskRecord) args.arg1, (ActivityRecord) args.arg2); break; case MSG_LOG_APP_TRANSITION: logAppTransition(msg.arg1, msg.arg2, (WindowingModeTransitionInfoSnapshot) msg.obj); break; case MSG_LOG_APP_START_MEMORY_STATE_CAPTURE: logAppStartMemoryStateCapture((WindowingModeTransitionInfo) msg.obj); break; } } }; } private final class WindowingModeTransitionInfo { private ActivityRecord launchedActivity; Loading @@ -125,6 +139,36 @@ class ActivityMetricsLogger { private boolean loggedStartingWindowDrawn; } private final class WindowingModeTransitionInfoSnapshot { final private ApplicationInfo applicationInfo; final private String packageName; final private String launchedActivityName; final private String launchedActivityLaunchedFromPackage; final private String launchedActivityLaunchToken; final private String launchedActivityAppRecordRequiredAbi; final private int reason; final private int startingWindowDelayMs; final private int bindApplicationDelayMs; final private int windowsDrawnDelayMs; final private int type; private WindowingModeTransitionInfoSnapshot(WindowingModeTransitionInfo info) { applicationInfo = info.launchedActivity.appInfo; packageName = info.launchedActivity.packageName; launchedActivityName = info.launchedActivity.info.name; launchedActivityLaunchedFromPackage = info.launchedActivity.launchedFromPackage; launchedActivityLaunchToken = info.launchedActivity.info.launchToken; launchedActivityAppRecordRequiredAbi = info.launchedActivity.app == null ? null : info.launchedActivity.app.requiredAbi; reason = info.reason; startingWindowDelayMs = info.startingWindowDelayMs; bindApplicationDelayMs = info.bindApplicationDelayMs; windowsDrawnDelayMs = info.windowsDrawnDelayMs; type = getTransitionType(info); } } ActivityMetricsLogger(ActivityStackSupervisor supervisor, Context context, Looper looper) { mLastLogTimeSecs = SystemClock.elapsedRealtime() / 1000; mSupervisor = supervisor; Loading Loading @@ -456,24 +500,39 @@ class ActivityMetricsLogger { if (type == -1) { return; } // Take a snapshot of the transition info before sending it to the handler for logging. // This will avoid any races with other operations that modify the ActivityRecord. final WindowingModeTransitionInfoSnapshot infoSnapshot = new WindowingModeTransitionInfoSnapshot(info); mHandler.obtainMessage(MSG_LOG_APP_TRANSITION, mCurrentTransitionDeviceUptime, mCurrentTransitionDelayMs, infoSnapshot).sendToTarget(); info.launchedActivity.info.launchToken = null; mHandler.obtainMessage(MSG_LOG_APP_START_MEMORY_STATE_CAPTURE, info).sendToTarget(); } } // This gets called on the handler without holding the activity manager lock. private void logAppTransition(int currentTransitionDeviceUptime, int currentTransitionDelayMs, WindowingModeTransitionInfoSnapshot info) { final LogMaker builder = new LogMaker(APP_TRANSITION); builder.setPackageName(info.launchedActivity.packageName); builder.setType(type); builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivity.info.name); final boolean isInstantApp = info.launchedActivity.info.applicationInfo.isInstantApp(); if (info.launchedActivity.launchedFromPackage != null) { builder.setPackageName(info.packageName); builder.setType(info.type); builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivityName); final boolean isInstantApp = info.applicationInfo.isInstantApp(); if (info.launchedActivityLaunchedFromPackage != null) { builder.addTaggedData(APP_TRANSITION_CALLING_PACKAGE_NAME, info.launchedActivity.launchedFromPackage); info.launchedActivityLaunchedFromPackage); } String launchToken = info.launchedActivity.info.launchToken; String launchToken = info.launchedActivityLaunchToken; if (launchToken != null) { builder.addTaggedData(FIELD_INSTANT_APP_LAUNCH_TOKEN, launchToken); info.launchedActivity.info.launchToken = null; } builder.addTaggedData(APP_TRANSITION_IS_EPHEMERAL, isInstantApp ? 1 : 0); builder.addTaggedData(APP_TRANSITION_DEVICE_UPTIME_SECONDS, mCurrentTransitionDeviceUptime); builder.addTaggedData(APP_TRANSITION_DELAY_MS, mCurrentTransitionDelayMs); currentTransitionDeviceUptime); builder.addTaggedData(APP_TRANSITION_DELAY_MS, currentTransitionDelayMs); builder.setSubtype(info.reason); if (info.startingWindowDelayMs != -1) { builder.addTaggedData(APP_TRANSITION_STARTING_WINDOW_DELAY_MS, Loading @@ -484,24 +543,35 @@ class ActivityMetricsLogger { info.bindApplicationDelayMs); } builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs); final ArtManagerInternal artManagerInternal = getArtManagerInternal(); final PackageOptimizationInfo packageOptimizationInfo = (artManagerInternal == null) || (info.launchedActivityAppRecordRequiredAbi == null) ? PackageOptimizationInfo.createWithNoInfo() : artManagerInternal.getPackageOptimizationInfo( info.applicationInfo, info.launchedActivityAppRecordRequiredAbi); builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_REASON, packageOptimizationInfo.getCompilationReason()); builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_FILTER, packageOptimizationInfo.getCompilationFilter()); mMetricsLogger.write(builder); StatsLog.write( StatsLog.APP_START_CHANGED, info.launchedActivity.appInfo.uid, info.launchedActivity.packageName, convertAppStartTransitionType(type), info.launchedActivity.info.name, info.launchedActivity.launchedFromPackage, info.applicationInfo.uid, info.packageName, convertAppStartTransitionType(info.type), info.launchedActivityName, info.launchedActivityLaunchedFromPackage, isInstantApp, mCurrentTransitionDeviceUptime * 1000, currentTransitionDeviceUptime * 1000, info.reason, mCurrentTransitionDelayMs, currentTransitionDelayMs, info.startingWindowDelayMs, info.bindApplicationDelayMs, info.windowsDrawnDelayMs, launchToken); mHandler.obtainMessage(MSG_LOG_APP_START_MEMORY_STATE_CAPTURE, info).sendToTarget(); } launchToken, packageOptimizationInfo.getCompilationReason(), packageOptimizationInfo.getCompilationFilter()); } private int convertAppStartTransitionType(int tronType) { Loading Loading @@ -592,4 +662,14 @@ class ActivityMetricsLogger { launchedActivity.appInfo.uid) : null; } private ArtManagerInternal getArtManagerInternal() { if (mArtManagerInternal == null) { // Note that this may be null. // ArtManagerInternal is registered during PackageManagerService // initialization which happens after ActivityManagerService. mArtManagerInternal = LocalServices.getService(ArtManagerInternal.class); } return mArtManagerInternal; } }