Loading cmds/statsd/src/atoms.proto +5 −0 Original line number Diff line number Diff line Loading @@ -939,6 +939,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 +10 −0 Original line number Diff line number Diff line Loading @@ -5278,6 +5278,16 @@ message MetricsEvent { // OS: P FIELD_QS_MODE = 1311; // FIELD: The compiler filter used when when optimizing the package. // Logged together with app transition events. // OS: P PACKAGE_OPTIMIZATION_COMPILATION_FILTER = 1312; // FIELD: The reason for optimizing the package. // Logged together with app transition events. // OS: P PACKAGE_OPTIMIZATION_COMPILATION_REASON = 1313; // ---- 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 +88 −49 Original line number Diff line number Diff line Loading @@ -24,6 +24,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 @@ -36,6 +38,8 @@ import static com.android.server.am.MemoryStatUtil.MemoryStat; import static com.android.server.am.MemoryStatUtil.readMemoryStatFromMemcg; import android.content.Context; 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 @@ -48,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 @@ -69,7 +74,7 @@ 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; // Preallocated strings we are sending to tron, so we don't have to allocate a new one every // time we log. Loading @@ -92,6 +97,9 @@ class ActivityMetricsLogger { private final SparseArray<StackTransitionInfo> mStackTransitionInfo = new SparseArray<>(); private final SparseArray<StackTransitionInfo> mLastStackTransitionInfo = new SparseArray<>(); private final H mHandler; private ArtManagerInternal mArtManagerInternal; private final class H extends Handler { public H(Looper looper) { Loading @@ -105,12 +113,12 @@ class ActivityMetricsLogger { final SomeArgs args = (SomeArgs) msg.obj; checkVisibility((TaskRecord) args.arg1, (ActivityRecord) args.arg2); break; case MSG_LOG_APP_START_MEMORY_STATE_CAPTURE: logAppStartMemoryStateCapture((StackTransitionInfo) msg.obj); case MSG_LOG_APP_TRANSITION: logAppTransition(msg.arg1, msg.arg2, (StackTransitionInfo) msg.obj); break; } } }; } private final class StackTransitionInfo { private ActivityRecord launchedActivity; Loading Loading @@ -451,6 +459,15 @@ class ActivityMetricsLogger { if (type == -1) { return; } mHandler.obtainMessage(MSG_LOG_APP_TRANSITION, mCurrentTransitionDeviceUptime, mCurrentTransitionDelayMs, info).sendToTarget(); } } // This gets called on the handler without holding the activity manager lock. private void logAppTransition(int currentTransitionDeviceUptime, int currentTransitionDelayMs, StackTransitionInfo info) { final int type = getTransitionType(info); final LogMaker builder = new LogMaker(APP_TRANSITION); builder.setPackageName(info.launchedActivity.packageName); builder.setType(type); Loading @@ -467,8 +484,8 @@ class ActivityMetricsLogger { } 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 @@ -479,6 +496,16 @@ class ActivityMetricsLogger { info.bindApplicationDelayMs); } builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs); final ArtManagerInternal artManagerInternal = getArtManagerInternal(); final PackageOptimizationInfo packageOptimizationInfo = artManagerInternal == null ? PackageOptimizationInfo.createWithNoInfo() : artManagerInternal.getPackageOptimizationInfo( info.launchedActivity.info.applicationInfo, info.launchedActivity.app.requiredAbi); 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, Loading @@ -488,15 +515,17 @@ class ActivityMetricsLogger { info.launchedActivity.info.name, info.launchedActivity.launchedFromPackage, 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()); logAppStartMemoryStateCapture(info); } private int convertAppStartTransitionType(int tronType) { Loading Loading @@ -586,4 +615,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 @@ -939,6 +939,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 +10 −0 Original line number Diff line number Diff line Loading @@ -5278,6 +5278,16 @@ message MetricsEvent { // OS: P FIELD_QS_MODE = 1311; // FIELD: The compiler filter used when when optimizing the package. // Logged together with app transition events. // OS: P PACKAGE_OPTIMIZATION_COMPILATION_FILTER = 1312; // FIELD: The reason for optimizing the package. // Logged together with app transition events. // OS: P PACKAGE_OPTIMIZATION_COMPILATION_REASON = 1313; // ---- 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 +88 −49 Original line number Diff line number Diff line Loading @@ -24,6 +24,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 @@ -36,6 +38,8 @@ import static com.android.server.am.MemoryStatUtil.MemoryStat; import static com.android.server.am.MemoryStatUtil.readMemoryStatFromMemcg; import android.content.Context; 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 @@ -48,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 @@ -69,7 +74,7 @@ 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; // Preallocated strings we are sending to tron, so we don't have to allocate a new one every // time we log. Loading @@ -92,6 +97,9 @@ class ActivityMetricsLogger { private final SparseArray<StackTransitionInfo> mStackTransitionInfo = new SparseArray<>(); private final SparseArray<StackTransitionInfo> mLastStackTransitionInfo = new SparseArray<>(); private final H mHandler; private ArtManagerInternal mArtManagerInternal; private final class H extends Handler { public H(Looper looper) { Loading @@ -105,12 +113,12 @@ class ActivityMetricsLogger { final SomeArgs args = (SomeArgs) msg.obj; checkVisibility((TaskRecord) args.arg1, (ActivityRecord) args.arg2); break; case MSG_LOG_APP_START_MEMORY_STATE_CAPTURE: logAppStartMemoryStateCapture((StackTransitionInfo) msg.obj); case MSG_LOG_APP_TRANSITION: logAppTransition(msg.arg1, msg.arg2, (StackTransitionInfo) msg.obj); break; } } }; } private final class StackTransitionInfo { private ActivityRecord launchedActivity; Loading Loading @@ -451,6 +459,15 @@ class ActivityMetricsLogger { if (type == -1) { return; } mHandler.obtainMessage(MSG_LOG_APP_TRANSITION, mCurrentTransitionDeviceUptime, mCurrentTransitionDelayMs, info).sendToTarget(); } } // This gets called on the handler without holding the activity manager lock. private void logAppTransition(int currentTransitionDeviceUptime, int currentTransitionDelayMs, StackTransitionInfo info) { final int type = getTransitionType(info); final LogMaker builder = new LogMaker(APP_TRANSITION); builder.setPackageName(info.launchedActivity.packageName); builder.setType(type); Loading @@ -467,8 +484,8 @@ class ActivityMetricsLogger { } 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 @@ -479,6 +496,16 @@ class ActivityMetricsLogger { info.bindApplicationDelayMs); } builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs); final ArtManagerInternal artManagerInternal = getArtManagerInternal(); final PackageOptimizationInfo packageOptimizationInfo = artManagerInternal == null ? PackageOptimizationInfo.createWithNoInfo() : artManagerInternal.getPackageOptimizationInfo( info.launchedActivity.info.applicationInfo, info.launchedActivity.app.requiredAbi); 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, Loading @@ -488,15 +515,17 @@ class ActivityMetricsLogger { info.launchedActivity.info.name, info.launchedActivity.launchedFromPackage, 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()); logAppStartMemoryStateCapture(info); } private int convertAppStartTransitionType(int tronType) { Loading Loading @@ -586,4 +615,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; } }