Skip to content

Commit

Permalink
Track motion events for reuse post gesture disambiguation (#19484)
Browse files Browse the repository at this point in the history
This change makes it so that we track all the motion events encountered by `FlutterView` and all of its subviews in the `MotionEventTracker` class, indexed by a unique `MotionEventId`. This identifier is then passed to the Flutter framework as seen in flutter/flutter#60930. Once the gestures take part in gesture disambiguation and are sent back to the engine, we look-up the original motion event using the `MotionEventId` and dispatch it to the platform.

Bug: flutter/flutter#58837
  • Loading branch information
iskakaushik authored Jul 7, 2020
1 parent 5f8e91c commit 110a579
Show file tree
Hide file tree
Showing 11 changed files with 165 additions and 38 deletions.
1 change: 1 addition & 0 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,7 @@ FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/Flutt
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/FlutterSurfaceView.java
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/FlutterTextureView.java
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/FlutterView.java
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/MotionEventTracker.java
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/RenderMode.java
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/SplashScreen.java
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/SplashScreenProvider.java
Expand Down
5 changes: 3 additions & 2 deletions lib/ui/hooks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -287,9 +287,9 @@ void _invoke3<A1, A2, A3>(void callback(A1 a1, A2 a2, A3 a3)?, Zone zone, A1 arg
// If this value changes, update the encoding code in the following files:
//
// * pointer_data.cc
// * pointers.dart
// * pointer.dart
// * AndroidTouchProcessor.java
const int _kPointerDataFieldCount = 28;
const int _kPointerDataFieldCount = 29;

PointerDataPacket _unpackPointerDataPacket(ByteData packet) {
const int kStride = Int64List.bytesPerElement;
Expand All @@ -300,6 +300,7 @@ PointerDataPacket _unpackPointerDataPacket(ByteData packet) {
for (int i = 0; i < length; ++i) {
int offset = i * _kPointerDataFieldCount;
data.add(PointerData(
embedderId: packet.getInt64(kStride * offset++, _kFakeHostEndian),
timeStamp: Duration(microseconds: packet.getInt64(kStride * offset++, _kFakeHostEndian)),
change: PointerChange.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)],
kind: PointerDeviceKind.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)],
Expand Down
9 changes: 9 additions & 0 deletions lib/ui/pointer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ enum PointerSignalKind {
class PointerData {
/// Creates an object that represents the state of a pointer.
const PointerData({
this.embedderId = 0,
this.timeStamp = Duration.zero,
this.change = PointerChange.cancel,
this.kind = PointerDeviceKind.touch,
Expand Down Expand Up @@ -102,6 +103,13 @@ class PointerData {
this.scrollDeltaY = 0.0,
});

/// Unique identifier that ties the [PointerEvent] to embedder event created it.
///
/// No two pointer events can have the same [embedderId]. This is different from
/// [pointerIdentifier] - used for hit-testing, whereas [embedderId] is used to
/// identify the platform event.
final int embedderId;

/// Time of event dispatch, relative to an arbitrary timeline.
final Duration timeStamp;

Expand Down Expand Up @@ -263,6 +271,7 @@ class PointerData {
/// Returns a complete textual description of the information in this object.
String toStringFull() {
return '$runtimeType('
'embedderId: $embedderId, '
'timeStamp: $timeStamp, '
'change: $change, '
'kind: $kind, '
Expand Down
3 changes: 2 additions & 1 deletion lib/ui/window/pointer_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace flutter {

// If this value changes, update the pointer data unpacking code in hooks.dart.
static constexpr int kPointerDataFieldCount = 28;
static constexpr int kPointerDataFieldCount = 29;
static constexpr int kBytesPerField = sizeof(int64_t);
// Must match the button constants in events.dart.
enum PointerButtonMouse : int64_t {
Expand Down Expand Up @@ -58,6 +58,7 @@ struct alignas(8) PointerData {
kScroll,
};

int64_t embedder_id;
int64_t time_stamp;
Change change;
DeviceKind kind;
Expand Down
69 changes: 39 additions & 30 deletions lib/web_ui/lib/src/ui/pointer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ enum PointerSignalKind {
class PointerData {
/// Creates an object that represents the state of a pointer.
const PointerData({
this.embedderId = 0,
this.timeStamp = Duration.zero,
this.change = PointerChange.cancel,
this.kind = PointerDeviceKind.touch,
Expand Down Expand Up @@ -101,6 +102,13 @@ class PointerData {
this.scrollDeltaY = 0.0,
});

/// Unique identifier that ties the [PointerEvent] to embedder event created it.
///
/// No two pointer events can have the same [embedderId]. This is different from
/// [pointerIdentifier] - used for hit-testing, whereas [embedderId] is used to
/// identify the platform event.
final int embedderId;

/// Time of event dispatch, relative to an arbitrary timeline.
final Duration timeStamp;

Expand Down Expand Up @@ -257,46 +265,47 @@ class PointerData {
final double scrollDeltaY;

@override
String toString() => '$runtimeType(x: $physicalX, y: $physicalY)';
String toString() => 'PointerData(x: $physicalX, y: $physicalY)';

/// Returns a complete textual description of the information in this object.
String toStringFull() {
return '$runtimeType('
'timeStamp: $timeStamp, '
'change: $change, '
'kind: $kind, '
'signalKind: $signalKind, '
'device: $device, '
'pointerIdentifier: $pointerIdentifier, '
'physicalX: $physicalX, '
'physicalY: $physicalY, '
'physicalDeltaX: $physicalDeltaX, '
'physicalDeltaY: $physicalDeltaY, '
'buttons: $buttons, '
'synthesized: $synthesized, '
'pressure: $pressure, '
'pressureMin: $pressureMin, '
'pressureMax: $pressureMax, '
'distance: $distance, '
'distanceMax: $distanceMax, '
'size: $size, '
'radiusMajor: $radiusMajor, '
'radiusMinor: $radiusMinor, '
'radiusMin: $radiusMin, '
'radiusMax: $radiusMax, '
'orientation: $orientation, '
'tilt: $tilt, '
'platformData: $platformData, '
'scrollDeltaX: $scrollDeltaX, '
'scrollDeltaY: $scrollDeltaY'
')';
'embedderId: $embedderId, '
'timeStamp: $timeStamp, '
'change: $change, '
'kind: $kind, '
'signalKind: $signalKind, '
'device: $device, '
'pointerIdentifier: $pointerIdentifier, '
'physicalX: $physicalX, '
'physicalY: $physicalY, '
'physicalDeltaX: $physicalDeltaX, '
'physicalDeltaY: $physicalDeltaY, '
'buttons: $buttons, '
'synthesized: $synthesized, '
'pressure: $pressure, '
'pressureMin: $pressureMin, '
'pressureMax: $pressureMax, '
'distance: $distance, '
'distanceMax: $distanceMax, '
'size: $size, '
'radiusMajor: $radiusMajor, '
'radiusMinor: $radiusMinor, '
'radiusMin: $radiusMin, '
'radiusMax: $radiusMax, '
'orientation: $orientation, '
'tilt: $tilt, '
'platformData: $platformData, '
'scrollDeltaX: $scrollDeltaX, '
'scrollDeltaY: $scrollDeltaY'
')';
}
}

/// A sequence of reports about the state of pointers.
class PointerDataPacket {
/// Creates a packet of pointer data reports.
const PointerDataPacket({this.data = const <PointerData>[]}) : assert(data != null); // ignore: unnecessary_null_comparison
const PointerDataPacket({ this.data = const <PointerData>[] }) : assert(data != null); // ignore: unnecessary_null_comparison

/// Data about the individual pointers in this packet.
///
Expand Down
1 change: 1 addition & 0 deletions shell/platform/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ android_java_sources = [
"io/flutter/embedding/android/FlutterSurfaceView.java",
"io/flutter/embedding/android/FlutterTextureView.java",
"io/flutter/embedding/android/FlutterView.java",
"io/flutter/embedding/android/MotionEventTracker.java",
"io/flutter/embedding/android/RenderMode.java",
"io/flutter/embedding/android/SplashScreen.java",
"io/flutter/embedding/android/SplashScreenProvider.java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,15 @@ public class AndroidTouchProcessor {
}

// Must match the unpacking code in hooks.dart.
private static final int POINTER_DATA_FIELD_COUNT = 28;
private static final int POINTER_DATA_FIELD_COUNT = 29;
private static final int BYTES_PER_FIELD = 8;

// This value must match the value in framework's platform_view.dart.
// This flag indicates whether the original Android pointer events were batched together.
private static final int POINTER_DATA_FLAG_BATCHED = 1;

@NonNull private final FlutterRenderer renderer;
@NonNull private final MotionEventTracker motionEventTracker;

private static final int _POINTER_BUTTON_PRIMARY = 1;

Expand All @@ -76,6 +77,7 @@ public class AndroidTouchProcessor {
// FlutterRenderer
public AndroidTouchProcessor(@NonNull FlutterRenderer renderer) {
this.renderer = renderer;
this.motionEventTracker = MotionEventTracker.getInstance();
}

/** Sends the given {@link MotionEvent} data to Flutter in a format that Flutter understands. */
Expand Down Expand Up @@ -174,6 +176,8 @@ private void addPointerForIndex(
return;
}

MotionEventTracker.MotionEventId motionEventId = motionEventTracker.track(event);

int pointerKind = getPointerDeviceTypeForToolType(event.getToolType(pointerIndex));

int signalKind =
Expand All @@ -183,6 +187,7 @@ private void addPointerForIndex(

long timeStamp = event.getEventTime() * 1000; // Convert from milliseconds to microseconds.

packet.putLong(motionEventId.getId());
packet.putLong(timeStamp); // time_stamp
packet.putLong(pointerChange); // change
packet.putLong(pointerKind); // kind
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package io.flutter.embedding.android;

import android.util.LongSparseArray;
import android.view.MotionEvent;
import androidx.annotation.Nullable;
import java.util.PriorityQueue;
import java.util.concurrent.atomic.AtomicLong;

/** Tracks the motion events received by the FlutterView. */
public final class MotionEventTracker {

/** Represents a unique identifier corresponding to a motion event. */
public static class MotionEventId {
private static final AtomicLong ID_COUNTER = new AtomicLong(0);
private final long id;

private MotionEventId(long id) {
this.id = id;
}

public static MotionEventId from(long id) {
return new MotionEventId(id);
}

public static MotionEventId createUnique() {
return MotionEventId.from(ID_COUNTER.incrementAndGet());
}

public long getId() {
return id;
}
}

private final LongSparseArray<MotionEvent> eventById;
private final PriorityQueue<Long> unusedEvents;
private static MotionEventTracker INSTANCE;

public static MotionEventTracker getInstance() {
if (INSTANCE == null) {
INSTANCE = new MotionEventTracker();
}
return INSTANCE;
}

private MotionEventTracker() {
eventById = new LongSparseArray<>();
unusedEvents = new PriorityQueue<>();
}

/** Tracks the event and returns a unique MotionEventId identifying the event. */
public MotionEventId track(MotionEvent event) {
MotionEventId eventId = MotionEventId.createUnique();
eventById.put(eventId.id, event);
unusedEvents.add(eventId.id);
return eventId;
}

/**
* Returns the MotionEvent corresponding to the eventId while discarding all the motion events
* that occured prior to the event represented by the eventId. Returns null if this event was
* popped or discarded.
*/
@Nullable
public MotionEvent pop(MotionEventId eventId) {
// remove all the older events.
while (!unusedEvents.isEmpty() && unusedEvents.peek() < eventId.id) {
eventById.remove(unusedEvents.poll());
}

// remove the current event from the heap if it exists.
if (!unusedEvents.isEmpty() && unusedEvents.peek() == eventId.id) {
unusedEvents.poll();
}

MotionEvent event = eventById.get(eventId.id);
eventById.remove(eventId.id);
return event;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ private void touch(@NonNull MethodCall call, @NonNull MethodChannel.Result resul
(int) args.get(11),
(int) args.get(12),
(int) args.get(13),
(int) args.get(14));
(int) args.get(14),
((Number) args.get(15)).longValue());

try {
handler.onTouch(touch);
Expand Down Expand Up @@ -380,6 +381,8 @@ public static class PlatformViewTouch {
public final int source;
/** TODO(mattcarroll): javadoc */
public final int flags;
/** TODO(iskakaushik): javadoc */
public final long motionEventId;

PlatformViewTouch(
int viewId,
Expand All @@ -396,7 +399,8 @@ public static class PlatformViewTouch {
int deviceId,
int edgeFlags,
int source,
int flags) {
int flags,
long motionEventId) {
this.viewId = viewId;
this.downTime = downTime;
this.eventTime = eventTime;
Expand All @@ -412,6 +416,7 @@ public static class PlatformViewTouch {
this.edgeFlags = edgeFlags;
this.source = source;
this.flags = flags;
this.motionEventId = motionEventId;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import androidx.annotation.VisibleForTesting;
import io.flutter.embedding.android.FlutterImageView;
import io.flutter.embedding.android.FlutterView;
import io.flutter.embedding.android.MotionEventTracker;
import io.flutter.embedding.engine.FlutterOverlaySurface;
import io.flutter.embedding.engine.dart.DartExecutor;
import io.flutter.embedding.engine.mutatorsstack.*;
Expand Down Expand Up @@ -93,6 +94,9 @@ public class PlatformViewsController implements PlatformViewsAccessibilityDelega
// Platform view IDs that were displayed since the start of the current frame.
private HashSet<Integer> currentFrameUsedPlatformViewIds;

// Used to acquire the original motion events using the motionEventIds.
private final MotionEventTracker motionEventTracker;

private final PlatformViewsChannel.PlatformViewsHandler channelHandler =
new PlatformViewsChannel.PlatformViewsHandler() {

Expand Down Expand Up @@ -301,8 +305,16 @@ private void ensureValidAndroidVersion(int minSdkVersion) {
}
};

private static MotionEvent toMotionEvent(
float density, PlatformViewsChannel.PlatformViewTouch touch) {
private MotionEvent toMotionEvent(float density, PlatformViewsChannel.PlatformViewTouch touch) {
MotionEventTracker.MotionEventId motionEventId =
MotionEventTracker.MotionEventId.from(touch.motionEventId);
MotionEvent trackedEvent = motionEventTracker.pop(motionEventId);
if (trackedEvent != null) {
return trackedEvent;
}

// TODO (kaushikiska) : warn that we are potentially using an untracked
// event in the platform views.
PointerProperties[] pointerProperties =
parsePointerPropertiesList(touch.rawPointerPropertiesList)
.toArray(new PointerProperties[touch.pointerCount]);
Expand Down Expand Up @@ -339,6 +351,8 @@ public PlatformViewsController() {
platformViewRequests = new SparseArray<>();
platformViews = new SparseArray<>();
mutatorViews = new SparseArray<>();

motionEventTracker = MotionEventTracker.getInstance();
}

/**
Expand Down
2 changes: 2 additions & 0 deletions shell/platform/embedder/embedder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1225,6 +1225,8 @@ FlutterEngineResult FlutterEngineSendPointerEvent(
for (size_t i = 0; i < events_count; ++i) {
flutter::PointerData pointer_data;
pointer_data.Clear();
// this is currely in use only on android embedding.
pointer_data.embedder_id = 0;
pointer_data.time_stamp = SAFE_ACCESS(current, timestamp, 0);
pointer_data.change = ToPointerDataChange(
SAFE_ACCESS(current, phase, FlutterPointerPhase::kCancel));
Expand Down

1 comment on commit 110a579

@PingShen
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

with platformview,we meet some crash online

2020-07-14 11:43:59.796 15182-15182/? A/DEBUG: SYSVMTYPE: Maple
APPVMTYPE: Art
2020-07-14 11:43:59.796 15182-15182/? A/DEBUG: pid: 14419, tid: 14419, name: n.flutter_app_1 >>> com.aa.flutter_app_1 <<<
2020-07-14 11:43:59.796 15182-15182/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
2020-07-14 11:43:59.796 15182-15182/? A/DEBUG: Abort message: 'ubsan: shift-out-of-bounds'
2020-07-14 11:43:59.796 15182-15182/? A/DEBUG: r0 00000000 r1 00003853 r2 00000006 r3 00000008
2020-07-14 11:43:59.796 15182-15182/? A/DEBUG: r4 00003853 r5 00003853 r6 fff4100c r7 0000010c
2020-07-14 11:43:59.796 15182-15182/? A/DEBUG: r8 da286080 r9 e3344000 r10 da286080 r11 00000000
2020-07-14 11:43:59.796 15182-15182/? A/DEBUG: ip 00000041 sp fff40ff8 lr e5532a6d pc e552a796
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: backtrace:
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #00 pc 0001d796 /system/lib/libc.so (abort+58)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #1 pc 0001e324 /system/lib/libinput.so (abort_with_message(char const*)+24)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #2 pc 0001e560 /system/lib/libinput.so (__ubsan_handle_shift_out_of_bounds_minimal_abort+24)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #3 pc 0001c807 /system/lib/libinput.so (android::VelocityTracker::addMovement(android::MotionEvent const*)+666)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #4 pc 003f005b /system/framework/arm/boot-framework.oat (offset 0x3ef000) (android.app.admin.SecurityLog.readEventsOnWrapping [DEDUPED]+130)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #05 pc 0000f73b /dev/ashmem/dalvik-jit-code-cache (deleted) (android.view.VelocityTracker.addMovement+58)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #6 pc 000062f5 /dev/ashmem/dalvik-jit-code-cache (deleted) (android.view.GestureDetector.onTouchEvent+172)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #7 pc 00011d9d /dev/ashmem/dalvik-jit-code-cache (deleted) (com.aa.flutter_app_1.GestureDemoView.onTouchEvent+92)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #8 pc 0000eb4b /dev/ashmem/dalvik-jit-code-cache (deleted) (android.view.View.dispatchTouchEvent+602)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #9 pc 00012b95 /dev/ashmem/dalvik-jit-code-cache (deleted) (io.flutter.plugin.platform.PlatformViewsController$1.onTouch+852)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #10 pc 0000e409 /dev/ashmem/dalvik-jit-code-cache (deleted) (io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.touch+952)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #11 pc 0000b585 /dev/ashmem/dalvik-jit-code-cache (deleted) (io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.onMethodCall+812)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #12 pc 00016021 /dev/ashmem/dalvik-jit-code-cache (deleted) (io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage+168)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #13 pc 0000b999 /dev/ashmem/dalvik-jit-code-cache (deleted) (io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart+408)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #14 pc 00015363 /dev/ashmem/dalvik-jit-code-cache (deleted) (io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage+74)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #15 pc 0043d975 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #16 pc 00410061 /system/lib/libart.so (art_quick_invoke_stub+224)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #17 pc 000a82ad /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+136)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #18 pc 0036b4e9 /system/lib/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, art::JValue*, char const*)+52)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #19 pc 0036c499 /system/lib/libart.so (art::InvokeVirtualOrInterfaceWithVarArgs(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, std::__va_list)+316)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #20 pc 00285053 /system/lib/libart.so (art::JNI::CallVoidMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list)+482)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #21 pc 00f9f09b /data/app/com.aa.flutter_app_1-7LgB6uQz6o3Nb7R-J0d9Dw==/lib/arm/libflutter.so (offset 0xf9a000)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #22 pc 00f9f055 /data/app/com.aa.flutter_app_1-7LgB6uQz6o3Nb7R-J0d9Dw==/lib/arm/libflutter.so (offset 0xf9a000)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #23 pc 00f9db77 /data/app/com.aa.flutter_app_1-7LgB6uQz6o3Nb7R-J0d9Dw==/lib/arm/libflutter.so (offset 0xf9a000)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #24 pc 00fd1e3b /data/app/com.aa.flutter_app_1-7LgB6uQz6o3Nb7R-J0d9Dw==/lib/arm/libflutter.so (offset 0xf9a000)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #25 pc 00fa95dd /data/app/com.aa.flutter_app_1-7LgB6uQz6o3Nb7R-J0d9Dw==/lib/arm/libflutter.so (offset 0xf9a000)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #26 pc 00facd4f /data/app/com.aa.flutter_app_1-7LgB6uQz6o3Nb7R-J0d9Dw==/lib/arm/libflutter.so (offset 0xf9a000)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #27 pc 0000f3b7 /system/lib/libutils.so (android::Looper::pollInner(int)+726)
2020-07-14 11:44:00.005 15182-15182/? A/DEBUG: #28 pc 0000f05f /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+26)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #29 pc 000c0db9 /system/lib/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long long, int)+26)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #30 pc 003fc45d /system/framework/arm/boot-framework.oat (offset 0x3ef000) (android.media.MediaExtractor.seekTo [DEDUPED]+92)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #31 pc 00001f33 /dev/ashmem/dalvik-jit-code-cache (deleted) (android.os.MessageQueue.next+194)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #32 pc 00040b39 /dev/ashmem/dalvik-jit-code-cache (deleted) (android.os.Looper.loop+360)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #33 pc 0043d9bb /system/lib/libart.so (art_quick_osr_stub+42)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #34 pc 0025a9c5 /system/lib/libart.so (art::jit::Jit::MaybeDoOnStackReplacement(art::Thread*, art::ArtMethod*, unsigned int, int, art::JValue*)+1472)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #35 pc 0040f667 /system/lib/libart.so (MterpMaybeDoOnStackReplacement+86)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #36 pc 0043d174 /system/lib/libart.so (ExecuteMterpImpl+66164)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #37 pc 00b51512 /system/framework/boot-framework.vdex (android.os.Looper.loop+1036)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #38 pc 001d3d1f /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.2251853088+354)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #39 pc 001d8657 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+146)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #40 pc 001ef353 /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+762)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #41 pc 0040bcb7 /system/lib/libart.so (MterpInvokeStatic+130)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #42 pc 00430814 /system/lib/libart.so (ExecuteMterpImpl+14612)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #43 pc 003decbc /system/framework/boot-framework.vdex (android.app.ActivityThread.main+428)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #44 pc 001d3d1f /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.2251853088+354)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #45 pc 001d85a3 /system/lib/libart.so (art::interpreter::EnterInterpreterFromEntryPoint(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*)+82)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #46 pc 003fa8cb /system/lib/libart.so (artQuickToInterpreterBridge+882)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #47 pc 00441eff /system/lib/libart.so (art_quick_to_interpreter_bridge+30)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #48 pc 0043d975 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #49 pc 00410163 /system/lib/libart.so (art_quick_invoke_static_stub+222)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #50 pc 000a82bf /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+154)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #51 pc 0036b4e9 /system/lib/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, art::JValue*, char const*)+52)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #52 pc 0036c93b /system/lib/libart.so (art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jobject*, _jobject*, unsigned int)+962)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #53 pc 0031b791 /system/lib/libart.so (art::Method_invoke(_JNIEnv*, _jobject*, _jobject*, _jobjectArray*)+40)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #54 pc 001381ff /system/framework/arm/boot.oat (offset 0x132000) (java.lang.Class.getDeclaredMethodInternal [DEDUPED]+110)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #55 pc 0043d975 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #56 pc 00410061 /system/lib/libart.so (art_quick_invoke_stub+224)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #57 pc 000a82ad /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+136)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #58 pc 001f46f7 /system/lib/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+230)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #59 pc 001ef369 /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+784)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #60 pc 0040acb7 /system/lib/libart.so (MterpInvokeVirtual+442)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #61 pc 00430694 /system/lib/libart.so (ExecuteMterpImpl+14228)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #62 pc 012310c0 /system/framework/boot-framework.vdex (com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run+22)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #63 pc 001d3d1f /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.2251853088+354)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #64 pc 001d85a3 /system/lib/libart.so (art::interpreter::EnterInterpreterFromEntryPoint(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*)+82)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #65 pc 003fa8cb /system/lib/libart.so (artQuickToInterpreterBridge+882)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #66 pc 00441eff /system/lib/libart.so (art_quick_to_interpreter_bridge+30)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #67 pc 00c7f46f /system/framework/arm/boot-framework.oat (offset 0x3ef000) (com.android.internal.os.ZygoteInit.main+2070)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #68 pc 0043d975 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #69 pc 00410163 /system/lib/libart.so (art_quick_invoke_static_stub+222)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #70 pc 000a82bf /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+154)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #71 pc 0036b4e9 /system/lib/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, art::JValue*, char const*)+52)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #72 pc 0036b2fd /system/lib/libart.so (art::InvokeWithVarArgs(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, std::__va_list)+300)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #73 pc 002a1479 /system/lib/libart.so (art::JNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, std::__va_list)+484)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #74 pc 00072443 /system/lib/libandroid_runtime.so (_JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...)+38)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #75 pc 00074a07 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, android::Vectorandroid::String8 const&, bool)+482)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #76 pc 00001a93 /system/bin/app_process32 (main+898)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #77 pc 0008e131 /system/lib/libc.so (__libc_init+48)
2020-07-14 11:44:00.006 15182-15182/? A/DEBUG: #78 pc 000016d1 /system/bin/app_process32 (_start_main+40)

Please sign in to comment.