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.