5#define FML_USED_ON_EMBEDDER
7#include "flutter/shell/platform/android/android_shell_holder.h"
10#include <sys/resource.h>
19#include "flutter/fml/cpu_affinity.h"
20#include "flutter/fml/logging.h"
21#include "flutter/fml/make_copyable.h"
22#include "flutter/fml/message_loop.h"
23#include "flutter/fml/native_library.h"
24#include "flutter/fml/platform/android/jni_util.h"
25#include "flutter/lib/ui/painting/image_generator_registry.h"
26#include "flutter/shell/common/rasterizer.h"
27#include "flutter/shell/common/run_configuration.h"
28#include "flutter/shell/common/thread_host.h"
29#include "flutter/shell/platform/android/android_display.h"
30#include "flutter/shell/platform/android/android_image_generator.h"
31#include "flutter/shell/platform/android/context/android_context.h"
32#include "flutter/shell/platform/android/platform_view_android.h"
46 if (::setpriority(PRIO_PROCESS, 0, 10) != 0) {
47 FML_LOG(
ERROR) <<
"Failed to set IO task runner priority";
53 if (::setpriority(PRIO_PROCESS, 0, -1) != 0) {
54 FML_LOG(
ERROR) <<
"Failed to set UI task runner priority";
63 if (::setpriority(PRIO_PROCESS, 0, -5) != 0) {
66 if (::setpriority(PRIO_PROCESS, 0, -2) != 0) {
67 FML_LOG(
ERROR) <<
"Failed to set raster task runner priority";
74 if (::setpriority(PRIO_PROCESS, 0, 0) != 0) {
87 std::shared_ptr<PlatformViewAndroidJNI> jni_facade)
88 :
settings_(settings), jni_facade_(jni_facade) {
89 static size_t thread_host_count = 1;
90 auto thread_label = std::to_string(thread_host_count++);
110 thread_host_ = std::make_shared<ThreadHost>(host_config);
114 [&jni_facade, &weak_platform_view](
Shell& shell) {
115 std::unique_ptr<PlatformViewAndroid> platform_view_android;
116 platform_view_android = std::make_unique<PlatformViewAndroid>(
118 shell.GetTaskRunners(),
121 .enable_software_rendering,
122 shell.GetSettings().msaa_samples
124 weak_platform_view = platform_view_android->GetWeakPtr();
125 return platform_view_android;
129 return std::make_unique<Rasterizer>(shell);
140 raster_runner = thread_host_->raster_thread->GetTaskRunner();
141 ui_runner = thread_host_->ui_thread->GetTaskRunner();
142 io_runner = thread_host_->io_thread->GetTaskRunner();
155 on_create_platform_view,
160 shell_->GetDartVM()->GetConcurrentMessageLoop()->PostTaskToAllWorkers([]() {
161 if (::setpriority(PRIO_PROCESS, gettid(), 1) != 0) {
162 FML_LOG(
ERROR) <<
"Failed to set Workers task runner priority";
166 shell_->RegisterImageDecoder(
171 FML_DLOG(INFO) <<
"Registered Android SDK image decoder (API level 28+)";
174 platform_view_ = weak_platform_view;
176 is_valid_ = shell_ !=
nullptr;
181 const std::shared_ptr<PlatformViewAndroidJNI>& jni_facade,
182 const std::shared_ptr<ThreadHost>& thread_host,
183 std::unique_ptr<Shell> shell,
184 std::unique_ptr<APKAssetProvider> apk_asset_provider,
187 jni_facade_(jni_facade),
190 shell_(
std::move(shell)),
191 apk_asset_provider_(
std::move(apk_asset_provider)) {
197 is_valid_ = shell_ !=
nullptr;
202 thread_host_.reset();
214 std::shared_ptr<PlatformViewAndroidJNI> jni_facade,
215 const std::string& entrypoint,
216 const std::string& libraryUrl,
217 const std::string& initial_route,
218 const std::vector<std::string>& entrypoint_args)
const {
220 <<
"A new Shell can only be spawned "
221 "if the current Shell is properly constructed";
237 std::shared_ptr<flutter::AndroidContext> android_context =
243 [&jni_facade, android_context, &weak_platform_view](
Shell& shell) {
244 std::unique_ptr<PlatformViewAndroid> platform_view_android;
245 platform_view_android = std::make_unique<PlatformViewAndroid>(
247 shell.GetTaskRunners(),
251 weak_platform_view = platform_view_android->GetWeakPtr();
252 return platform_view_android;
256 return std::make_unique<Rasterizer>(shell);
261 auto config = BuildRunConfiguration(entrypoint, libraryUrl, entrypoint_args);
268 std::unique_ptr<flutter::Shell> shell =
269 shell_->Spawn(std::move(config.value()), initial_route,
270 on_create_platform_view, on_create_rasterizer);
273 GetSettings(), jni_facade, thread_host_, std::move(shell),
274 apk_asset_provider_->Clone(), weak_platform_view));
278 std::unique_ptr<APKAssetProvider> apk_asset_provider,
279 const std::string& entrypoint,
280 const std::string& libraryUrl,
281 const std::vector<std::string>& entrypoint_args) {
286 apk_asset_provider_ = std::move(apk_asset_provider);
287 auto config = BuildRunConfiguration(entrypoint, libraryUrl, entrypoint_args);
292 shell_->RunEngine(std::move(config.value()));
297 bool base64_encode) {
302 return shell_->Screenshot(
type, base64_encode);
307 return platform_view_;
312 shell_->NotifyLowMemoryWarning();
315std::optional<RunConfiguration> AndroidShellHolder::BuildRunConfiguration(
316 const std::string& entrypoint,
317 const std::string& libraryUrl,
318 const std::vector<std::string>& entrypoint_args)
const {
319 std::unique_ptr<IsolateConfiguration> isolate_configuration;
323 std::unique_ptr<fml::Mapping> kernel_blob =
330 isolate_configuration =
334 RunConfiguration config(std::move(isolate_configuration));
335 config.AddAssetResolver(apk_asset_provider_->Clone());
338 if (!entrypoint.empty() && !libraryUrl.empty()) {
339 config.SetEntrypointAndLibrary(entrypoint, libraryUrl);
340 }
else if (!entrypoint.empty()) {
341 config.SetEntrypoint(entrypoint);
343 if (!entrypoint_args.empty()) {
344 config.SetEntrypointArgs(entrypoint_args);
351 std::vector<std::unique_ptr<Display>> displays;
352 displays.push_back(std::make_unique<AndroidDisplay>(jni_facade_));
353 shell_->OnDisplayUpdates(std::move(displays));
static std::shared_ptr< ImageGenerator > MakeFromData(sk_sp< SkData > data, const fml::RefPtr< fml::TaskRunner > &task_runner)
This is the Android owner of the core engine Shell.
const flutter::Settings & GetSettings() const
std::unique_ptr< AndroidShellHolder > Spawn(std::shared_ptr< PlatformViewAndroidJNI > jni_facade, const std::string &entrypoint, const std::string &libraryUrl, const std::string &initial_route, const std::vector< std::string > &entrypoint_args) const
This is a factory for a derived AndroidShellHolder from an existing AndroidShellHolder.
void NotifyLowMemoryWarning()
void UpdateDisplayMetrics()
fml::WeakPtr< PlatformViewAndroid > GetPlatformView()
Rasterizer::Screenshot Screenshot(Rasterizer::ScreenshotType type, bool base64_encode)
void Launch(std::unique_ptr< APKAssetProvider > apk_asset_provider, const std::string &entrypoint, const std::string &libraryUrl, const std::vector< std::string > &entrypoint_args)
AndroidShellHolder(const flutter::Settings &settings, std::shared_ptr< PlatformViewAndroidJNI > jni_facade)
static bool IsRunningPrecompiledCode()
Checks if VM instances in the process can run precompiled code. This call can be made at any time and...
static std::unique_ptr< IsolateConfiguration > CreateForAppSnapshot()
Creates an AOT isolate configuration using snapshot symbols present in the currently loaded process....
static std::unique_ptr< IsolateConfiguration > CreateForKernel(std::unique_ptr< const fml::Mapping > kernel)
Creates a JIT isolate configuration using the specified snapshot. This is a convenience method for th...
ScreenshotType
The type of the screenshot to obtain of the previously rendered layer tree.
static std::unique_ptr< Shell > Create(const PlatformData &platform_data, const TaskRunners &task_runners, Settings settings, const CreateCallback< PlatformView > &on_create_platform_view, const CreateCallback< Rasterizer > &on_create_rasterizer, bool is_gpu_disabled=false)
Creates a shell instance using the provided settings. The callbacks to create the various shell subco...
std::function< std::unique_ptr< T >(Shell &)> CreateCallback
fml::RefPtr< fml::TaskRunner > GetIOTaskRunner() const
static std::unique_ptr< FileMapping > CreateReadOnly(const std::string &path)
static void EnsureInitializedForCurrentThread()
fml::RefPtr< fml::TaskRunner > GetTaskRunner() const
static FML_EMBEDDER_ONLY MessageLoop & GetCurrent()
@ kNormal
Default priority level.
@ kRaster
Suitable for thread which raster data.
@ kBackground
Suitable for threads that shouldn't disrupt high priority work.
@ kDisplay
Suitable for threads which generate data for the display.
static void SetCurrentThreadName(const ThreadConfig &config)
#define FML_DLOG(severity)
#define FML_LOG(severity)
#define FML_DCHECK(condition)
static PlatformData GetDefaultPlatformData()
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified vm service A custom Dart VM Service port The default is to pick a randomly available open port disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode disable vm service Disable mDNS Dart VM Service publication Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set endless trace buffer
static void AndroidPlatformThreadConfigSetter(const fml::Thread::ThreadConfig &config)
@ kPerformance
Request CPU affinity for the performance cores.
@ kEfficiency
Request CPU affinity for the efficiency cores.
@ kNotPerformance
Request affinity for all non-performance cores.
bool RequestAffinity(CpuAffinity affinity)
Request the given affinity for the current thread.
static constexpr SkISize MakeEmpty()
A POD type used to return the screenshot data along with the size of the frame.
std::optional< ThreadConfig > io_config
std::optional< ThreadConfig > ui_config
std::optional< ThreadConfig > raster_config
static std::string MakeThreadName(Type type, const std::string &prefix)
Use the prefix and thread type to generator a thread name.
The ThreadConfig is the thread info include thread name, thread priority.