forked from zolo1984/cells-of-Android
-
Notifications
You must be signed in to change notification settings - Fork 3
/
README
127 lines (82 loc) · 5.84 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
基于容器原理(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、最后双系统主体结构便构造完成了,如果想完整产品化,还有很长的路需要完成
祝好!