Comment porter le SDK Flutter sur un boßtier TV pour développer et exécuter des applications Android TV

Nous avons rĂ©cemment portĂ© avec succĂšs le framework Flutter sur un boĂźtier TV avec une plate-forme logicielle RDK open source. Dans cet article, nous discuterons des dĂ©fis auxquels nous avons Ă©tĂ© confrontĂ©s et proposerons des solutions pour rĂ©ussir le lancement et l'amĂ©lioration des performances. 





Étant donnĂ© que la pile logicielle RDK ou le kit de conception de rĂ©fĂ©rence est maintenant activement utilisĂ© pour dĂ©velopper des applications OTT, la commande vocale pour les dĂ©codeurs et d'autres fonctionnalitĂ©s avancĂ©es de vidĂ©o Ă  la demande (VoD), nous voulions voir si Flutter pouvait fonctionner sur un dĂ©codeur numĂ©rique. Il s'est avĂ©rĂ© que oui, mais, comme c'est gĂ©nĂ©ralement le cas, il y a des nuances.





Ensuite, nous décrirons étape par étape le processus de portage et d'exécution de Flutter sur les plates-formes Linux embarquées et verrons comment ce SDK open source de Google se sent sur du matériel avec des ressources limitées et des processeurs ARM.





Flutter , -. « EFL + Wayland», node.js . , EFL — . node.js event-loop . Flutter . 





, : SDK Google . Android. , iOS, Linux Google Fuchsia. :-) Flutter — Dart, JavaScript. 





: Flutter - ? , Wayland + OpenGL. neon-? , , UI dart , Linux -.





Flutter Engine - ARM 

, . Futter Wayland + OpenGL ES. Flutter Skia, OpenGL ES, . 





Flutter ( - RDK), , . , .. - intel x86 . ARM-. 





, Flutter Engine:





./flutter/tools/gn \
      --embedder-for-target \
      --target-os linux \
      --linux-cpu arm \ 
      --target-sysroot DEVICE_SYSROOT
      --disable-desktop-embeddings \ 
      --arm-float-abi hard 
      --target-toolchain /usr 
      --target-triple arm-linux-gnueabihf 
      --runtime-mode debug
ninja -C out/linux_debug_unopt_arm
      
      



: 32- ARM- Linux, --embedder-for-target



--disable-desktop-embeddings







clang 9 , .. Flutter, - gcc . — target-sysroot



RDK.





, , . flutter_engine.so . 





flutter/dart /. :





flutter --local-engine-src-path PATH_TO_BUILDED_ENGINE_src 
--local-engine=host_debug_unopt build bundle
      
      



! , , .. x86_64!





gn ninja x86_64! host_debug_unopt.





PATH_TO_BUILDED_ENGINE_src — , engine/src/out.





Flutter Engine embedder, Flutter Skia Dart-. Flutter linux-embedder, , , GTK-embedder, . , - GTK. 





, (,   , , github.com). GTK, , GTK-.





flutter-? , flutter_engine.so





FlutterEngineRun(FLUTTER_ENGINE_VERSION, &config, &args, display /* userdata */, &engine_);





( flutter bundle) FlutterProjectArgs args FlutterRendererConfig config. 





bundle-, flutter-, OpenGL .





// github.com (flutter_application.cc)





, . 





 

, . ? :-) 





1.





, — . , egl- , FlutterRendererConfig , — . - . , eglBindAPI eglGetDisplay, nexus- ( BCM). Linux , . 





:





egl_display_ = eglGetDisplay(display_);

if (egl_display_ == EGL_NO_DISPLAY) {
  LogLastEGLError();
  FL_ERROR("Could not access EGL display.");
  return false;
}

if (eglInitialize(egl_display_, nullptr, nullptr) != EGL_TRUE) {
  LogLastEGLError();
  FL_ERROR("Could not initialize EGL display.");
  return false;
}

if (eglBindAPI(EGL_OPENGL_ES_API) != EGL_TRUE) {
  LogLastEGLError();
  FL_ERROR("Could not bind the ES API.");
  return false;
}
      
      



// github.com (wayland_display.cc) — , .. .





, , - :-).





2.





. , , (debug mode). - , - — , , - EFL+Node.js.





. SDK Flutter AOT, jit, , -  Flutter. , .





, FlutterEngineRun





// — github.com (elf.cc)





vm_snapshot_instructions_ = dlsym(fd, "_kDartVmSnapshotInstructions");

if (vm_snapshot_instructions_ == NULL) {
  error_ = strerror(errno);
  break;
}

vm_isolate_snapshot_instructions_ = dlsym(fd, "_kDartIsolateSnapshotInstructions");

if (vm_isolate_snapshot_instructions_ == NULL) {
  error_ = strerror(errno);
  break;
}

vm_snapshot_data_ = dlsym(fd, "_kDartVmSnapshotData");

if (vm_snapshot_data_ == NULL) {
  error_ = strerror(errno);
  break;
}

vm_isolate_snapshot_data_ = dlsym(fd, "_kDartIsolateSnapshotData");

if (vm_isolate_snapshot_data_ == NULL) {
  error_ = strerror(errno);
  break;
}
      
      



if (vm_snapshot_data_ == NULL || 
vm_snapshot_instructions_ == NULL || 
vm_isolate_snapshot_data_ == NULL || 
vm_isolate_snapshot_instructions_ == NULL) {
  return false;
}

*vm_snapshot_data = reinterpret_cast <
  const uint8_t * > (vm_snapshot_data_);

*vm_snapshot_instructions = reinterpret_cast <
  const uint8_t * > (vm_snapshot_instructions_);

*vm_isolate_snapshot_data = reinterpret_cast <
  const uint8_t * > (vm_isolate_snapshot_data_);

*vm_isolate_snapshot_instructions = reinterpret_cast <
  const uint8_t * > (vm_isolate_snapshot_instructions_);
      
      



FlutterProjectArgs args;
//     args
args.vm_snapshot_data = vm_snapshot_data;
args.vm_snapshot_instructions = vm_snapshot_instructions;
args.isolate_snapshot_data = vm_isolate_snapshot_data;
args.isolate_snapshot_instructions = vm_isolate_snapshot_instructions;
      
      



, , , AOT- . , dart-:





$HOST_ENGINE/dart-sdk/bin/dart \
--disable-dart-dev \
$HOST_ENGINE/gen/frontend_server.dart.snapshot \
--sdk-root $DEVICE_ENGINE}/flutter_patched_sdk/ \
--target=flutter \
-Ddart.developer.causal_async_stacks=false \
-Ddart.vm.profile=release \
-Ddart.vm.product=release \
--bytecode-options=source-positions \
--aot \
--tfa \
--packages .packages \
--output-dill build/tmp/app.dill \
--depfile build/kernel_snapshot.d \
package:lib/main.dart

$DEVICE_ENGINE/gen_snapshot                               \
    --deterministic                                             \
    --snapshot_kind=app-aot-elf                                 \
    --elf=build/lib/libapp.so                                   \
    --no-causal-async-stacks                                    \
    --lazy-async-stacks                                         \
    build/tmp/app.dill
      
      



, . :



-Ddart.vm.profile=release \

-Ddart.vm.product=release \








, .





output-dill



libapp.so. 





$DEVICE_ENGINE $HOST_ENGINE — (ARM) - (x86_64) . , libapp.so 32- ARM-:





$ file libapp.so 
libapp.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), 
dynamically linked
      
      



---... ! — ! 





! EFL. . 





3.





, Wayland , .





4. - Linux Android 2—3  





, UI-. UI , Linux Android. Flutter .





dart- . ( ). __brcm_cpu_dcache_flush khrn_copy_8888_to_tf32 ( Broadcom/BCM ). - . : : 





//...
filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
//...
      
      



— 50-60 fps. , Flutter , - , .





, Flutter . RDK Wayland :



github.com/DEgITx/flutter_wayland





Nous espérons que l'expérience de notre équipe dans le développement et le portage de logiciels pour décodeurs et Smart TV vous sera utile dans vos projets et servira de point de départ pour le portage de Flutter sur d'autres appareils.





[!?] Les questions et commentaires sont les bienvenus. Ils recevront une réponse de l'auteur de l'article Alexey Kasyanchuk, notre ingénieur logiciel








All Articles