5package io.flutter.embedding.engine.dart;
7import android.content.res.AssetManager;
8import androidx.annotation.NonNull;
9import androidx.annotation.Nullable;
10import androidx.annotation.UiThread;
11import io.flutter.FlutterInjector;
13import io.flutter.embedding.engine.FlutterJNI;
14import io.flutter.embedding.engine.loader.FlutterLoader;
15import io.flutter.plugin.common.BinaryMessenger;
16import io.flutter.plugin.common.StringCodec;
17import io.flutter.util.TraceSection;
18import io.flutter.view.FlutterCallbackInformation;
19import java.nio.ByteBuffer;
39 private static final String TAG =
"DartExecutor";
42 @NonNull
private final AssetManager assetManager;
45 private boolean isApplicationRunning =
false;
46 @Nullable
private String isolateServiceId;
49 private final BinaryMessenger.BinaryMessageHandler isolateChannelMessageHandler =
54 if (isolateServiceIdListener !=
null) {
55 isolateServiceIdListener.onIsolateServiceIdAvailable(isolateServiceId);
61 this.flutterJNI = flutterJNI;
62 this.assetManager = assetManager;
64 dartMessenger.setMessageHandler(
"flutter/isolate", isolateChannelMessageHandler);
65 this.binaryMessenger =
new DefaultBinaryMessenger(dartMessenger);
68 if (flutterJNI.isAttached()) {
69 isApplicationRunning =
true;
88 "Attached to JNI. Registering the platform message handler for this Dart execution"
90 flutterJNI.setPlatformMessageHandler(dartMessenger);
103 "Detached from JNI. De-registering the platform message handler for this Dart execution"
105 flutterJNI.setPlatformMessageHandler(
null);
114 return isApplicationRunning;
139 if (isApplicationRunning) {
140 Log.
w(
TAG,
"Attempted to run a DartExecutor that is already running.");
145 Log.
v(
TAG,
"Executing Dart entrypoint: " + dartEntrypoint);
146 flutterJNI.runBundleAndSnapshotFromLibrary(
147 dartEntrypoint.pathToBundle,
148 dartEntrypoint.dartEntrypointFunctionName,
149 dartEntrypoint.dartEntrypointLibrary,
153 isApplicationRunning =
true;
165 if (isApplicationRunning) {
166 Log.
w(
TAG,
"Attempted to run a DartExecutor that is already running.");
171 Log.
v(
TAG,
"Executing Dart callback: " + dartCallback);
172 flutterJNI.runBundleAndSnapshotFromLibrary(
173 dartCallback.pathToBundle,
174 dartCallback.callbackHandle.callbackName,
175 dartCallback.callbackHandle.callbackLibraryPath,
176 dartCallback.androidAssetManager,
179 isApplicationRunning =
true;
189 return binaryMessenger;
198 return binaryMessenger.makeBackgroundTaskQueue(
options);
205 public void send(@NonNull String channel, @Nullable ByteBuffer
message) {
206 binaryMessenger.send(channel,
message);
214 @NonNull String channel,
226 binaryMessenger.setMessageHandler(channel, handler);
234 @NonNull String channel,
237 binaryMessenger.setMessageHandler(channel, handler, taskQueue);
244 dartMessenger.enableBufferingIncomingMessages();
251 dartMessenger.disableBufferingIncomingMessages();
271 return dartMessenger.getPendingChannelResponseCount();
280 return isolateServiceId;
293 isolateServiceIdListener = listener;
294 if (isolateServiceIdListener !=
null && isolateServiceId !=
null) {
295 isolateServiceIdListener.onIsolateServiceIdAvailable(isolateServiceId);
310 if (flutterJNI.isAttached()) {
311 flutterJNI.notifyLowMemoryWarning();
328 if (!flutterLoader.initialized()) {
329 throw new AssertionError(
330 "DartEntrypoints can only be created once a FlutterEngine is created.");
363 return "DartEntrypoint( bundle path: "
372 if (
this == o)
return true;
373 if (o ==
null || getClass() != o.getClass())
return false;
415 return "DartCallback( bundle path: "
418 + callbackHandle.callbackLibraryPath
420 + callbackHandle.callbackName
425 private static class DefaultBinaryMessenger
implements BinaryMessenger {
428 private DefaultBinaryMessenger(@NonNull
DartMessenger messenger) {
429 this.messenger = messenger;
445 public void send(@NonNull String channel, @Nullable ByteBuffer
message) {
461 @NonNull String channel,
463 @Nullable BinaryMessenger.BinaryReply
callback) {
478 @NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler) {
485 @NonNull String channel,
486 @Nullable BinaryMessenger.BinaryMessageHandler handler,
487 @Nullable TaskQueue taskQueue) {
493 messenger.enableBufferingIncomingMessages();
static void v(@NonNull String tag, @NonNull String message)
static void w(@NonNull String tag, @NonNull String message)
DartCallback( @NonNull AssetManager androidAssetManager, @NonNull String pathToBundle, @NonNull FlutterCallbackInformation callbackHandle)
final FlutterCallbackInformation callbackHandle
final String pathToBundle
final AssetManager androidAssetManager
static DartEntrypoint createDefault()
DartEntrypoint( @NonNull String pathToBundle, @NonNull String dartEntrypointLibrary, @NonNull String dartEntrypointFunctionName)
final String pathToBundle
final String dartEntrypointFunctionName
final String dartEntrypointLibrary
DartEntrypoint( @NonNull String pathToBundle, @NonNull String dartEntrypointFunctionName)
TaskQueue makeBackgroundTaskQueue(TaskQueueOptions options)
void executeDartEntrypoint(@NonNull DartEntrypoint dartEntrypoint)
void send(@NonNull String channel, @Nullable ByteBuffer message)
void notifyLowMemoryWarning()
void send( @NonNull String channel, @Nullable ByteBuffer message, @Nullable BinaryMessenger.BinaryReply callback)
void executeDartEntrypoint( @NonNull DartEntrypoint dartEntrypoint, @Nullable List< String > dartEntrypointArgs)
int getPendingChannelResponseCount()
void enableBufferingIncomingMessages()
String getIsolateServiceId()
void setIsolateServiceIdListener(@Nullable IsolateServiceIdListener listener)
void executeDartCallback(@NonNull DartCallback dartCallback)
BinaryMessenger getBinaryMessenger()
boolean isExecutingDart()
DartExecutor(@NonNull FlutterJNI flutterJNI, @NonNull AssetManager assetManager)
void disableBufferingIncomingMessages()
void setMessageHandler( @NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler, @Nullable TaskQueue taskQueue)
void setMessageHandler( @NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler)
void setMessageHandler( @NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler)
TaskQueue makeBackgroundTaskQueue(TaskQueueOptions options)
void send(@NonNull String channel, @NonNull ByteBuffer message)
void disableBufferingIncomingMessages()
String findAppBundlePath()
static final StringCodec INSTANCE
String decodeMessage(@Nullable ByteBuffer message)
static TraceSection scoped(String name)
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
void onIsolateServiceIdAvailable(@NonNull String isolateServiceId)
default TaskQueue makeBackgroundTaskQueue()