首页
社区
课程
招聘
[原创]redroid浅析
发表于: 3天前 544

[原创]redroid浅析

3天前
544

技术实现

input注入

目前常用的input注入有两种,一种是以uinput为代表的创建/dev/input/xx节点,往节点里注入原始input数据;一种是以scrcpy为代表的利用adbd的高权限调用framework inputManager注入事件的接口。

投屏

以scrcpy为例,简述投屏的原理。scrcpy会通过adb在android内创建一个VirtualDisplay,并有一块surface与之关联,surface由mediacodec创建,surfaceFlinger在合成渲染完毕后会将结果传递给这个surface,mediacodec再编码后的结果通过socket传递给adb reverse传递的pc端映射端口,pc端解码后就拿到了该图像。

商业云手机在android端的图像采集技术与scrcpy类似,但是在各端的推拉流显示原理则各有差异,如webrtc/xdp等。

binder 驱动

redroid本质上是通过docker启动的android容器,与宿主共用一个内核,而各个容器都需要单独的binder驱动,因此一般会通过binderfs创建容器专属的binder节点,再在docker启动容器时映射进去。


渲染

redroid被设计用来跑在不同架构和GPU的平台,因此redroid预置了相当多的渲染相关的so,以便在运行时根据配置来决定是使用软渲染还是硬件渲染,使用哪个平台的渲染驱动等。

namespace和cgroup资源隔离

这是android容器能跑起来的最关键的机制,一般通过docker/podman/lxc实现。、

如何阅读 redroid

#####################
# fetch code
#####################
mkdir ~/redroid && cd ~/redroid

# check supported branch in 689K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6J5k6h3#2G2N6r3g2Q4x3X3c8S2L8X3c8J5L8$3W2V1i4K6u0r3M7X3g2V1M7X3!0A6k6q4)9J5k6s2m8S2N6r3y4Z5k6i4y4Q4x3X3g2Y4K9i4b7`.
repo init -u dbbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0W2k6$3!0G2k6$3I4W2M7$3!0#2M7X3y4W2i4K6u0W2j5$3!0E0i4K6u0r3M7r3I4S2N6r3k6G2M7X3#2Q4x3V1k6E0j5h3&6A6k6X3g2K6N6q4)9J5y4X3&6T1M7%4m8Q4x3@1u0Q4x3X3c8Q4x3X3c8Y4K9i4c8Q4x3X3c8D9k6Y4y4Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4K6u0V1i4K6u0V1k6r3g2H3N6r3S2Q4x3@1b7I4i4K6t1$3L8X3u0K6M7q4)9K6b7W2)9J5k6r3u0Q4x3U0k6F1j5Y4y4H3i4K6y4n7j5h3&6V1M7X3!0A6k6q4)9J5k6o6p5I4i4K6u0W2x3q4)9J5k6e0m8Q4y4h3k6J5y4o6R3`.

# add local manifests
git clone b8eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6J5k6h3#2G2N6r3g2Q4x3X3c8S2L8X3c8J5L8$3W2V1i4K6u0r3L8r3!0U0j5h3I4Q4y4h3k6E0j5h3&6A6k6X3g2K6N6s2y4Q4x3X3g2Y4K9i4c8Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4K6N6q4i4K6u0r3M7X3g2V1M7X3!0A6k6q4)9J5c8W2)9J5k6i4u0W2M7r3!0Q4x3V1k6D9L8$3y4S2L8q4)9#2k6X3#2S2L8X3W2X3k6i4y4@1M7#2)9J5y4X3&6T1M7%4m8Q4x3@1u0Q4x3X3c8T1i4K6t1$3L8X3u0K6M7q4)9K6b7U0p5I4i4K6u0W2x3q4)9J5k6e0l9`.

# sync code
repo sync -c

# apply redroid patches
git clone 903K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6J5k6h3#2G2N6r3g2Q4x3X3c8S2L8X3c8J5L8$3W2V1i4K6u0r3M7X3g2V1M7X3!0A6k6q4)9J5k6s2m8S2N6r3y4Z5k6i4y4Q4x3X3g2Y4K9i4c8Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4K6N6q4i4K6u0r3M7X3g2V1M7X3!0A6k6q4)9J5k6s2m8S2N6r3y4Z5k6i4x3`.
~/redroid-patches/apply-patch.sh ~/redroid

redroid代码主要分为patch仓库和redroid仓库两部分。
先看patch仓库部分



主要是屏蔽了selinux、vintf、seccomp等导致系统起不来的部分逻辑。
redroid仓库相对aosp的主要改动如下




传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 3天前 被taoying编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 1501
活跃值: (3743)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
图片寄了老铁
3天前
0
雪    币: 399
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
WMBa0 图片寄了老铁
可以了
3天前
0
游客
登录 | 注册 方可回帖
返回