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

Commit 8418bef7 authored by Ioana Stefan's avatar Ioana Stefan
Browse files

Optimized workflow for IME tracing on InputMethodService side

Optimized the tracing logic for the IMS information. The
InputMethodService triggers a tracing dump through the new method
triggerServiceDump, exposed by the meTracing interface. This
change was done to be able to support custom dumps from clients
and custom dumps from InputMethodService.

This change only covers the IMS information. The IMMS
information will be dumped in next changes.

Bug: 154348613
Test: start IME tracing by calling "adb shell ime tracing start"
      end IME tracing by calling "adb shell ime tracing stop"
      pull trace using "adb pull /data/misc/wmtrace/ime_trace_service.pb ime_trace_service.pb"
Change-Id: Icda0f82d76fb7db5b2bd8d021069b1ff15a4e15b
parent ab100848
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.annotation.NonNull;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.proto.ProtoOutputStream;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.inputmethod.InputConnection;
@@ -195,15 +196,13 @@ public abstract class AbstractInputMethodService extends Service
    public abstract AbstractInputMethodSessionImpl onCreateInputMethodSessionInterface();

    /**
     * Dumps the internal state of IME to a protocol buffer output stream initialized using the
     * given {@link FileDescriptor}.
     * Dumps the internal state of IME to a protocol buffer output stream.
     *
     * @param fd The file descriptor to which proto dump should be written.
     * @param args The arguments passed to the dump method.
     * @param proto ProtoOutputStream to dump data to.
     * @hide
     */
    @SuppressWarnings("HiddenAbstractMethod")
    abstract void dumpProtoInternal(FileDescriptor fd, String[] args);
    public abstract void dumpProtoInternal(ProtoOutputStream proto);

    /**
     * Implement this to handle {@link android.os.Binder#dump Binder.dump()}
+2 −15
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package android.inputmethodservice;

import static android.util.imetracing.ImeTracing.PROTO_ARG;

import android.annotation.BinderThread;
import android.annotation.MainThread;
import android.annotation.Nullable;
@@ -157,20 +155,9 @@ class IInputMethodWrapper extends IInputMethod.Stub
                    return;
                }
                SomeArgs args = (SomeArgs)msg.obj;
                String[] dumpArgs = (String[]) args.arg3;
                boolean protoDumpRequested = false;
                for (String arg : dumpArgs) {
                    if (arg.equals(PROTO_ARG)) {
                        protoDumpRequested = true;
                        break;
                    }
                }
                try {
                    if (protoDumpRequested) {
                        target.dumpProtoInternal((FileDescriptor) args.arg1, dumpArgs);
                    } else {
                        target.dump((FileDescriptor) args.arg1, (PrintWriter) args.arg2, dumpArgs);
                    }
                    target.dump((FileDescriptor) args.arg1,
                            (PrintWriter) args.arg2, (String[]) args.arg3);
                } catch (RuntimeException e) {
                    ((PrintWriter)args.arg2).println("Exception: " + e);
                }
+18 −3
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ import android.text.method.MovementMethod;
import android.util.Log;
import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.util.imetracing.ImeTracing;
import android.util.proto.ProtoOutputStream;
import android.view.Gravity;
import android.view.KeyCharacterMap;
@@ -116,6 +117,7 @@ import android.view.inputmethod.InputBinding;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputContentInfo;
import android.view.inputmethod.InputMethod;
import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodServiceTraceProto;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;
import android.widget.FrameLayout;
@@ -708,6 +710,8 @@ public class InputMethodService extends AbstractInputMethodService {
                        + " Use requestHideSelf(int) itself");
                return;
            }
            ImeTracing.getInstance().triggerServiceDump(
                    "InputMethodService.InputMethodImpl#hideSoftInput", InputMethodService.this);
            final boolean wasVisible = isInputViewShown();
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.hideSoftInput");

@@ -762,6 +766,8 @@ public class InputMethodService extends AbstractInputMethodService {
                Binder.disableTracing();
            }
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.showSoftInput");
            ImeTracing.getInstance().triggerServiceDump(
                    "InputMethodService.InputMethodImpl#showSoftInput", InputMethodService.this);
            final boolean wasVisible = isInputViewShown();
            if (dispatchOnShowInputRequested(flags, false)) {

@@ -2138,6 +2144,8 @@ public class InputMethodService extends AbstractInputMethodService {
            return;
        }

        ImeTracing.getInstance().triggerServiceDump("InputMethodService#showWindow", this);

        mDecorViewWasVisible = mDecorViewVisible;
        mInShowWindow = true;
        final int previousImeWindowStatus =
@@ -2212,6 +2220,8 @@ public class InputMethodService extends AbstractInputMethodService {
     * @param setVisible {@code true} to make it visible, false to hide it.
     */
    private void applyVisibilityInInsetsConsumerIfNecessary(boolean setVisible) {
        ImeTracing.getInstance().triggerServiceDump(
                "InputMethodService#applyVisibilityInInsetsConsumerIfNecessary", this);
        mPrivOps.applyImeVisibility(setVisible
                ? mCurShowInputToken : mCurHideInputToken, setVisible);
    }
@@ -2236,6 +2246,7 @@ public class InputMethodService extends AbstractInputMethodService {

    public void hideWindow() {
        if (DEBUG) Log.v(TAG, "CALL: hideWindow");
        ImeTracing.getInstance().triggerServiceDump("InputMethodService#hideWindow", this);
        mWindowVisible = false;
        finishViews(false /* finishingInput */);
        if (mDecorViewVisible) {
@@ -2306,6 +2317,7 @@ public class InputMethodService extends AbstractInputMethodService {
    
    void doFinishInput() {
        if (DEBUG) Log.v(TAG, "CALL: doFinishInput");
        ImeTracing.getInstance().triggerServiceDump("InputMethodService#doFinishInput", this);
        finishViews(true /* finishingInput */);
        if (mInputStarted) {
            mInlineSuggestionSessionController.notifyOnFinishInput();
@@ -2321,6 +2333,7 @@ public class InputMethodService extends AbstractInputMethodService {
        if (!restarting) {
            doFinishInput();
        }
        ImeTracing.getInstance().triggerServiceDump("InputMethodService#doStartInput", this);
        mInputStarted = true;
        mStartedInputConnection = ic;
        mInputEditorInfo = attribute;
@@ -2479,6 +2492,7 @@ public class InputMethodService extends AbstractInputMethodService {
     * @param flags Provides additional operating flags.
     */
    public void requestHideSelf(int flags) {
        ImeTracing.getInstance().triggerServiceDump("InputMethodService#requestHideSelf", this);
        mPrivOps.hideMySoftInput(flags);
    }

@@ -2491,6 +2505,7 @@ public class InputMethodService extends AbstractInputMethodService {
     * @param flags Provides additional operating flags.
     */
    public final void requestShowSelf(int flags) {
        ImeTracing.getInstance().triggerServiceDump("InputMethodService#requestShowSelf", this);
        mPrivOps.showMySoftInput(flags);
    }

@@ -3310,8 +3325,8 @@ public class InputMethodService extends AbstractInputMethodService {
     * @hide
     */
    @Override
    final void dumpProtoInternal(FileDescriptor fd, String[] args) {
        final ProtoOutputStream proto = new ProtoOutputStream(fd);
    public final void dumpProtoInternal(ProtoOutputStream proto) {
        final long token = proto.start(InputMethodServiceTraceProto.INPUT_METHOD_SERVICE);
        mWindow.dumpDebug(proto, SOFT_INPUT_WINDOW);
        proto.write(VIEWS_CREATED, mViewsCreated);
        proto.write(DECOR_VIEW_VISIBLE, mDecorViewVisible);
@@ -3339,6 +3354,6 @@ public class InputMethodService extends AbstractInputMethodService {
        proto.write(STATUS_ICON, mStatusIcon);
        mTmpInsets.dumpDebug(proto, LAST_COMPUTED_INSETS);
        proto.write(SETTINGS_OBSERVER, Objects.toString(mSettingsObserver));
        proto.flush();
        proto.end(token);
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ package android.util.imetracing;

import android.app.ActivityThread;
import android.content.Context;
import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.AbstractInputMethodService;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
@@ -113,7 +113,7 @@ public abstract class ImeTracing {
     *
     * @param where Place where the trace was triggered.
     */
    public abstract void triggerServiceDump(String where, InputMethodService service);
    public abstract void triggerServiceDump(String where, AbstractInputMethodService service);

    /**
     * Starts a proto dump of the InputMethodManagerService information.
+22 −3
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package android.util.imetracing;

import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.AbstractInputMethodService;
import android.os.RemoteException;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.ShellCommand;
@@ -66,8 +66,27 @@ class ImeTracingClientImpl extends ImeTracing {
    }

    @Override
    public void triggerServiceDump(String where, InputMethodService service) {
        // TODO (b/154348613)
    public void triggerServiceDump(String where, AbstractInputMethodService service) {
        if (!isEnabled() || !isAvailable()) {
            return;
        }

        synchronized (mDumpInProgressLock) {
            if (mDumpInProgress) {
                return;
            }
            mDumpInProgress = true;
        }

        try {
            ProtoOutputStream proto = new ProtoOutputStream();
            service.dumpProtoInternal(proto);
            sendToService(proto.getBytes(), IME_TRACING_FROM_IMS, where);
        } catch (RemoteException e) {
            Log.e(TAG, "Exception while sending ime-related service dump to server", e);
        } finally {
            mDumpInProgress = false;
        }
    }

    @Override
Loading