Pink + Purple == Fuchsia (Neues Betriebssystem von Google)

Unter Fuchsia.dev gibt es seit heute Morgen nun endlich tonnenweise offizielle Fuchsia Dokumentation zu dem neu vorgestellten Google Betriebssystem.

Die Website wurde schon während der diesjährigen Google IO vorgestellt, hat bisher aber nur wenig Inhalte enthalten. Das hat sich nun geändert und unter fuchsia.dev können sich interessierte Entwickler schon über das neue Betriebssystem informieren.

Fuchsia.dev als Progressive Web App (PWA) auf Mobilgeräten installiert werden und steht so als eine praktische Referenz für die Fuchsia OS-Dokumentation im zur Verfügung.

Warum Fuchsia?

Warum genau sich Google nun für ein neues Betriebssystem entschieden hat ist nicht ganz klar. Am wahrscheinlichsten ist es aber, dass Google seine aktuellen Betriebssysteme Android, WearOS, Android TV und ChomeOS zu einer Platform konsolidieren möchte um in Zukunft schneller und agiler agieren zu können, da die Fragmentierung der Betriebssysteme bei Google in den letzten Jahren stark zugenommen hat was zu einer Lähmung bei der Weiterentwicklung und Verbesserungen der Produkte geführt hat.

Des weiteren soll Fuchsia sehr stark auf Sprachsteuerung setzen und damit endlich ein Betriebssystem werden, bei dem die Sprachsteuerung gut integriert ist un alles auch mit der Stimme gesteuert werden kann. Diese könnte in Zukunft ein wesentliches Kriterium für den Erfolg sein, da alle anderen existierenden Voice Systeme keine (oder nur eine unzureichende) Integration in das Betriebssystem besitzen und nur begrenzte Möglichkeiten bieten.

Erste Schritte um mit Fuchsia auf dem Mac zu beginnen

Als erstes muss die Build-Umgebung vorbereitet werden. Dazu müssen die Xcode Command Line Tools mit dem folgenden Befehl installiert werden.

/usr/bin/xcode-select --install

Sind die Xcode Command Line Tools schon installiert, wird folgende Meldung ausgegeben xcode-select: error: command line tools are already installed, use “Software Update” to install updates.

Fuchsia verwendet das Jiri-Tool zum Verwalten von Git-Repositorys https://fuchsia.googlesource.com/jiri. Dieses Tool verwaltet eine Reihe von Repositorys, die von einem Manifest angegeben werden. Dafür ist wiederum die Programmiersprache Go notwendig, die installiert werden muss.

Download Go unter https://golang.org/
Der Go installer führt durch die installation und die installation dauert nur wenige Minuten. Nach der Installation ist die Go-Distribution unter /usr/local/go installiert.
Das go tool steht nach der installation unter /usr/local/go/bin/go zur verfügung und kann bei Bedarf in die PATH Variable eingebunden werden.

Jiri muss auf dem Mac manuell erstellt werden, da nur für Linux vorkompilierte Binaries zur Verfügung stehen. Die Sourcen von jiri werden dazu in das Verzeichnis /usr/local/go/src/fuchsia.googlesource.com/jiri geklont. Um Jiri neu zu erstellen, wird einfach der folgenden Befehl im Terminal Fenster eingegeben:

sudo git clone https://fuchsia.googlesource.com/jiri /usr/local/go/src/fuchsia.googlesource.com/jiri
Password: ########
Cloning into '/usr/local/go/src/fuchsia.googlesource.com/jiri'...
remote: Total 10048 (delta 5822), reused 10048 (delta 5822)
Receiving objects: 100% (10048/10048), 5.85 MiB | 1.27 MiB/s, done.
Resolving deltas: 100% (5822/5822), done.

Um Jiri neu zu erstellen, muss der folgende Befehl eingegeben werden:

go get golang.org/x/net/publicsuffix golang.org/x/sync/semaphore
sudo go install fuchsia.googlesource.com/jiri/cmd/jiri

Nach der erfolgreichen installation steht das jiri Kommando mit seinen umfangreichen Optionen zur Verfügung.

$ jiri --help
Command jiri is a multi-purpose tool for multi-repo development.

Usage:
   jiri [flags] <command>

The jiri commands are:
   branch              Show or delete branches
   bootstrap           Bootstrap essential packages
   diff                Prints diff between two snapshots
   edit                Edit manifest file
   fetch-packages      Fetch cipd packages using JIRI_HEAD version manifest
   generate-gitmodules Create a .gitmodule and a .gitattributes files for git submodule repository
   grep                Search across projects.
   import              Adds imports to .jiri_manifest file
   init                Create a new jiri root
   package             Display the jiri packages
   patch               Patch in the existing change
   project             Manage the jiri projects
   project-config      Prints/sets project's local config
   manifest            Reads <import>, <project> or <package> information from a manifest file
   override            Add overrides to .jiri_manifest file
   resolve             Generate jiri lockfile
   run-hooks           Run hooks using local manifest
   runp                Run a command in parallel across jiri projects
   selfupdate          Update jiri tool
   snapshot            Create a new project snapshot
   source-manifest     Create a new source-manifest from current checkout
   status              Prints status of all the projects
   update              Update all jiri projects
   upload              Upload a changelist for review
   version             Print the jiri version
   help                Display help for commands or topics
Run "jiri help [command]" for command usage.

The jiri additional help topics are:
   filesystem     Description of jiri file system layout
   manifest-files Description of manifest files
Run "jiri help [topic]" for topic details.

The global flags are:
 -color=auto
   Use color to format output. Values can be always, never and auto
 -j=8
   Number of jobs (commands) to run simultaneously
 -metadata=<just specify -metadata to activate>
   Displays metadata for the program and exits.
 -progress-window=5
   Number of progress messages to show simultaneously. Should be between 1 and 10
 -q=false
   Same as -quiet
 -quiet=false
   Only print user actionable messages.
 -root=
   Jiri root directory
 -show-progress=true
   Show progress.
 -show-root=<just specify -show-root to activate>
   Displays jiri root and exits.
 -time=false
   Dump timing information to stderr before exiting the program.
 -time-log-threshold=10s
   Log time taken by operations if more than the passed value (eg 5s). This only works with -v and -vv.
 -v=false
   Print debug level output.
 -vv=false
   Print trace level output.

Damit ist die Installation der benötigten Tools abgeschlossen. Nun kann mit dem folgenden Befehl Fuchsia installiert werden. Das Skript richtet die Entwicklungsumgebung so ein, dass der HEAD des Fuchsia-Repositorys genutzt wird.

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


~/fuchsia/.jiri_root/bin ~
cipd bootstrapped to path:"/Users/michaeljentsch/fuchsia/.jiri_root/bin/cipd"
~
Please add /Users/michaeljentsch/fuchsia/.jiri_root/bin to your PATH
WARN: Please opt in or out of analytics collection. You will receive this warning until an option is selected.
To check what data we collect run 'jiri init -show-analytics-data'
To opt-in run 'jiri init -analytics-opt=true "/Users/michaeljentsch/fuchsia"'
To opt-out run 'jiri init -analytics-opt=false "/Users/michaeljentsch/fuchsia"'

WARN: Please opt in or out of analytics collection. You will receive this warning until an option is selected.
To check what data we collect run 'jiri init -show-analytics-data'
To opt-in run 'jiri init -analytics-opt=true "/Users/michaeljentsch/fuchsia"'
To opt-out run 'jiri init -analytics-opt=false "/Users/michaeljentsch/fuchsia"'

WARN: Please opt in or out of analytics collection. You will receive this warning until an option is selected.
To check what data we collect run 'jiri init -show-analytics-data'
To opt-in run 'jiri init -analytics-opt=true "/Users/michaeljentsch/fuchsia"'
To opt-out run 'jiri init -analytics-opt=false "/Users/michaeljentsch/fuchsia"'

Updating all projects
PROGRESS: Creating project "fuchsia"
PROGRESS: Creating project "topaz"
PROGRESS: Creating project "third_party/grpc"
PROGRESS: Creating project "third_party/googleapis"
PROGRESS: Creating project "dart/sdk"
PROGRESS: Creating project "third_party/mesa"
PROGRESS: Creating project "external/skia.googlesource.com/skia"
PROGRESS: Creating project "third_party/icu"
PROGRESS: Creating project "external/github.com/catapult-project/catapult"
PROGRESS: Creating project "third_party/go"
PROGRESS: Creating project "third_party/vulkan-cts"
PROGRESS: Creating project "external/github.com/flutter/engine"
PROGRESS: Creating project "third_party/boringssl"
PROGRESS: Creating project "third_party/rust-mirrors/rand"
PROGRESS: Creating project "third_party/glslang"
PROGRESS: Creating project "third_party/golibs/golang.org/x/sys"
PROGRESS: Creating project "third_party/golibs/golang.org/x/net"
PROGRESS: Creating project "third_party/android/platform/system/core"
PROGRESS: Creating project "third_party/android/platform/frameworks/av"
PROGRESS: Creating project "third_party/android/platform/frameworks/native"
PROGRESS: Creating project "dart/sdk"
PROGRESS: Creating project "third_party/boringssl/src"
PROGRESS: Fetching CIPD packages

Der Prozess dauert relativ lange, aber danach ist fuchsia installiert und kann konfiguriert werden. (Sollte ein anderes Repository verwendet werden soll, kann diese mit dem Befehl fx set-petal umgestellt werden).

Bei Erfolg sollte das Skript eine Meldung ausgeben, in der empfohlen wird, das Verzeichnis .jiri_root/bin zur $PATH Variable hinzufügen.

export PATH=$PATH:$HOME/fuchsia/.jiri_root/bin

Dies fügt jiri zum $PATH hinzu, was von anderen Teilen der Fuchsia-Toolchain übernommen wird. Ein weiteres Tool in fuchsia/scripts ist fx, das beim Konfigurieren, Erstellen, Ausführen und Debuggen von Fuchsia hilft. In der fx-Hilfe finden Sie alle verfügbaren Befehle.

fx help
usage: fx [--dir BUILD_DIR] [-d DEVICE_NAME] [-i] [-x] COMMAND [...]

Run Fuchsia development commands. Must be run with either a current working
directory that is contained in a Platform Source Tree or the FUCHSIA_DIR
environment variable set to the root of a Platform Source Tree.

commands:
gn                          
ninja                       
add-update-source           register dev host as target's update source
aemu                        start fuchsia in aemu
args                        `gn args` the FUCHSIA_BUILD_DIR
blobstats                   compute some blobfs statistics from the build
bugreport                   Obtain and parse a bugreport from a connected target.
build                       Run Ninja to build Fuchsia
build-push                  build Fuchsia and push to device
check-deps                  checks dependency graph in areas
clang-tidy                  runs clang-tidy on specified files
clean                       `gn clean` the ZIRCON_BUILDROOT and FUCHSIA_BUILD_DIR
clean-build                 clean the build directory and then perform a full build
compdb                      generate a compilation database for the current build configuration
cp                          copy a file to/from a target device
dart-remote-test            runs a single remote test target through //scripts/run-dart-action.py
dart-tunnel                 forward local ports to Dart VMs on the device.
debug                       run the debug agent on target and connect to it with zxdb
debug-report                generate a report with component exposed data
delta                       compare all built Fuchsia packages with a prior package snapshot
doctor                      run various checks to determine the health of a Fuchsia checkout
exec                        read the current build config, then exec
exec-host-tests             
fidlcat                     run fidlcat on given target.
flash                       
flutter-attach              attach to a running flutter module to enable hot reload and debugging
format-code                 runs source formatters on modified files
fuzz                        run a fuzz test on target a device
gce                         Google Compute Engine commands
gen                         `gn gen` the Zircon and Fuchsia build directories.
gen-cargo                   Runs a Rust helper script inside the fx environment
get-build-dir               print the current fuchsia build directory
get-device                  print the current selected device name
get-device-addr             print the Fuchsia IPv6 address of the current selected device
iquery                      generate a report with component exposed data
lint                        runs source linters on modified files
list-boards                 list boards available for building
list-packages               list packages are built
list-products               list products available for building
list-usb-disks              list attached usb disks
log                         listen for kernel logs.
make-fuchsia-vol            build a fuchsia persistent disk
make-integration-patch      Creates a CL in an integration repository suitable for testing other CLs
metrics                     manage collection of metrics in fx tools
mkzedboot                   make a zedboot USB key
multi                       Run an `fx` command across multiple build directories.
net-run                     run Fuchsia on QEMU in background and runs SSH command after netstack runs
netaddr                     get the address of a running fuchsia system
netboot                     run bootserver for netbooting
netls                       list running fuchsia systems on the local network
old-symbolize               symbolize call stacks provided as input
ota                         do a system OTA
pave                        run bootserver for paving
pending-commits             view commits not yet published to global integration
push-package                push packages to a device
reboot                      reboot a target fuchsia system
run                         start fuchsia in qemu with a FVM disk
run-dart-action             Run Dart actions (analysis, test, target-test)
run-e2e-tests               run e2e tests
run-host-tests              build and run tests on host
run-netboot                 start fuchsia in qemu via netboot
run-recovery                start Fuchsia System Recovery in qem
run-test                    build a test package and run on target.
run-test-component          build a test package and run on target.
rustdoc                     Runs a Rust helper script inside the fx environment
rustfmt                     Runs a Rust helper script inside the fx environment
save-package-stats          take a snapshot of all built Fuchsia packages
scp                         invoke scp with the build ssh config
screenshot                  takes a screenshot and copies it to the host
serial                      attach to a serial console
serve                       start `pave` and `serve-updates` in a single command
serve-updates               start the update server and attach to a running fuchsia device
set                         set up a build directory
set-build-dir               set the default build directory used by other fx commands
set-clock                   set the clock on target using host clock
set-device                  set the default device to interact with
set-petal                   configure jiri to manage a specific petal
set-relay                   
setup-macos                 register Zircon tools at MacOS Application Firewall
setup-usb-ethernet          Setup udev rules for USB CDC ethernet
sftp                        invoke sftp with the build ssh config
shell                       start a remote interactive shell in the target device
ssh                         invoke ssh with the keys from $FUCHSIA_BUILD_DIR/ssh-keys
symbolize                   symbolize backtraces and program locations provided as input on stdin
syslog                      listen for logs
unset-device                unset the default device to interact with
update                      do a full update of a target system
update-rustc-crate-map      Runs a Rust helper script inside the fx environment
update-rustc-third-party    updates rustc_library and rustc_binary third_party dependencies
use                         re-use a previous build directory set up by `fx set`
vendor                      forward commands to vendor/*/scripts/devshell
verify-build-packages       verify the structure of the build package directory in a layer
wait                        wait for a shell to become available

optional arguments:
  --dir=BUILD_DIR       Path to the build directory to use when running COMMAND.
  -d=DEVICE_NAME        Target a specific device. DEVICE_NAME may be a Fuchsia
                        device name. Note: "fx set-device" can be used to set a
                        default DEVICE_NAME for a BUILD_DIR.
  -i                    Iterative mode.  Repeat the command whenever a file is
                        modified under your Fuchsia directory, not including
                        out/.
  -x                    Print commands and their arguments as they are executed.

optional shell extensions:
  fx-go
  fx-update-path
  fx-set-prompt

To use these shell extensions, first source fx-env.sh into your shell:

  $ source scripts/fx-env.sh

Es kann auch das vorkonfigurierte Skript fuchsia/scripts/fx-env.sh verwendet werden, aber die Nutzung von fx-env.sh. Das Shell-Script definiert einige Umgebungsvariablen, die in der Dokumentation häufig verwendet werden, z. B. $ FUCHSIA_DIR. Ausserdem bietet es nützliche Shell-Funktionen, z. B. fd, um Verzeichnisse effektiv zu ändern. Weitere Informationen dazu findet man in den Kommentaren der Datei scripts/fx-env.sh.

Mit dem folgenden Befehl generiert das Build-System selbst in einem Ausgabeverzeichnis (z. B. out/x64).

fx set core.x64 --with //bundles:kitchen_sink
WARNING: Please opt in or out of fx metrics collection.
You will receive this warning until an option is selected.
To check what data we collect, run `fx metrics`
To opt in or out, run `fx metrics <enable|disable>

ERROR at //BUILD.gn:123:3: Script returned non-zero exit code.
  exec_script("//buildtools/gn", gn_cmd)
  ^----------
Current dir: /Users/michaeljentsch/fuchsia/out/default/
Command: /usr/bin/env /Users/michaeljentsch/fuchsia/buildtools/gn gen -q --root=../../zircon --args=# THIS FILE IS CLOBBERED.  DO NOT EDIT!
# Instead, edit //out/default/args.gn to add
# zircon_extra_args = { ... } to override settings below.
forward_variables_from({
  default_deps = [":legacy-x64"]
  enable_kernel_debugging_features = false
  enable_netsvc_debugging_features = false
  goma_dir = "/Users/michaeljentsch/goma"
  use_goma = false
  variants = []
}, "*") --export-compile-commands=default ../default.zircon
Returned 1 and printed out:

ERROR at //public/gn/toolchain/clang.gni:30:17: Could not read file.
      read_file("$_prebuilt_dir/.versions/clang.cipd_version", "json")
                ^--------------------------------------------
I resolved this to "/Users/michaeljentsch/fuchsia/zircon/prebuilt/downloads/clang/.versions/clang.cipd_version".
See //public/gn/toolchain/c_toolchain.gni:6:1: whence it was imported.
import("clang.gni")
^-----------------
See //public/gn/toolchain/environment.gni:6:1: whence it was imported.
import("c_toolchain.gni")
^-----------------------
See //public/gn/toolchain/BUILD.gn:6:1: whence it was imported.
import("environment.gni")
^-----------------------
See //public/gn/toolchain/environment_redirect.gni:263:26: which caused the file to be included.
        public_deps += [ "$label($toolchain_name)" ]
                         ^------------------------

Nach ein paar Stunden ohne Erfolg habe ich es hier aufgegeben. Ich habe einige Shell Skripte mit debug Ausgaben erweitert und versucht, herauszufinden wo das Problem liegt, bin aber nicht erfolgreich gewesen. Schade, aber ich werde es sicher in Zukunft mal wieder probieren. Evtl. beim nächsten mal auf einer Linux Umgebung oder einem Windows Rechner.

Fazit

Ob sich Android-Entwickler in der Zukunft auf Fuchsia einstellen müssen oder ob auch weiterhin Java/Kotlin Apps unterstützt werden ist umstritten. Laut heise wird der Android-Nachfolger Fuchsia OS zwar auch Android-Apps mit Hilfe einer Android-Runtime (PROGRESS: Creating project “third_party/android/platform/system/core”) unterstützen, aber ich habe hier meine Zweifel ob das langfristig so bleiben wird, denn schließlich will man ja weg von Android und Co.. Allerdings habe ich während der Installation auch die Zeile “PROGRESS: Creating project “external/github.com/flutter/engine” gesehen und Flutter ist ja ein weiteres Projekt, dass von Google momentan sehr stark voran getrieben wird und in das Bild passen würde.
Aktuell ist Fuchsia jedenfalls noch weit weg vom Erfolg des Android Betriebssystems und ich vermute Google wird noch mindestens 5 Jahre benötigen, bis das neue Betriebssystem die kritische Masse an verfügbaren Geräten erreicht hat um die Masse der Entwickler davon zu überzeugen, für Fuchsia zu programmieren. Ich werde das Projekt auf jeden Fall weiter im Auge behalten und hier darüber berichten.