diff --git a/Android.bp b/Android.bp index 4e1c9d3d11..9d7aa73a8f 100644 --- a/Android.bp +++ b/Android.bp @@ -64,11 +64,74 @@ filegroup { filegroup { name: "launcher-quickstep-src", srcs: [ - "quickstep/src/**/*.java", "quickstep/src/**/*.kt", + "quickstep/src/**/*.java", + ":launcher-quickstep-processed-protolog-src", ], } +// Launcher ProtoLog support +filegroup { + name: "launcher-quickstep-unprocessed-protolog-src", + srcs: [ + "quickstep/src_protolog/**/*.java", + ], +} + +java_library { + name: "launcher-quickstep_protolog-groups", + srcs: [ + "quickstep/src_protolog/**/*.java", + ], + static_libs: [ + "protolog-group", + "androidx.annotation_annotation", + "com_android_launcher3_flags_lib", + ], +} + +genrule { + name: "launcher-quickstep-processed-protolog-src", + srcs: [ + ":protolog-impl", + ":launcher-quickstep-unprocessed-protolog-src", + ":launcher-quickstep_protolog-groups", + ], + tools: ["protologtool"], + cmd: "$(location protologtool) transform-protolog-calls " + + "--protolog-class com.android.internal.protolog.common.ProtoLog " + + "--loggroups-class com.android.quickstep.util.QuickstepProtoLogGroup " + + "--loggroups-jar $(location :launcher-quickstep_protolog-groups) " + + "--viewer-config-file-path /system_ext/etc/launcher.quickstep.protolog.pb " + + "--output-srcjar $(out) " + + "$(locations :launcher-quickstep-unprocessed-protolog-src)", + out: ["launcher.quickstep.protolog.srcjar"], +} + +genrule { + name: "gen-launcher.quickstep.protolog.pb", + srcs: [ + ":launcher-quickstep-unprocessed-protolog-src", + ":launcher-quickstep_protolog-groups", + ], + tools: ["protologtool"], + cmd: "$(location protologtool) generate-viewer-config " + + "--protolog-class com.android.internal.protolog.common.ProtoLog " + + "--loggroups-class com.android.quickstep.util.QuickstepProtoLogGroup " + + "--loggroups-jar $(location :launcher-quickstep_protolog-groups) " + + "--viewer-config-type proto " + + "--viewer-config $(out) " + + "$(locations :launcher-quickstep-unprocessed-protolog-src)", + out: ["launcher.quickstep.protolog.pb"], +} + +prebuilt_etc { + name: "launcher.quickstep.protolog.pb", + system_ext_specific: true, + src: ":gen-launcher.quickstep.protolog.pb", + filename_from_src: true, +} + // Source code for quickstep dagger filegroup { name: "launcher-quickstep-dagger", @@ -405,6 +468,7 @@ android_library { "SystemUISharedLib", "SettingsLibSettingsTheme", "dagger2", + "protolog-group", ], manifest: "quickstep/AndroidManifest.xml", min_sdk_version: "current", @@ -503,7 +567,10 @@ android_app { "Launcher2", "Launcher3", ], - required: ["privapp_whitelist_com.android.launcher3"], + required: [ + "privapp_whitelist_com.android.launcher3", + "launcher.quickstep.protolog.pb", + ], resource_dirs: ["quickstep/res"], diff --git a/proguard.flags b/proguard.flags index 31edd8d88c..da00c00b9b 100644 --- a/proguard.flags +++ b/proguard.flags @@ -57,3 +57,7 @@ -keep class com.android.quickstep.** { *; } + +-keep class com.android.internal.protolog.** { + *; +} diff --git a/quickstep/src/com/android/quickstep/QuickstepProcessInitializer.java b/quickstep/src/com/android/quickstep/QuickstepProcessInitializer.java index f4e68dce7b..334bead3e4 100644 --- a/quickstep/src/com/android/quickstep/QuickstepProcessInitializer.java +++ b/quickstep/src/com/android/quickstep/QuickstepProcessInitializer.java @@ -25,6 +25,7 @@ import android.view.ThreadedRenderer; import com.android.launcher3.BuildConfig; import com.android.launcher3.MainProcessInitializer; +import com.android.quickstep.util.QuickstepProtoLogGroup; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; @SuppressWarnings("unused") @@ -69,5 +70,7 @@ public class QuickstepProcessInitializer extends MainProcessInitializer { call.descriptor + " called on main thread under " + call.activeTrace + " stackTrace: " + call.stackTrace)); } + + QuickstepProtoLogGroup.initProtoLog(); } } diff --git a/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java b/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java new file mode 100644 index 0000000000..d0863f8f6b --- /dev/null +++ b/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2024 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 com.android.quickstep.util; + +import androidx.annotation.NonNull; + +import com.android.internal.protolog.ProtoLog; +import com.android.internal.protolog.common.IProtoLogGroup; + +import java.util.UUID; + +/** Enums used to interface with the ProtoLog API. */ +public enum QuickstepProtoLogGroup implements IProtoLogGroup { + + ACTIVE_GESTURE_LOG(true, true, false, "ActiveGestureLog"); + + private final boolean mEnabled; + private volatile boolean mLogToProto; + private volatile boolean mLogToLogcat; + private final @NonNull String mTag; + + public static void initProtoLog() { + ProtoLog.init(QuickstepProtoLogGroup.values()); + } + + /** + * @param enabled set to false to exclude all log statements for this group from + * compilation, + * they will not be available in runtime. + * @param logToProto enable binary logging for the group + * @param logToLogcat enable text logging for the group + * @param tag name of the source of the logged message + */ + QuickstepProtoLogGroup( + boolean enabled, boolean logToProto, boolean logToLogcat, @NonNull String tag) { + this.mEnabled = enabled; + this.mLogToProto = logToProto; + this.mLogToLogcat = logToLogcat; + this.mTag = tag; + } + + @Override + public boolean isEnabled() { + return mEnabled; + } + + @Override + public boolean isLogToProto() { + return mLogToProto; + } + + @Override + public boolean isLogToLogcat() { + return mLogToLogcat; + } + + @Override + public boolean isLogToAny() { + return mLogToLogcat || mLogToProto; + } + + @Override + public int getId() { + return Constants.LOG_START_ID + this.ordinal(); + } + + @Override + public @NonNull String getTag() { + return mTag; + } + + @Override + public void setLogToProto(boolean logToProto) { + this.mLogToProto = logToProto; + } + + @Override + public void setLogToLogcat(boolean logToLogcat) { + this.mLogToLogcat = logToLogcat; + } + + private static final class Constants { + + private static final int LOG_START_ID = + (int) (UUID.nameUUIDFromBytes(QuickstepProtoLogGroup.class.getName().getBytes()) + .getMostSignificantBits() % Integer.MAX_VALUE); + } +}