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;
44 @NonNull
private final BinaryMessenger binaryMessenger;
45 private boolean isApplicationRunning =
false;
46 @Nullable
private String isolateServiceId;
49 private final BinaryMessenger.BinaryMessageHandler isolateChannelMessageHandler =
50 new BinaryMessenger.BinaryMessageHandler() {
53 isolateServiceId = StringCodec.INSTANCE.decodeMessage(
message);
54 if (isolateServiceIdListener !=
null) {
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.");
144 try (TraceSection e = TraceSection.scoped(
"DartExecutor#executeDartEntrypoint")) {
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.");
170 try (TraceSection e = TraceSection.scoped(
"DartExecutor#executeDartCallback")) {
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,
216 @Nullable BinaryMessenger.BinaryReply
callback) {
225 @NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler) {
226 binaryMessenger.setMessageHandler(channel, handler);
234 @NonNull String channel,
235 @Nullable BinaryMessenger.BinaryMessageHandler handler,
236 @Nullable TaskQueue taskQueue) {
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();
326 FlutterLoader flutterLoader =
FlutterInjector.instance().flutterLoader();
328 if (!flutterLoader.initialized()) {
329 throw new AssertionError(
330 "DartEntrypoints can only be created once a FlutterEngine is created.");
332 return new DartEntrypoint(flutterLoader.findAppBundlePath(),
"main");
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;
432 public TaskQueue makeBackgroundTaskQueue(TaskQueueOptions
options) {
445 public void send(@NonNull String channel, @Nullable ByteBuffer
message) {
461 @NonNull String channel,
463 @Nullable BinaryMessenger.BinaryReply
callback) {
477 public void setMessageHandler(
478 @NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler) {
484 public void setMessageHandler(
485 @NonNull String channel,
486 @Nullable BinaryMessenger.BinaryMessageHandler handler,
487 @Nullable TaskQueue taskQueue) {
492 public void enableBufferingIncomingMessages() {
493 messenger.enableBufferingIncomingMessages();
497 public void disableBufferingIncomingMessages() {
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()
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
void onIsolateServiceIdAvailable(@NonNull String isolateServiceId)