前言

这几天重新折腾了下redroid,用上了这玩意。本来houdini可以从wsa提取,但是wsa已经寄了,而cros还在更新。


正文

需要linux
并且要cgpt

archlinux的话aur的cgpt对应的deb改了名字,自行在yay的时候去修改pkgbuild。对应的文件名截止目前是改成了"cgpt_0\~R106-15054.B+dfsg-0.1_amd64.deb",sha512sum是"64a1ed4a7989d0bf517db3a0479ee7874e082570ecdf7a5b594802951df952e9c85c28ab380dfa1c601940de8a2592ef7c87ecf143f631af78d0c3de94a24d24")

erofs-utils(cros的镜像从squashfs改erofs了)

chromeos update网站获取cros的recovery镜像。
其中,intel(例如volteer)使用的是houdini。amd(例如zork)使用的是ndk_translation。

拉下来的恢复镜像解包得到后缀为bin的文件。先dump出root-a分区。

此处参靠sebanc/brunch的安装脚本得出

#$recovery_image为镜像位置,$output_android_image为输出img名字
# 获取 ROOT-A 分区的起始位置和大小
start_sector=$(cgpt show -i 3 -b "$recovery_image")
num_sectors=$(cgpt show -i 3 -s "$recovery_image")

# 提取 ROOT-A 分区内容
dd if="$recovery_image" of="$output_android_image" bs=512 skip="$start_sector" count="$num_sectors"

提取出的img然后进行挂载

sudo losetup --show -fP $output_android_image

#loop0根据上面losetup设备改,假设tmp为挂载目录,挂载为只读
sudo mount /dev/loop0 tmp -o loop,ro

挂载后打开目录,android镜像位置位于

/opt/google/vms/android
(以前是/opt/google/containers)

复制出来,然后挂载两镜像。其中houdini在vendor中,system是软链接过去的。ndk是在system中。

#假设挂载位置为system
sudo erofsfuse system.raw.img system

参考sickcodes/Droid-NDK-Extractor的脚本,提取ndk/houdini并打包,system/vendor为挂载点

#libndk
find system \( -name 'libndk_translation*' -o -name '*arm*' -o -name 'ndk_translation*' \) | tar -cf native-bridge.tar -T -
#libhouini
find vendor \( -name 'libhoudini*' -o -name '*arm*' -o -name 'houdini*' \) | tar -cf native-bridge.tar -T -

最后可以对照supremegamers/vendor_intel_proprietary_houdini
supremegamers/vendor_google_proprietary_ndk_translation-prebuilt
来判断提取文件缺或多。

dump完了记得卸载挂载,umount -R和losetup -d

顺便提一嘴,同版本下,rammus/volteer/octopus/hatch提取的houdini一模一样。