提交 bae6bfef 编写于 作者: S Simon Fels

Extend documentation with various additional details

上级 d30e8f1a
# Anbox # Anbox
Anbox is container based approach to boot a full Android system on a Anbox is container based approach to boot a full Android system on a
regular Linux system like Ubuntu. regular GNU Linux system like Ubuntu.
## Overview ## Overview
Anbox uses Linux namespaces (user, pid, uts, net, mount, ipc) to run a Anbox uses Linux namespaces (user, pid, uts, net, mount, ipc) to run a
full Android system in a container and provide Android applications on full Android system in a container and provide Android applications on
any platform. any GNU Linux based platform.
Android inside the container has no direct access to any hardware. All The Android inside the container has no direct access to any hardware.
hardware access is going through the anbox daemon. We're reusing what All hardware access is going through the anbox daemon on the host. We're
Android has implemented for the Qemu based emulator. The Android system reusing what Android implemented within the QEMU based emulator for Open
inside the container uses different pipes to communicate with the host GL ES accelerated rendering. The Android system inside the container uses
system and sends all hardware access commands through these. OpenGL different pipes to communicate with the host system and sends all hardware
rendering is provided through this. access commands through these.
For more details have a look at the following documentation pages: For more details have a look at the following documentation pages:
* Android Hardware OpenGLES emulation design overview * Android Hardware OpenGL ES emulation design overview
(https://goo.gl/O2Yi6x) (https://goo.gl/O2Yi6x)
* Android Qemu fast pipes (https://goo.gl/jl4GeS) * Android QEMU fast pipes (https://goo.gl/jl4GeS)
* The Android "qemud" multiplexing daemon (https://goo.gl/DeYa5J) * The Android "qemud" multiplexing daemon (https://goo.gl/DeYa5J)
* Android Qemud services (https://goo.gl/W8Lx6t) * Android qemud services (https://goo.gl/W8Lx6t)
Anbox is currently suited for the desktop use case but can be used on
mobile operating systems like Ubuntu Touch, Sailfish OS or Lune OS too.
However as the mapping of Android applications is currently desktop specific
this needs additional work to supported stacked window user interfaces too.
The Android runtime environment ships with a minimal customized Android system
image based on the [Android Open Source Project](https://source.android.com/).
The used image is currently based on Android 7.1.1
## Installation ## Installation
As first step you need to install additional kernel drivers for the The installation process currently consists of a few steps which will
Android binder and ashmem subsystems. Those drivers are packaged as add additional components to your host system. These include
a DKMS package for Ubuntu 16.04 already. You can install them from
a ppa with the following commands: * Out-of-tree kernel modules for binder and ashmem as no distribution kernel
ships both enabled.
* A udev rule to set correct permissions for /dev/binder and /dev/ashmem
* A upstart job which starts the Anbox session manager as part of
a user session.
To make this process as easy as possible we have bundled the necessary
steps in a snap (see https://snapcraft.io) called "anbox-installer". The
installer will perform all necessary steps. You can install it on a system
providing support for snaps by running
``` ```
$ sudo apt install software-properties-common $ snap install --classic anbox-installer
$ sudo add-apt-repository ppa:morphis/anbox-support
$ sudo apt update
$ sudo apt install anbox-modules-dkms
``` ```
Anbox is available as a snap in the public Ubuntu Store. Currently it Alternatively you can fetch the installer script via
is only available in the edge channel and requires to be installed in
devmode as we don't have proper confinement for it in place yet.
Anbox can be installed from the Ubuntu Store with
``` ```
$ snap install --edge --devmode anbox $ wget https://raw.githubusercontent.com/anbox/anbox-installer/master/installer.sh -O anbox-installer
``` ```
Please note that we don't support any possible Linux distribution out there
yet. Please have a look at the following chapter to see a list of supported
distributions.
Afterwards run it with To proceed the installation process simply called
``` ```
$ anbox $ anbox-installer
``` ```
After the first installation the container management service needs This will guide you through the installation process.
a few minutes to setup the container the first time before it is
available.
Applications can be launched via the launch subcommand of the anbox **NOTE:** Anbox is currently in a **pre-alpha development state**. Don't expect a
binary. For example fully working system for a production system with all features you need. You will
for sure see bugs and crashes. If you do so, please don't hestitate and report them!
``` **NOTE:** The Anbox snap currently comes **completely unconfined** and is because of
$ anbox launch --package com.android.settings this only available from the edge channel. Proper confinement is a thing we want
``` to achieve in the future but due to the nature and complexity of Anbox this isn't
a simple task.
## Supported Linux Distributions
When installed as snap there will be also a desktop launcher available At the moment we officially support the following Linux distributions:
which will directly start the application viewer activity to give
an overview of available Android applications and allows to start * Ubuntu 16.04 (xenial)
them.
Untested but likely to work:
* Ubuntu 14.04 (trusty)
* Ubuntu 16.10 (yakkety)
* Ubuntu 17.04 (zesty)
## Install and Run Android Applications
## Build from source ## Build from source
To build the Anbox runtime itself there is nothing special to know To build the Anbox runtime itself there is nothing special to know. We're using
about. We're using cmake as build system. cmake as build system. A few build dependencies need to be present on your host
system:
* libdbus
* google-mock
* google-test
* libboost
* libboost-filesystem
* libboost-log
* libboost-iostreams
* libboost-program-options
* libboost-system
* libboost-test
* libboost-thread
* libcap
* libdbus-cpp
* mesa (libegl1, libgles2)
* glib-2.0
* libsdl2
* libprotobuf
* protobuf-compiler
* lxc
On an Ubuntu system you can install all build dependencies with the following
command:
```
$ sudo apt install build-essential cmake cmake-data debhelper dbus google-mock \
libboost-dev libboost-filesystem-dev libboost-log-dev libboost-iostreams-dev \
libboost-program-options-dev libboost-system-dev libboost-test-dev \
libboost-thread-dev libcap-dev libdbus-1-dev libdbus-cpp-dev libegl1-mesa-dev \
libgles2-mesa-dev libglib2.0-dev libglm-dev libgtest-dev liblxc1 \
libproperties-cpp-dev libprotobuf-dev libsdl2-dev lxc-dev pkg-config \
protobuf-compiler
```
Afterwards you can build Anbox with
``` ```
$ mkdir build $ mkdir build
...@@ -83,7 +142,7 @@ $ cmake .. ...@@ -83,7 +142,7 @@ $ cmake ..
$ make $ make
``` ```
That will build the whole stack. A simple A simple
``` ```
$ make install $ make install
...@@ -91,25 +150,51 @@ $ make install ...@@ -91,25 +150,51 @@ $ make install
will install the necessary bits into your system. will install the necessary bits into your system.
## Copyright and Licensing If you want to build the anbox snap instead you can do this with the following
steps:
```
$ mkdir android-images
$ cp /path/to/android.img android-images/android.img
$ snapcraft
```
The result will be a .snap file you can install on a system supporting snaps
```
$ snap install --dangerous --devmode anbox_1_amd64.snap
```
Anbox reuses code from other projects like the Android Qemu emulator. ## Run Anbox
These projects are available in the external/ subdirectory with the
licensing terms included.
The anbox source itself (in src/) is licensed under the terms of Running Anbox from a local build requires a few more things you need to know
the GPLv3 license: about. Please have a look at the ["Runtime Setup"](docs/runtime-setup.md)
documentation.
Copyright (C) 2016 Simon Fels <morphis@gravedo.de> ## documentation
This program is free software: you can redistribute it and/or modify it You will find additional documentation for Anbox in the *docs* subdirectory
under the terms of the GNU General Public License version 3, as published of the project source.
by the Free Software Foundation.
Interesting things to have a look at
* [Runtime Setup](docs/runtime-setup.md)
* [Build Android image](docs/build-android.md)
## Reporting bugs
If you have found an issue with Anbox, please [file a bug](https://github.com/anbox/anbox/issues/new).
## Get in Touch
If you want to get in contact with the developers please feel free to join the
*#anbox* IRC channel on [FreeNode](https://freenode.net/).
## Copyright and Licensing
This program is distributed in the hope that it will be useful, but Anbox reuses code from other projects like the Android QEMU emulator. These
WITHOUT ANY WARRANTY; without even the implied warranties of projects are available in the external/ subdirectory with the licensing terms
MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR included.
PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along The anbox source itself, if not stated differently in the relevant source files,
with this program. If not, see <http://www.gnu.org/licenses/>. is licensed under the terms of the GPLv3 license.
# Build Android Image
For Anbox we're using a minimal customized version of Android but otherwise
base all our work of a recent release of the [Android Open Source Project](https://source.android.com/).
To rebuild the Android image you need first fetch all relevant sources. This
will take quite a huge amount of your disk space (~40GB). AOSP recommends at
least 100GB of free disk space. Have a look at [their](https://source.android.com/source/requirements.html) pages too.
In general for building the Anbox Andorid image the instructions found on [the pages
from the AOSP project](https://source.android.com/source/requirements.html) apply.
We will not describe again here of how to build the Android system in general but
only focus on the steps required for Anbox.
## Fetch all relevant sources
First setup a new workspace where you will download all sources too.
```
$ mkdir $HOME/anbox-work
```
Now initialize the repository by download the manifest and start fetching
the sources:
```
$ cd $HOME/anbox-work
$ repo init -u https://github.com/anbox/platform_manifests.git -b anbox
$ repo sync -j4
```
This will take quite some time depending on the speed of your internet connection.
## Build Android
When all sources are successfully downloaded you can start building Android
itself. Initialize the build by
```
$ lunch anbox_desktop_x86_64-userdebug
```
The complete list of supported build targets:
* anbox_desktop_x86_64-userdebug
* anbox_desktop_armv7a_arm-userdebug
* anbox_desktop_arm64-userdebug
Now build everything with
```
$ make -j8
```
Once the build is done we need to take the results and create an image file
suitable for Anbox.
```
$ cd $HOME/anbox-work/anbox
$ scripts/create-package.sh \
$PWD/../out/target/product/x86_64/ramdisk.img \
$PWD/../out/target/product/x86_64/system.img
```
This will create an *android.img* file in the current directory.
With this, you are now able to use your custom image within the Anbox runtime.
## Run Anbox with self build android.img
If you have Anbox installed on your system you need to stop it first. If you used
the installer script and the snap you can do this via
```
$ initctl stop anbox
$ sudo systemctl stop snap.anbox.container-manager
```
It is important that you stop both, the container manager and the session manager.
Once both services are stopped you can start the container manager with your
custom android.img file by running
```
$ datadir=$HOME/anbox-data
$ mkdir -p $datadir/rootfs
$ sudo anbox container-manager \
--android-image=/path/to/android.img \
--data-path=$datadir
```
This will start the container manager and setup the container rootfs inside the
specified data path.
```
$ ls -alh $HOME/anbox-data
total 20K
drwxrwxr-x 5 ubuntu ubuntu 4,0K Feb 22 08:04 .
drwxrwxr-x 16 ubuntu ubuntu 4,0K Feb 22 08:04 ..
drwxr-xr-x 2 100000 100000 4,0K Feb 22 08:04 cache
drwxr-xr-x 2 100000 100000 4,0K Feb 22 08:04 data
drwxr-xr-x 2 root root 4,0K Feb 22 08:04 rootfs
```
**NOTE:** If you look into the $HOME/anbox-data/rootfs directory you won't see
anything as the container manager spawns up a private mount namespace which
prevents anything from the outside to see its mount points.
The *cache* and *data* directories are bind-mounted into the rootfs at *rootfs/data*
and *rootfs/cache*.
# Overview
The Anbox runtime consists mainly of two separate instances:
* container manager
* session manager
The container manager has the job of managing the container setup and maintenance
during its lifetime. It has the responsibility to start the LXC environment we're
using to run the Android system.
The session manager runs inside the session of a user logged into the Linux system.
It will communicate over several sockets with the Android instance running inside
the container and provide integration with the Linux system. It also acts as a
multiplexer to map Android applications into single windows on the desktop
environment. Currently all application windows are owned by the same process
(the session manager). The application logic itself is still in a separate process
inside the Android container.
The following picture shows an overview over the architecture:
![Anbox architecture](architecture.png)
## Application Mapping
Android applications are mapped into single windows within the desktop environment.
This is achieved by plugging into the Android hwcomposer HAL module which receives
a set of layers to composite on a screen. Anbox tells SurfaceFlinger through its
hwcomposer implementation to get a layer for each application and combines this with
additional information it receives from the Android WindowManager to map individual
layers to applications. For more details please look into the implementation at
* android/hwcomposer
* src/anbox/graphics/layer_composer.cpp
* src/anbox/wm/manager.cpp
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册