之前写的是英文的,翻译一下吧。可能会怪怪的。

Introduce

Android container是docker的一种,为android再其他类型系统上构建基础的linux环境。最终的效果就好像android运行再一个独立的linux系统上

如上所示,尽管windows和linux完全不同,也许可以通过构建一个全新的命名空间来构建linux环境

Linux & Android

了解android和linux的关系是很必要的,通过认识android和linux各自的功能有助于理解android container的原理

如下:

Blue means that implement by android

 

准备条件:

  1. Linux 内核ENV: system call, related drivers, 内存管理,进程管理等
  2. 用户空间linux&android API: libc, libpcap, libcore etc
  3. Binder driver for IPC
  4. 以pid 1运行init进程
  5. 确保zygote 进程启动成功: Zygote是所有应用进程之父,提供了JVM环境

Linux Box

linux box需要做什么呢?

Namespaces:

  1. 让android相信自身再以root权限运行
  2. Android的UID应当和主进程存在映射关系(类似android中的多账户)
  3. Clone flag CLONE_NEWUSER
  4. 允许mount其他目录为android系统提供支持

File System:

构建基础的目录结构,就像镜像所做的

Input:

激活android系统的点击事件的分发

Audio/Video/Graphics:

提供UI,绘图,媒体接口给container

Network:

设置虚拟网卡设备用户上网,网卡设备的数据需要和物理网卡路由接通

Security:

  1. Verity, root of trust
  2. Cgroups
  3. Android Device Node Access
  4. SELinux

Android library:

确保android基础库和依赖库的支持

Boot android

先确认一下android是怎么启动的。如下:

android启动图示

Init: init进程为android系统的第一个进程。

App_main: Zygote进程的原始名称,后来改了

SystemServer: Zygote第一个儿子,负责所有android service的启动

android的init进程最初是被kernel启动的,而后从内核进程变为用户进程。container可以直接启用init作为容器内的第一个进程。

Architecture

Android container 需要直接或间接的和主系统沟通。如下:

也许android和Main OS有共同的api,也许没有。所以定制化的linux box需要对整体的api做一个代理。保证android系统正常运行。此外,binder为android系统独有,所以linux box也需要针对这一情况处理,将binder转换为其他形式的IPC还是单独实现?一些共享的组件也需要对android系统暴露出来,例如:wifi认证组件,蓝牙协议栈,openmax等

NameSpace

linux提供的分裂出一个全新命名空间的api,如下:

int clone(int (*fn)(void *), void *child_stack, int flags, void *arg)

Mounts

Android的目录布局比较复杂,并且各个目录的功能也不近相同。如下目录所见,虽然为android布局了理想的目录,但是由于container没有内核作为支撑,所以很多功能难以实现。这时候需要将部分目录mount到主系统的目录中,共用交叉的功能

 

Network

构建独立的网络接口,所有的网络请求通过此虚拟网卡转发到主系统的网卡中。这一功能可以参考VPN的实现。

 

Security

安全配置再container中也至关重要,目前可以想到的配置如下:

• 维持主系统的安全配置
• 确认root目录,保证android无法在未经许可的情况下访问主系统目录
• android的升级操作保持在为android提供的root路径下
• 配置主os和container的cpu&memory使用,保证调度上的安全性
• 保证container中的android目录拥有原本的读写权限限制
• 构建全新的selinux规则

Conclude

通过以上的介绍,目前我所知到支持namespace的系统都是类linux类型的。索性这一技术目前大多应用在linux类型的系统上。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐