最简单的打造一台能够 RenderDoc 的手机

最近为了倒腾一个能够无痛 RenderDoc 的手机颇花了不少力气,编译了不少固件。在这里记一下结论希望对别人能有点用处。

手机类型建议用高通芯片的小米,lineageos 或者 pixelexperience 能刷的。 可以在这两个固件的官方网站上查询一下是否支持。

拿到以后解锁然后直接刷 lineageos 或者 pixelexperience,不要在官方固件上浪费时间,官方固件虽然可以也可以用 magisk root,但是动态改配置以后工作会不正常。也许必须得 userdebug 的固件才行吧。

刷好以后安装 magisk,然后在 magisk 里面安装 magisk hide props 插件,之后 adb shell 进去

props ro.secure 0

按 y 确认然后按 e 退出(注意第一次执行时候会弹 su 的框,记得确认掉)

props ro.debuggable 1

按 y 确认以后按 r 重启,重启以后手机就可以完全正常的跑 RenderDoc 了,因为 adb 是 root 方式跑的,所以甚至都不会警告你 apk 不能调试。

编译 RenderDoc 的安卓 apk(带interceptor-lib)

之前做过一次结果没有做笔记,今天又想用了,发现当时的结果全都删了,浪费了一些时间。在这里做个笔记

RenderDoc 的安卓 APK 编译严格讲没啥难的,就是啰嗦。而且如果需要好的 hook 能力的话,需要编译 interceptor-lib,这个东西需要一个非常老版本的 llvm,编译这个 llvm 也非常啰嗦。

虽然理论上讲可以在 windows 上用 MSYS 之类的编译,但是为了避免啰嗦,我们还是老老实实用 Linux 吧,反正现在的 Windows 10 都能用 WSL 了。

首先按照 https://github.com/baldurk/renderdoc/blob/v1.x/docs/CONTRIBUTING/Compiling.md 里面描述的,设置好 JDK/安卓SDK/安卓NDK

然后参考 https://github.com/baldurk/renderdoc/blob/v1.x/renderdoc/3rdparty/interceptor-lib/README.md 这篇里面的内容,先 git clone 出来,删掉 LLVMHello 相关的行。

下面重点来了,原来文章中里面有个小小的错误,在 cmake 后面的参数里面,比较新版本的 cmake 是自己选择安卓 NDK 里面的 Toolchain 的, cmake 后面参数里面加的 -DANDROID_TOOLCHAIN=clang 实际没有效果,导致总会选中实际不能用的 gcc toolchain,换成 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang 即可,具体可以参见 /usr/share/cmake-x.xx/Modules/Platform/Android/Determine-Compiler-NDK.cmake。

其他内容文章中都是正确的,照着做即可,就能编译出来强 hook 能力的 renderdoc 安卓 apk 了。

Linux下解决同一硬盘因为连接设备不一样导致扇区大小不一致的问题

我有块硬盘放进了我家云盒子里面,前段时间想把这个硬盘拿出来插到电脑上面拷贝数据,结果发现分区表完全是乱的,分区变小了很多,在电脑上调整了分区表以后大小对了,放回我家云盒子,分区表又变得不合法了。

仔细研究了一下,发现硬盘直接接在电脑上面时候,扇区大小是 512 字节的,但是接在我家云盒子上面,扇区的大小是 4096 字节。之前有人说有些 USB 硬盘线也会造成这样的效果,大概也是相同的情况。分区表里面的单位都是按照扇区大小来计算的,所以分区大小自然也就不一样了

知道了这个原因就是想解决方式了。Linux 下面解决起来倒是简单,loop 设备设置的时候可以用 –sector-size 来设置大小,因此我们只要先不着急 mount 硬盘,用 losetup 设置一个扇区大小是 512 字节的 loop 设备。之后在 loop 设备上面再分区和格式化,就可以让这个硬盘在电脑上也可以正常读取了。

需要注意的是,不同的设备有可能导致最终看到的扇区数也是不一样的,我实测电脑比我家云盒子多看到几KB的大小,因此在 losetup 时候通常需要手动加上 –sizelimit 的值。

例如

losetup -P –sector-size 4096 –sizelimit 3000591892480 -f /dev/sda

之后直接对 loop 设备分区啥的就都很正常了

RHEL/CentOS/OracleLinux 8 yum 能看到,安装却没有的情况

最近发现 CentOS 强制升级到 OracleLinux 8 以后有些包用 yum search 可以看到,但是 yum install 却说没有。比如 golang 就是这样的。

简单研究了一下,是因为 RHEL8 里面引入了 module 的概念,可以把一些软件包给做成 module , 可以自己选择用哪个分叉,比如 gcc8 和 9 会依赖完全不同的两套软件包,这就可以做成两个不同版本的 module 。 yum search 能看到,但是安装不了就是因为 module 信息乱了,选了一个不存在的版本。

解决方案是 yum module reset , 有哪些 module 可以 yum module list 看,比如 golang 的就是 go-toolset,执行 yum module reset go-toolset 以后, yum install golang 就成功了。

让服务器响应整个网段中的请求

最近有个需求是让某个服务器能够响应一整个网段的请求,研究了一下,发现比想象的容易。

假设需要的网段是 172.16.0.0/16 (好多IP!) 我们需要让用户能用这个段里面任何一个 IP 访问我的服务器,服务器IP实际是 192.168.1.4 ,那么分这样两步走就行。

1: 在路由上将 172.16.0.0/16 设置一条静态路由,网关是 192.168.1.4
在别的机器上 ping 172.16 段里面任何一个 IP,肯定现在还 ping 不通,但是在 192.168.1.4 上抓包,保证报文已经被路由到了这台服务器
2: 给本机的 lo 上增加一条 local 表里面的路由
ip route add local 172.16.0.0/16 dev lo

然后就一切正常了。

PS: 这个办法 IPV6 一样可以用,例如
ip route add local fc::/64 dev lo
就可以让 Linux 响应 fc::/64 里面所有的 IP

PS1: 除了路由器上设置服务器为网关,其实还有其他办法让请求报文能到达服务器,V4 可以用 tarpd,V6 可以用 ndppd,但是这些方法都会给网关和服务器的 ARP 表和邻居表里面增加非常多的记录,对性能有很大影响,因此不建议使用,还是用静态路由的方式比较好。

PS2: 不要设置在 eth0 上,可能会造成一些其他问题,lo 就挺好的

最近评论

时光机

其他