forked from zolo1984/cells-of-Android
-
Notifications
You must be signed in to change notification settings - Fork 3
xdcs100/cells-of-Android-1
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
基于容器原理(cell、lxc、docker)的Android双系统基础代码(Android 6.0 huawei 6p nexus)
1、位于vendor目录下的cells目录
1)、cells --- 容器生成进程,能启动init进程
其中celld是运行在主系统中的daemon进程,负责创建容器空间
其中cell是celld对应的命令行程序
其中hostcmd是运行在主系统中的daemon进程,负责与辅助系统交互
其中vmcmd是运行在辅助系统中的daemon进程,负责与主系统交互
2)、fingerprintd --- 指纹虚拟化
3)、Kernel_Kmsg --- 内核日志保存
4)、logcat --- ap日志保存
5)、qemuxproxy --- socket 代理,接受一个socket的数据,转发给另一个socket(双系统各设备的虚拟化核心就是接口代理、就是进程间通信,binder、socket、netlink等)
6)、SecureSystemSwitch --- 双系统切换APP,上层应用,实际功能实现在hostcmd、vmcmd中
7)、StopSystem --- 双系统切换成单系统APP,上层应用,双系统切成单系统功能,实际功能实现在hostcmd中
2、位于system目录下的core目录
1)、adb --- adb 虚拟化,核心原理就是adb daemon 进程 互斥的运行在两个系统中
2)、init --- init 进程略微修改
3、位于kernel目录下的drivers目录
1)、core.c --- 系统隔离初始化 drv_namespace
2)、evdev.c mousedev.c --- input 事件互斥上报 (需增加input兼容模式)
3)、veth.c --- wlan、rmnt_data 网络虚拟化必备“网线”, 请根据最新版本内核更新一下此设备,网络虚拟化借鉴了“usb共享网络”的原理
4)、alarm-dev.c --- alarm 驱动隔离
5)、binder.c --- binder 驱动隔离
6)、logger.c --- 日志 驱动隔离
7)、mdss_fb.c --- 背光灯 驱动隔离
8)、container.c --- 可废除
9)、drv_namespace.c --- 驱动隔离基础
10)、nsproxy.c --- PID 隔离
3、位于hardware目录下的libhardware_legacy目录
1)、power.c --- wakelock 虚拟化,核心:各系统wakelock不能重命名,改名!
4、frameworks目录
该目录针对 camera、sound、input、surfaceflinger、binder 等都有修改,太多了就不做一一解释,请用Android6.0源码对比自行理解,时间仓卒不保证质量
5、位于device目录下的angler目录
1)、fstab.angler --- 主系统fstab,其中由于关闭selinux导致文件系统无法自动挂载,因为该文件中有selinux标签
2)、fstab.anger.cell --- 辅助系统fstab
3)、init.angler.cell.rc --- 辅助系统rc文件
4)、init.cell.rc --- 辅助系统rc文件
5)、init.rc --- 主系统rc文件
kernel ---> init(主系统) ---> init.rc ---> celld(容器生成器) ---> init(辅助系统)
2019-01-06
各位朋友,如果有什么问题可以留言的,2018年协助一些朋友将此方案移植到他们的机型上,特更新下移植过程,供参考:
1、修改config
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_DRV_NS=y
CONFIG_VETH=y
android 6.0 以后的将此开启
CONFIG_SYSVIPC=y
2、驱动层,依次移植core.c drv_namespace.c nsproxy.c binder.c evdev.c mousedev.c alarm-dev.c logger.c
3、关闭selinux(disabled),这样会省掉很多事;
如果关不掉,则将selinux置为兼容模式,注意selinux是兼容模式时:
1)*.rc 中增加的service需要增加标签属性。
2)修改init进程,利用ro.boot.vm=1(辅助系统)属性将所有selinux控制功能辅助系统单方面屏蔽。
4、修改init进程,利用ro.boot.vm=1(辅助系统)属性,辅助系统单方面禁止导入firmware(内核固件)
5、给辅助系统增加*.rc文件,统一命名为*.cell.rc,其中init.cell.rc要做如下几件事:
1)on boot 节点 增加 write /dev/celld.startpipe cell
2)增加日志服务和vmcmd服务
3)屏蔽不需要的系统服务例如ril-deamon
4)修改vendor/cells/cells/celld.c rename_cells_file 函数
6、给辅助系统增加文件系统配置文件fstab.* ,其中有如下几件事要做:
1)屏蔽/system / /data /sdcard /zram 分区的配置项
2)如果有selinux属性,需要去掉(这里主系统同样需要这样处理)
7、给主系统修改init.rc文件,要做如下几件事:
1)增加日志服务,celld服务和hostcmd服务
2)注意可先将celld设为disable属性,系统整体修改完以后可使用setprop ctl.start celld 命令 启动辅助系统
8、将vendor/cells 中的 cells SecureSystemSwitch logcat Kernel_Kmsg 移植进自己的工程中,将编译链设置好
9、按照github源码对比合入frameworks/native 源码
10、按照github源码对比合入frameworks/av 源码
11、按照github源码对比合入frameworks/base 源码
12、按照github源码对比合入adb 源码
13、按照github源码对比合入hardware/power 源码
注意事项:
1、按这个步骤1个1个的合入,编译,刷机,验证,务必保证日志系统、主系统和原生系统是一致的
2、所有项合入后,使用 setprop ctl.start celld 手动启动辅助系统
3、启动辅助系统时,可能会遇见三个问题
1)..._os_Zygote.cpp 文件中 gOpenFdTable abort 问题,解决办法:辅助系统单方面屏蔽该功能
2)模拟sdcard无法挂载,解决办法:init.cell.rc 中增加 mkdir /storage 0755 root root
3) 动态调频功能无法使用,解决办法:辅助系统单方面屏蔽该功能
4、最后双系统主体结构便构造完成了,如果想完整产品化,还有很长的路需要完成
祝好!
Releases
No releases published
Packages 0
No packages published
Languages
- Java 57.8%
- C++ 29.0%
- C 11.9%
- Makefile 1.3%