Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d68d75be authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Add logs for BroadcastDispatcher

Use SystemUIs internal buffer log.

Test: manual
Test: UserBroadcastDispatcherTest
Bug: 157165818
Change-Id: Iafd467f7e212b4975f0d8e563388187183dcd747
parent 50980050
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -28,12 +28,12 @@ import android.text.TextUtils
import android.util.SparseArray
import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.Dumpable
import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import java.io.FileDescriptor
import java.io.PrintWriter
import java.lang.IllegalStateException
import java.util.concurrent.Executor
import javax.inject.Inject
import javax.inject.Singleton
@@ -67,7 +67,8 @@ open class BroadcastDispatcher @Inject constructor (
    private val context: Context,
    @Main private val mainHandler: Handler,
    @Background private val bgLooper: Looper,
    dumpManager: DumpManager
    dumpManager: DumpManager,
    private val logger: BroadcastDispatcherLogger
) : Dumpable {

    // Only modify in BG thread
@@ -156,7 +157,7 @@ open class BroadcastDispatcher @Inject constructor (
    /**
     * Unregister receiver for a particular user.
     *
     * @param receiver The receiver to unregister. It will be unregistered for all users.
     * @param receiver The receiver to unregister.
     * @param user The user associated to the registered [receiver]. It can be [UserHandle.ALL].
     */
    open fun unregisterReceiverForUser(receiver: BroadcastReceiver, user: UserHandle) {
@@ -166,7 +167,7 @@ open class BroadcastDispatcher @Inject constructor (

    @VisibleForTesting
    protected open fun createUBRForUser(userId: Int) =
            UserBroadcastDispatcher(context, userId, bgLooper)
            UserBroadcastDispatcher(context, userId, bgLooper, logger)

    override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
        pw.println("Broadcast dispatcher:")
+14 −4
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.util.Log
import androidx.annotation.VisibleForTesting
import com.android.internal.util.Preconditions
import com.android.systemui.Dumpable
import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger
import java.io.FileDescriptor
import java.io.PrintWriter
import java.lang.IllegalArgumentException
@@ -54,7 +55,8 @@ private const val DEBUG = false
class UserBroadcastDispatcher(
    private val context: Context,
    private val userId: Int,
    private val bgLooper: Looper
    private val bgLooper: Looper,
    private val logger: BroadcastDispatcherLogger
) : BroadcastReceiver(), Dumpable {

    companion object {
@@ -109,10 +111,12 @@ class UserBroadcastDispatcher(
    }

    override fun onReceive(context: Context, intent: Intent) {
        val id = if (DEBUG) index.getAndIncrement() else 0
        val id = index.getAndIncrement()
        if (DEBUG) Log.w(TAG, "[$id] Received $intent")
        logger.logBroadcastReceived(id, userId, intent)
        bgHandler.post(
                HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult, id))
                HandleBroadcastRunnable(
                        actionsToReceivers, context, intent, pendingResult, id, logger))
    }

    /**
@@ -143,6 +147,7 @@ class UserBroadcastDispatcher(
                ArraySet()
            }.add(receiverData)
        }
        logger.logReceiverRegistered(userId, receiverData.receiver)
        if (changed) {
            createFilterAndRegisterReceiverBG()
        }
@@ -163,6 +168,7 @@ class UserBroadcastDispatcher(
                actionsToReceivers.remove(action)
            }
        }
        logger.logReceiverUnregistered(userId, receiver)
        if (changed) {
            createFilterAndRegisterReceiverBG()
        }
@@ -187,7 +193,8 @@ class UserBroadcastDispatcher(
        val context: Context,
        val intent: Intent,
        val pendingResult: PendingResult,
        val index: Int
        val index: Int,
        val logger: BroadcastDispatcherLogger
    ) : Runnable {
        override fun run() {
            if (DEBUG) Log.w(TAG, "[$index] Dispatching $intent")
@@ -199,6 +206,7 @@ class UserBroadcastDispatcher(
                        it.executor.execute {
                            if (DEBUG) Log.w(TAG,
                                    "[$index] Dispatching ${intent.action} to ${it.receiver}")
                            logger.logBroadcastDispatched(index, intent.action, it.receiver)
                            it.receiver.pendingResult = pendingResult
                            it.receiver.onReceive(context, intent)
                        }
@@ -215,6 +223,7 @@ class UserBroadcastDispatcher(
            if (registered.get()) {
                try {
                    context.unregisterReceiver(this@UserBroadcastDispatcher)
                    logger.logContextReceiverUnregistered(userId)
                } catch (e: IllegalArgumentException) {
                    Log.e(TAG, "Trying to unregister unregistered receiver for user $userId",
                            IllegalStateException(e))
@@ -230,6 +239,7 @@ class UserBroadcastDispatcher(
                        null,
                        bgHandler)
                registered.set(true)
                logger.logContextReceiverRegistered(userId, intentFilter)
            }
        }
    }
+117 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.systemui.broadcast.logging

import android.content.BroadcastReceiver
import android.content.Intent
import android.content.IntentFilter
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.LogLevel
import com.android.systemui.log.LogLevel.DEBUG
import com.android.systemui.log.LogLevel.INFO
import com.android.systemui.log.LogMessage
import com.android.systemui.log.dagger.BroadcastDispatcherLog
import javax.inject.Inject

private const val TAG = "BroadcastDispatcherLog"

class BroadcastDispatcherLogger @Inject constructor(
    @BroadcastDispatcherLog private val buffer: LogBuffer
) {

    fun logBroadcastReceived(broadcastId: Int, user: Int, intent: Intent) {
        val intentString = intent.toString()
        log(INFO, {
            int1 = broadcastId
            int2 = user
            str1 = intentString
        }, {
            "[$int1] Broadcast received for user $int2: $str1"
        })
    }

    fun logBroadcastDispatched(broadcastId: Int, action: String?, receiver: BroadcastReceiver) {
        val receiverString = receiver.toString()
        log(DEBUG, {
            int1 = broadcastId
            str1 = action
            str2 = receiverString
        }, {
            "Broadcast $int1 ($str1) dispatched to $str2"
        })
    }

    fun logReceiverRegistered(user: Int, receiver: BroadcastReceiver) {
        val receiverString = receiver.toString()
        log(INFO, {
            int1 = user
            str1 = receiverString
        }, {
            "Receiver $str1 registered for user $int1"
        })
    }

    fun logReceiverUnregistered(user: Int, receiver: BroadcastReceiver) {
        val receiverString = receiver.toString()
        log(INFO, {
            int1 = user
            str1 = receiverString
        }, {
            "Receiver $str1 unregistered for user $int1"
        })
    }

    fun logContextReceiverRegistered(user: Int, filter: IntentFilter) {
        val actions = filter.actionsIterator().asSequence()
                .joinToString(separator = ",", prefix = "Actions(", postfix = ")")
        val categories = if (filter.countCategories() != 0) {
            filter.categoriesIterator().asSequence()
                    .joinToString(separator = ",", prefix = "Categories(", postfix = ")")
        } else {
            ""
        }
        log(INFO, {
            int1 = user
            str1 = if (categories != "") {
                "${actions}\n$categories"
            } else {
                actions
            }
        }, {
            """
                Receiver registered with Context for user $int1.
                $str1
            """.trimIndent()
        })
    }

    fun logContextReceiverUnregistered(user: Int) {
        log(INFO, {
            int1 = user
        }, {
            "Receiver unregistered with Context for user $int1."
        })
    }

    private inline fun log(
        logLevel: LogLevel,
        initializer: LogMessage.() -> Unit,
        noinline printer: LogMessage.() -> String
    ) {
        buffer.log(TAG, logLevel, initializer, printer)
    }
}
 No newline at end of file
+33 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.systemui.log.dagger;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import com.android.systemui.log.LogBuffer;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;

import javax.inject.Qualifier;

/** A {@link LogBuffer} for BroadcastDispatcher-related messages. */
@Qualifier
@Documented
@Retention(RUNTIME)
public @interface BroadcastDispatcherLog {
}
+12 −0
Original line number Diff line number Diff line
@@ -97,6 +97,18 @@ public class LogModule {
        return buffer;
    }

    /** Provides a logging buffer for {@link com.android.systemui.broadcast.BroadcastDispatcher} */
    @Provides
    @Singleton
    @BroadcastDispatcherLog
    public static LogBuffer provideBroadcastDispatcherLogBuffer(
            LogcatEchoTracker bufferFilter,
            DumpManager dumpManager) {
        LogBuffer buffer = new LogBuffer("BroadcastDispatcherLog", 500, 10, bufferFilter);
        buffer.attach(dumpManager);
        return buffer;
    }

    /** Allows logging buffers to be tweaked via adb on debug builds but not on prod builds. */
    @Provides
    @Singleton
Loading