Fuchsia をビルドしてエミュレータでFlutter アプリを実行はまだ早かった
先日、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
起動しました!!
Android Emulator に似てますね。
FEMU は Android Emulator (AEMU)がベースになっています。
しかし... 黒い!黒い画面!! ですね...
(試しに ls コマンドを叩いてみています)
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アプリ実行するにはまだ早かったようです...
Discussion