Skip to content

Commit

Permalink
Backend: APEX mounts support improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
osm0sis committed Jan 12, 2020
1 parent d2e55da commit 810de52
Showing 1 changed file with 48 additions and 45 deletions.
93 changes: 48 additions & 45 deletions META-INF/com/google/android/update-binary
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,11 @@ setup_mountpoint() {
}
is_mounted() { $bb mount | $bb grep -q " $1 "; }
umount_all() {
($BOOTMODE || umount_apex;
$bb umount /system;
$bb umount -l /system;
(if ! $BOOTMODE; then
umount_apex;
$bb umount /system;
$bb umount -l /system;
fi;
if [ -e /system_root ]; then
$bb umount /system_root;
$bb umount -l /system_root;
Expand All @@ -72,55 +74,56 @@ umount_all() {
fi) 2>/dev/null;
}
mount_apex() {
[ -d /system/apex ] || return 1
[ -L /apex ] && rm -f /apex
if [ -f "/system/apex/com.android.runtime.release.apex" ]; then
local j=0
[ -e /dev/block/loop1 ] && local minorx=$(ls -l /dev/block/loop1 | $bb awk '{print $6}') || local minorx=1
for i in /system/apex/*.apex; do
local dest="/apex/$(basename $i | sed 's/.apex$//')"
[ "$dest" == "/apex/com.android.runtime.release" ] && dest="/apex/com.android.runtime"
mkdir -p $dest
$bb unzip -qo $i apex_payload.img -d /apex
mv -f /apex/apex_payload.img $dest.img
while [ $j -lt 50 ]; do
loop=/dev/loop$j
$bb mknod $loop b 7 $((j * minorx)) 2>/dev/null
$bb losetup $loop $dest.img 2>/dev/null
j=$((j + 1))
$bb losetup $loop | grep -q $dest.img && break
done;
uloop="$uloop $((j - 1))"
$bb mount -t ext4 -o loop,noatime,ro $loop $dest || return 1
done
# Already extracted payload imgs present, just mount the folders
elif [ -d "/system/apex/com.android.runtime.release" ]; then
for i in /system/apex/*; do
local dest="/apex/$(basename $i)"
[ "$dest" == "/apex/com.android.runtime.release" ] && dest="/apex/com.android.runtime"
mkdir -p $dest
$bb mount -o bind,ro $i $dest
done
fi
test -d /system/apex || return 1;
local apex dest loop minorx num;
setup_mountpoint /apex;
test -e /dev/block/loop1 && minorx=$(ls -l /dev/block/loop1 | $bb awk '{ print $6 }') || minorx=1;
num=0;
for apex in /system/apex/*; do
dest=/apex/$(basename $apex .apex);
test "$dest" == /apex/com.android.runtime.release && dest=/apex/com.android.runtime;
mkdir -p $dest;
case $apex in
*.apex)
$bb unzip -qo $apex apex_payload.img -d /apex;
$bb mv -f /apex/apex_payload.img $dest.img;
$bb mount -t ext4 -o ro,noatime $dest.img $dest 2>/dev/null;
if [ $? != 0 ]; then
while [ $num -lt 64 ]; do
loop=/dev/block/loop$num;
($bb mknod $loop b 7 $((num * minorx));
$bb losetup $loop $dest.img) 2>/dev/null;
num=$((num + 1));
$bb losetup $loop | $bb grep -q $dest.img && break;
done;
$bb mount -t ext4 -o ro,loop,noatime $loop $dest;
if [ $? != 0 ]; then
$bb losetup -d $loop 2>/dev/null;
fi;
fi;
;;
*) $bb mount -o bind $apex $dest;;
esac;
done;
}
umount_apex() {
[ -d /apex ] || return 1
for i in /apex/*; do
$bb umount -l $i 2>/dev/null
done
if [ -f "/system/apex/com.android.runtime.release.apex" ]; then
for i in $uloop; do
local loop=/dev/loop$i
losetup -d $loop 2>/dev/null || break
done
fi
rm -rf /apex
test -d /apex || return 1;
local dest loop;
for dest in $($bb find /apex -type d -mindepth 1 -maxdepth 1); do
if [ -f $dest.img ]; then
loop=$($bb mount | $bb grep $dest | $bb cut -d" " -f1);
fi;
($bb umount -l $dest;
$bb losetup -d $loop) 2>/dev/null;
done;
rm -rf /apex;
}
restore_env() {
test "$savedpath" && export LD_LIBRARY_PATH="$savedpath";
test "$savedpre" && export LD_PRELOAD="$savedpre";
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 umount -l /dev/random) 2>/dev/null;
}
Expand Down

0 comments on commit 810de52

Please sign in to comment.