termux.apk 原理分析

termux 是一个非常流行的,在安卓手机上免root加载linux的app,

网上全是它的使用方法,而我又比较好奇其实现原理,故而做个粗浅的分析

都知道的事:

1). 它用 proot 加载的 linux rootfs ——用户态的 chroot ,基于 linux ptrace 函数。

2). 它的维护团队,编译了一堆(近千个)用于扩展 android console 的命令行工具,

包括 "安卓版的linux桌面环境" —— xfce(这不同于proot出来的linux中运行的xfce)

少有人研究的是:

1). 它自带的 proot ,默认会检查这两个环境变量:

export PROOT_LOADER=$home/proot_loader/loader
export PROOT_LOADER_32=$home/proot_loader/loader32

如果没设置,loader路径就固定为

/data/data/com.termux/files/usr/libexec/proot/loader32
/data/data/com.termux/files/usr/libexec/proot/loader

这个可以通过反编译 proot 或查看 proot 源码确认。

2). 它会生成假的 /proc ,供它加载的 guest linux 访问,不然 guest linux 用不了 ps、top 指令

这个可以通过读 /usr/bin/proot-distro 脚本确认,脚本里面的:setup_fake_proc() 处

3). 它会通过 apt-mark hold gvfs-daemons udisks2 这样的指令不让 apt 更新这两个库

这个可以通过读 /usr/etc/proot-distro/*linux*.sh  脚本确认,不然 guest linux 中装不了x11 server,

包括 xvnc、xfce

换句话说,termux 里面的 proot-distro 自带的 rootfs 中,已经有他们自己编译的 udisks2 了。

也可以说是需要对 rootfs 进行改造——添加特定的 udisks2 才能在proot出来的环境中安装xfce。

如果想自己在 proot 出来的 guest linux 中安装 udisks2 或 gvfs-daemons,会出现如下错误提示:

Setting up udisks2 (2.8.4-1ubuntu2) ...
Failed to scan devices: Permission denied
dpkg: error processing package udisks2 (--configure):

即装不上,而 x11vnc、xfce 又依赖于这两玩意,不太好玩,只能用他们的rootfs了,

不然就只能装 xfvb+dwm 这种比较简陋的X桌面环境

下面这个链接是目前最新版的 termux 在用的 ubuntu rootfs :

https://github.com/termux/proot-distro/releases/download/v3.0.1/ubuntu-aarch64-pd-v3.0.1.tar.xz

也就是 termux 的github仓库:

Releases · termux/proot-distro · GitHub​​​​​​

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值