Backend: APEX mounts support improvements

This commit is contained in:
osm0sis committed 2020-01-12 02:22:30 -04:00
1 parent d2e55da124
commit 810de5296f
1 file changed
+48 -45
+48 -45
View File
@@ -57,9 +57,11 @@ setup_mountpoint() {
} }
is_mounted() { $bb mount | $bb grep -q " $1 "; } is_mounted() { $bb mount | $bb grep -q " $1 "; }
umount_all() { umount_all() {
($BOOTMODE || umount_apex; (if ! $BOOTMODE; then
$bb umount /system; umount_apex;
$bb umount -l /system; $bb umount /system;
$bb umount -l /system;
fi;
if [ -e /system_root ]; then if [ -e /system_root ]; then
$bb umount /system_root; $bb umount /system_root;
$bb umount -l /system_root; $bb umount -l /system_root;
@@ -72,55 +74,56 @@ umount_all() {
fi) 2>/dev/null; fi) 2>/dev/null;
} }
mount_apex() { mount_apex() {
[ -d /system/apex ] || return 1 test -d /system/apex || return 1;
[ -L /apex ] && rm -f /apex local apex dest loop minorx num;
if [ -f "/system/apex/com.android.runtime.release.apex" ]; then setup_mountpoint /apex;
local j=0 test -e /dev/block/loop1 && minorx=$(ls -l /dev/block/loop1 | $bb awk '{ print $6 }') || minorx=1;
[ -e /dev/block/loop1 ] && local minorx=$(ls -l /dev/block/loop1 | $bb awk '{print $6}') || local minorx=1 num=0;
for i in /system/apex/*.apex; do for apex in /system/apex/*; do
local dest="/apex/$(basename $i | sed 's/.apex$//')" dest=/apex/$(basename $apex .apex);
[ "$dest" == "/apex/com.android.runtime.release" ] && dest="/apex/com.android.runtime" test "$dest" == /apex/com.android.runtime.release && dest=/apex/com.android.runtime;
mkdir -p $dest mkdir -p $dest;
$bb unzip -qo $i apex_payload.img -d /apex case $apex in
mv -f /apex/apex_payload.img $dest.img *.apex)
while [ $j -lt 50 ]; do $bb unzip -qo $apex apex_payload.img -d /apex;
loop=/dev/loop$j $bb mv -f /apex/apex_payload.img $dest.img;
$bb mknod $loop b 7 $((j * minorx)) 2>/dev/null $bb mount -t ext4 -o ro,noatime $dest.img $dest 2>/dev/null;
$bb losetup $loop $dest.img 2>/dev/null if [ $? != 0 ]; then
j=$((j + 1)) while [ $num -lt 64 ]; do
$bb losetup $loop | grep -q $dest.img && break loop=/dev/block/loop$num;
done; ($bb mknod $loop b 7 $((num * minorx));
uloop="$uloop $((j - 1))" $bb losetup $loop $dest.img) 2>/dev/null;
$bb mount -t ext4 -o loop,noatime,ro $loop $dest || return 1 num=$((num + 1));
done $bb losetup $loop | $bb grep -q $dest.img && break;
# Already extracted payload imgs present, just mount the folders done;
elif [ -d "/system/apex/com.android.runtime.release" ]; then $bb mount -t ext4 -o ro,loop,noatime $loop $dest;
for i in /system/apex/*; do if [ $? != 0 ]; then
local dest="/apex/$(basename $i)" $bb losetup -d $loop 2>/dev/null;
[ "$dest" == "/apex/com.android.runtime.release" ] && dest="/apex/com.android.runtime" fi;
mkdir -p $dest fi;
$bb mount -o bind,ro $i $dest ;;
done *) $bb mount -o bind $apex $dest;;
fi esac;
done;
} }
umount_apex() { umount_apex() {
[ -d /apex ] || return 1 test -d /apex || return 1;
for i in /apex/*; do local dest loop;
$bb umount -l $i 2>/dev/null for dest in $($bb find /apex -type d -mindepth 1 -maxdepth 1); do
done if [ -f $dest.img ]; then
if [ -f "/system/apex/com.android.runtime.release.apex" ]; then loop=$($bb mount | $bb grep $dest | $bb cut -d" " -f1);
for i in $uloop; do fi;
local loop=/dev/loop$i ($bb umount -l $dest;
losetup -d $loop 2>/dev/null || break $bb losetup -d $loop) 2>/dev/null;
done done;
fi rm -rf /apex;
rm -rf /apex
} }
restore_env() { restore_env() {
test "$savedpath" && export LD_LIBRARY_PATH="$savedpath"; test "$savedpath" && export LD_LIBRARY_PATH="$savedpath";
test "$savedpre" && export LD_PRELOAD="$savedpre"; test "$savedpre" && export LD_PRELOAD="$savedpre";
umount_all; umount_all;
($bb mv -f /system_link /system; ($bb mv -f /apex_link /apex;
$bb mv -f /system_link /system;
$bb mv -f /system_root_link /system_root; $bb mv -f /system_root_link /system_root;
$bb umount -l /dev/random) 2>/dev/null; $bb umount -l /dev/random) 2>/dev/null;
} }