日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

基于容器原理(docker、lxc、cells)的Android 双系统设计概要

發布時間:2025/3/15 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于容器原理(docker、lxc、cells)的Android 双系统设计概要 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面

最近一兩年預研加開發android雙系統;中途用過不少開源代碼或者研讀過大牛BLOG,現開放雙系統設計原理來回報社區。

備注:我是在android6.0上實現的。

?

這個項目的原型來自于,哥倫比亞大學虛擬化研究室的一篇論文(也有一個DEMO),后來一個以色列公司cellrox在2014年進行了商業化,2015年的時候浙大一個操作系統研究室也出了一個DEMO(名稱叫Condroid)。
哥大論文地址:http://systems.cs.columbia.edu/projects/cells/
浙大項目地址:http://condroid.github.io/
以色列公司官網:http://www.cellrox.com/
浙大的項目本來有源碼的后來取消掉了,剩下文檔了,對android源碼比較熟悉,能復原代碼的。

?

Android 6.0 huawei 6p nexus : fastboot img ?https://pan.baidu.com/s/1G1risnbT0Usy_NL6VDbovQ
?

?

原理:
同docker、lxc、cells的原理一樣,利用kernel中的namespace+cgroup來實現android容器的。

?

啟動篇:
必須要有一個能啟動init進程的容器生成進程,kernel啟動一個init以后,根據rc文件啟動一個容器生成器進程,我姑且叫celld,該進程的源碼在我的github中有了,非常容易理解。

?

文件系統:
容器的文件系統也是在celld中掛載的,容器的根目錄是利用chroot命令實現的,然后在根目錄中進行如下操作:
1、根文件系統的掛載:在主系統的data目錄中mount rootfs文件系統,當做容器系統的根文件系統。
2、system文件系統的掛載:直接將主系統的system目錄mount(bind)成容器系統的system分區。
3、data文件系統的掛載:在主系統中創建一個臨時目錄,然后把這個臨時目錄mount成容器系統的data分區。
4、sdcard 文件系統的掛載:原理同data分區一樣(android6.0以后sdcard 采用的是fuse文件系統,這里需要注意一下是否需要變更)。
5、根文件系統的所有文件需要主動拷貝,system文件系統則不需要。

?

init進程:
在celld中主動啟動init進程,當做容器系統的init,在celld源碼中有如下大致步驟:
1、利用clone系統調用啟動容器系統的init進程。
2、clone 系統調用需要一系列namespace 標記來創建屬于容器系統的命名空間。
3、然后需要給這個init進程分配cgroup資源。
4、最后需要調用chroot函數給容器系統分配根目錄,實際上它是主系統中的一個目錄而已。

?

binder設備的虛擬化:
這個驅動是android系統的核心,第一步一定要把它實現好,因為所有的android servie都會注冊到binder驅動中,容器系統的android service同樣會注冊到binder驅動中的,那么問題來了,相同的服務名只能注冊一次。
binder驅動是一個字符設備,所以binder驅動虛擬化就是重新構造binder的數據結構,讓容器系統能在binder驅動中有其獨立的數據結構,這個驅動的源碼,在哥大的DEMO中是有的,有興趣的可以參考。
此外binder驅動的虛擬化還要實現一個很重要的功能,就是容器之間能互相訪問對方的android service,這樣后續很多設備的虛擬化就可以在此基礎上實現。

?

display虛擬化:
顯示的虛擬化要利用容器系統間能互相訪問service才能實現,主系統運行surfaceflinger,容器系統不運行surfaceflinger,而是通過binder驅動訪問主系統的surfaceflinger,當然surfaceflinger的代碼也得改一改,讓所有容器系統的surface互相不干涉。
這個驅動的虛擬化,在哥大的demo中也有實現,不過哥大的demo是在android4.4的基礎上實現的,當時android源碼中還沒有ion這個驅動,android5.0以后有了ion這個驅動以后,哥大的display虛擬化方式是無效的,
有興趣的可以看一看,它是在kernel中實現的,簡單過程如下:
1、display虛擬化的重點在于,非當前系統也需要實時更新畫面,不能簡單粗暴的進行阻截,只是這個非當前系統的畫面要隱藏起來,不能投射到屏幕中。
2、當非當前系統使用mmap映射顯存時需要映射的是內存,將所有像素數據保存在內存中。
3、當發生系統切換時,就可以將內存中的像素數據復制到顯存當中。

?

input虛擬化:
觸摸屏的虛擬化,哥大的demo也有,非常精良可以看看,主要思路就是:阻截非當前系統的event事件上報,同時需要注意系統切換時容易給“消失的系統”造成“留點”問題。

?

網絡的虛擬化:
網絡的虛擬化有兩塊,一個是wifi的,另一個則是數據流量的,但是二者實現原理都是一樣的,我自己實現了兩種辦法:
1、容器系統不隔離網絡namespace,所有容器系統和主系統共享七層網絡,但會有很多問題需要解決,同時也不太安全,或者叫不太敢用,如local socket 不能同名、netlink socket ID不能相同...
2、網絡設備運行在主系統中,利用veth網絡設備聯通容器系統和主系統,而在第三層網絡中實現路由轉發,這個是非常靠譜的個人感覺。
3、網絡設備運行在主系統中,利用veth網絡設備聯通容器系統和主系統,而在第二層網絡中實現橋接,這個不適合wlan,因為wifi只有p2p模式和熱點模式,不能進行橋接,數據流量是可以的。


好了,到此一個運行于手機中的容器android基本就能跑起來了,其實只要實現binder的虛擬化和display的虛擬化就能跑起來了,有問題請留言,有問必答!

?

此外:我們還嘗試過將kvm-qemu移植進android手機中,手機中跑一個運行android系統的虛擬機,類似vmware這種模式!,在另一篇blog有關于GPU怎么虛擬化的辦法,效果比真機略差15ms!!!

?

基于容器原理的android雙系統,實現起來比較簡單,但沒什么鳥用,市場不大,只能當作噱頭

基于kvm原理的android虛擬機,實現難度大,如果能優雅實現,將是移動互聯的vmware
————————————————
版權聲明:本文為CSDN博主「pppaass」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/pppaass/article/details/76602419

總結

以上是生活随笔為你收集整理的基于容器原理(docker、lxc、cells)的Android 双系统设计概要的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。