Fuchsia をビルドしてエミュレータでFlutter アプリを実行はまだ早かった

公開:2020/12/10
更新:2020/12/10
9 min読了の目安(約8800字TECH技術記事

先日、Fuchsia が一般公開されましたね。

これは、Fuchsia エミュレータで、Flutter アプリを実行してみないと!っと

まずは、チュートリアルを見ながら Fuchsia をビルドしてエミュレーターを起動してみました。

注:Fuchsiaソースをダウンロードするには、ディスクに最大2GBのスペースが必要です。Fuchsiaをビルドするときにさらに80〜90GBのスペースが必要です。

Fuchsiaのソースコードを入手

$ cd ~
$ curl -s "https://fuchsia.googlesource.com/fuchsia/+/HEAD/scripts/bootstrap?format=TEXT" | base64 --decode | bash

失敗...

cipd bootstrapped to path:"/Users/you/fuchsia/.jiri_root/bin/cipd"
Please add /Users/you/fuchsia/.jiri_root/bin to your PATH
[17:56:40.507] Updating all projects
[17:56:42.645] Jiri packages are not fetched due to fatal errors when updating projects.
[17:56:42.645] Jiri hooks are not run due to fatal errors when updating projects or packages
ERROR: invalid hook "gen-ssh-keys" for project "fuchsia". Please make sure you are importing project "fuchsia" and this hook is in the manifest which directly/indirectly imports that project., Creating project "fuchsia": 'git init --initial-branch=master /Users/you/fuchsia' failed:
stdout:

stderr:
error: unknown option `initial-branch=master'
usage: git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [<directory>]

    --template <template-directory>
                          directory from which templates will be used
    --bare                create a bare repository
    --shared[=<permissions>]
                          specify that the git repository is to be shared amongst several users
    -q, --quiet           be quiet
    --separate-git-dir <gitdir>
                          separate git dir from working tree


command fail error: exit status 129

※ ローカルの git が --initial-branch オプションに対応して無かったので最新にアップデートします。

$ git --version
git version 2.20.1
$ which git
/usr/local/bin/git
$ ls -la /usr/local/bin/git
lrwxr-xr-x  1 you  admin  28  2 18  2019 /usr/local/bin/git -> ../Cellar/git/2.20.1/bin/git
$ brew install git
Error: git 2.20.1 is already installed
To upgrade to 2.29.2, run `brew upgrade git`.
$ brew upgrade git

$ git --version
git version 2.29.2
$ which git
/usr/local/bin/git
$ ls -l /usr/local/bin/git
lrwxr-xr-x  1 you  admin  28 12  9 19:21 /usr/local/bin/git -> ../Cellar/git/2.29.2/bin/git
$ curl -s "https://fuchsia.googlesource.com/fuchsia/+/HEAD/scripts/bootstrap?format=TEXT" | base64 --decode | bash
cipd bootstrapped to path:"/Users/you/fuchsia/.jiri_root/bin/cipd"
Please add /Users/you/fuchsia/.jiri_root/bin to your PATH
[20:49:35.105] Updating all projects
[20:52:25.711] WARN: Some packages are skipped by cipd due to lack of access, you might want to run "/Users/you/fuchsia/.jiri_root/bin/cipd auth-login" and try again
Done creating a Platform Source Tree at "/Users/you/fuchsia".
Recommended: export PATH="/Users/you/fuchsia/.jiri_root/bin:$PATH"

OK!

環境変数設定

  • .jiri_root/bin ディレクトリを PATH に追加します。

    .jiri_root/bin ディレクトリに含まれている jiri と fx ツールが含まれてます。jiri は、リポジトリ管理ツール、fix は構成、ビルド、実行やデバッグで使用します。

  • scripts/fx-env.sh の実行

    シェルに便利な機能を追加してくれるようです。

.bashrc, .zshrc に以下を追加します。

export PATH=~/fuchsia/.jiri_root/bin:$PATH
source ~/fuchsia/scripts/fx-env.sh

Fuchsiaの構成と構築

ビルド構成を設定

次のコマンドでビルド構成を設定します。

$ fx set {product}.{board}

今回は、Fuchsia エミュレーター を使用したので、次の通り実行します。

$ fx set core.qemu-x64

product

fx list-products で、使用可能な product の一覧が表示できます。
GUIやマルチメディアなどユーザーエクスペリエンスに関連する種類の定義です。

$ fx list-products
bringup
core
terminal
workstation

board

fx list-boards で、使用可能な board の一覧が表示できます。デバイスのアーキテクチャ関連の定義です。

$ fx list-boards
*
arm64
as370
c18
chromebook-x64
cleo
kirin970
msm8998
msm8x53-som
mt8167s_ref
qemu-arm64
qemu-x64
toulouse
vim2
vim3
vs680
x64-reduced-perf-variation
x64

ビルドを高速化

ビルドを高速化にするために、Goma, ccache が使用できます。

Goma

Gomaは、Chromium や Android などのオープンソースプロジェクト向けの分散コンパイラサービスです。

ccache

ccacheは、コンパイラキャッシュです。 以前のコンパイルをキャッシュして、再コンパイルを高速化します。

今回は Goma を使用したので、次のコマンドで Gomaクライアントを有効にします

$ fx goma

Goma Client 設定が必要です

/Users/you/fuchsia/out/default has Goma disabled.
/Users/you/fuchsia/out/default uses prebuilt Goma client.
*** Run `fx goma --update` to reset this build to defaults.
*** Or else just do a fresh `fx set` to get the right defaults!

今回は、Goma Client を Reset しました。

$ fx goma --update

利用規約などの説明が表示されます

*** Enabling Goma in /Users/you/fuchsia/out/default...
/Users/you/fuchsia/out/default uses prebuilt Goma client.
*** Running `fx gen` after /Users/you/fuchsia/out/default/args.gn updates...
Generating compile_commands took 262ms
Generating rust-project.json took 208ms
Done. Made 78592 targets from 4513 files in 18295ms
Not logged in
You can use Goma (distributed compiler service) if you agree on the
way we use data and the way we share data.

1. How do we use data?
a. the data used for compiling
- source code (including contents and file paths) to be compiled.
- header files (including contents and file paths) used during the compile.
- other files accessed by compilers. e.g. asan_blacklist.txt, crtbegin.o,
  profiling data for pgo.
- identifier of a compiler to use. (SHA256 hash value of a compiler, version,
  target).
- command line arguments and environment variables necessary for a compile,
  system include paths, current working directory.

b. the data used for authentication
- OAuth2 access token to use service, and email address gotten from access
  token.

Google may use data for logging and tracking (including abuse detection).
Google keeps identifier of each compile (goma client start time, goma client
id that changes when compiler_proxy starts, sequential compile id)

2. What data will be shared?

Contents in source code and header files are stored in Google servers and
shared among users who send SHA256 hash values of them.  Compile results
are shared among users who have sent the requests that bring the same
compile result.

3. How long data will be kept?

Contents in source code and header files will be kept at most 153 days
since last used.

Do you agree to our data usage policy? (y/n) -->y
You have agreed.
Please visit following URL with your browser, and approve access:
https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&client_id=123456789012-abcdefgrijklmnopqrstuvwxyz.apps.googleusercontent.com&response_type=code
Please input the code:...
Login as ...
Current user is not registered with Goma service at https://rbe-prod1.endpoints.fuchsia-infra-goma-prod.cloud.goog with GOMA_RPC_EXTRA_PARAMS="". Unable to use Goma.

ビルド

次のコマンドを実行してビルドします。

$ fx build

ビルドは最大90分かかる場合があります。

この間、放置して、ご飯や風呂を済ませまます。

ninja: Entering directory `/Users/you/fuchsia/out/default.zircon'
[9694/9694] ACTION //kernel:kernel._build(//kernel:kernel-x64-clang)
ninja: Entering directory `/Users/you/fuchsia/out/default'
[7747/18787] ACTION //src/lib/vulkan/compact_image:gen_spv_shaders(//build/toolchain/fuchsia:x64-shared)
../../src/lib/vulkan/compact_image/pack.comp
[7748/18787] ACTION //src/lib/vulkan/compact_image:gen_spv_shaders(//build/toolchain/fuchsia:x64-shared)
../../src/lib/vulkan/compact_image/unpack.comp
[18787/18787] ACTION //build/images:elf_sizes.json(//build/toolchain/fuchsia:x64)

成功

Fuchsia Emulator (FEMU) 起動

FEMU 起動

fx vdl start --host-gpu

起動しました!!

FEMU

Android Emulator に似てますね。
FEMU は Android Emulator (AEMU)がベースになっています。

しかし... 黒い!黒い画面!! ですね...

(試しに ls コマンドを叩いてみています)

fuchsia/example ディレクトリにサンプルアプリがあるようなので眺めてみます。

fuchsia/example

定番の Hello, World! がありました。
hello_world の下には、

  • cpp/
  • dart/
  • rust/
  • BUILD.gn

BUILD.gn ???
ninja 用のビルドメタファイルらしい...
ニンジャ!!!

dart/lib/main.dart

import 'package:fuchsia/fuchsia.dart' as fuchsia;

void main(List<String> args) {
  print('Hello, World!');
  fuchsia.exit(0);
}

print するだけのいつものやつですね。
GUIアプリは無さそう
Flutter の実行環境も、skia も無いのではないか...

hello_world 実行

hello_world アプリを含めて Fuchsia を再ビルドします。

$ fx set core.x64 --with //examples/hello_world
$ fx build

エミュレータを起動します。

$ fx vdl start --host-gpu

起動ログの最後の行に ssh のポートが表示されます。

To support fx tools on emulator, please run "fx set-device 127.0.0.1:58893"

ssh を設定します。

$ fx set-device 127.0.0.1:58893

fx serve を実行します。

$ fx serve

別のターミナルで hello_world を実行してみます。

$ fx shell run fuchsia-pkg://fuchsia.com/hello_world_cpp#meta/hello_world_cpp.cmx

ターミナルに標準出力されます!

Hello, World!

エミュレータではなく、ターミナルに!

なるほど、わからん

Flutter までたどり着くまでは、まだまだ遠かったようだ。

私には、Fuchsia をビルドしてエミュレータでFlutterアプリ実行するにはまだ早かったようです...