greatly improve APEX compat

merge-requests/33/head
Christopher Roy Bratusek 4 years ago
parent 4d9fdb241e
commit 5bb7a21548

@ -231,40 +231,70 @@ error () {
exit 1
}
mount_apex () {
APEX_FILE=""
APEX_DIR=""
# taken from Magisk, with modifications for NanoDroid
mount_apex_loop () {
local number=0
local minorx=1
local loop
for apex in com.android.runtime com.android.runtime.release com.android.runtime.debug; do
if [ -f /system/apex/${apex}.apex ]; then
APEX_FILE=/system/apex/${apex}.apex
break
elif [ -d /system/apex/${apex} ]; then
APEX_DIR=/system/apex/${apex}
break
[ -e /dev/block/loop1 ] && minorx=$(stat -Lc '%T' /dev/block/loop1)
apex_mount="${1}"
mkdir -p "${apex_mount}"
while [ ${number} -lt 64 ]; do
loop=/dev/block/loop${number}
[ -e ${loop} ] || mknod ${loop} b 7 $((number * minorx))
echo " *** mount_apex_loop [loop] ${loop}"
echo " *** mount_apex_loop [apex_mount] ${apex_mount}"
if losetup "${loop}" /apex/apex_payload.img; then
if mount -text4 -oro,noatime "${loop}" "${apex_mount}"; then
rm -f /apex/apex_payload.img
break
fi
fi
done
if [ -n "${APEX_FILE}" ]; then
mkdir -p "${TMPDIR}/apex"
unzip -oq "${APEX_FILE}" -d "${TMPDIR}/apex"
number=$((number + 1))
done
}
test -e /dev/loop_apex || mknod -m644 /dev/loop_apex b 7 8
# taken from Magisk, with modifications for NanoDroid
mount_apex () {
APEX_LD=""
mkdir -p /apex/com.android.runtime
losetup /dev/loop_apex "${TMPDIR}/apex/apex_payload.img" || error "APEX losetup failed!"
mount -text4 -oro,noatime /dev/loop_apex /apex/com.android.runtime || error "APEX mount failed!"
if ${BOOTMODE}; then
APEX_LD=/system/apex/com.android.runtime
else
APEX_LD=/apex/com.android.runtime
rm -rf "${TMPDIR}/apex"
elif [ -n "${APEX_DIR}" ]; then
mkdir -p /apex
ln -sf "${APEX_DIR}" /apex/com.android.runtime
for apex in /system/apex/*; do
apex_mount="/apex/$(basename ${apex} .apex)"
apex_loop="/dev/loop_apex_$(basename ${apex} .apex)"
[ "${apex_mount}" == /apex/com.android.runtime.release ] && apex_mount=/apex/com.android.runtime
[ "${apex_mount}" == /apex/com.android.runtime.debug ] && apex_mount=/apex/com.android.runtime
if [ -f "${apex}" ]; then
unzip -oq "${apex}" apex_payload.img -d /apex
mount_apex_loop "${apex_mount}" || error "APEX loop setup failed!"
elif [ -d "${apex}" ]; then
mount -o bind "${apex}" "${apex_mount}"
fi
done
export ANDROID_RUNTIME_ROOT=/apex/com.android.runtime
export ANDROID_TZDATA_ROOT=/apex/com.android.tzdata
fi
export ANDROID_RUNTIME_ROOT=/apex/com.android.runtime
echo " INFO: #10 [APEX_LD] ${APEX_LD}"
echo " INFO: #11 [APEX [ALL]] $(ls /system/apex/*.apex)"
}
# taken from Magisk, with minor modifications for NanoDroid
# taken from Magisk, with modifications for NanoDroid
mount_partitions () {
DEVICE_AB=FALSE
VENDOR_COMPAT=FALSE
@ -441,7 +471,7 @@ unpack_zip () {
rm -f ${TMPDIR}/*.xml
rm -f ${TMPDIR}/*.list
chmod 0755 ${INSTALLER}/*.${BIN_ARCH}
chmod 0755 ${INSTALLER}/*.*
}
nanodroid_finalize () {
@ -490,13 +520,19 @@ nanodroid_finalize () {
umount -l /vendor 2>/dev/null
umount -l /dev/random 2>/dev/null
umount -l /apex/com.android.runtime 2>/dev/null
losetup -d /dev/loop_apex 2>/dev/null
mount | awk '/ \/apex/{print $3}' | while read apex_mount; do
umount -l "${apex_mount}" 2>/dev/null
done
mount | awk '/ \/apex/{print $1}' | while read apex_loop; do
losetup -d "${apex_loop}" 2>/dev/null
done
rm -rf ${APEX_TMP}/apex
rm -rf /apex
unset ANDROID_RUNTIME_ROOT
unset ANDROID_TZDATA_ROOT
}
##########################################################################################

@ -50,54 +50,67 @@ is_mounted () {
return $?
}
mount_apex () {
APEX_NAME=""
APEX_FILE=""
APEX_DIR=""
APEX_LD=""
# taken from Magisk, with modifications for NanoDroid
mount_apex_loop () {
local number=0
local minorx=1
local loop
for apex in com.android.runtime com.android.runtime.release com.android.runtime.debug; do
if [ -f /system/apex/${apex}.apex ]; then
APEX_NAME=${apex}
APEX_FILE=/system/apex/${apex}.apex
break
elif [ -d /system/apex/${apex} ]; then
APEX_NAME=${apex}
APEX_DIR=/system/apex/${apex}
break
[ -e /dev/block/loop1 ] && minorx=$(stat -Lc '%T' /dev/block/loop1)
apex_mount="${1}"
mkdir -p "${apex_mount}"
while [ ${number} -lt 64 ]; do
loop=/dev/block/loop${number}
[ -e ${loop} ] || mknod ${loop} b 7 $((number * minorx))
echo " *** mount_apex_loop [loop] ${loop}"
echo " *** mount_apex_loop [apex_mount] ${apex_mount}"
if losetup "${loop}" /apex/apex_payload.img; then
if mount -text4 -oro,noatime "${loop}" "${apex_mount}"; then
rm -f /apex/apex_payload.img
break
fi
fi
number=$((number + 1))
done
}
# taken from Magisk, with modifications for NanoDroid
mount_apex () {
APEX_LD=""
if ${BOOTMODE}; then
APEX_LD=/system/apex/${APEX_NAME}
APEX_LD=/system/apex/com.android.runtime
else
APEX_LD=/apex/${APEX_NAME}
APEX_LD=/apex/com.android.runtime
if [ -n "${APEX_FILE}" ]; then
mkdir -p "${TMPDIR}/apex"
unzip -oq "${APEX_FILE}" -d "${TMPDIR}/apex"
mkdir -p /apex
test -e /dev/loop_apex || mknod -m644 /dev/loop_apex b 7 8
for apex in /system/apex/*; do
apex_mount="/apex/$(basename ${apex} .apex)"
apex_loop="/dev/loop_apex_$(basename ${apex} .apex)"
mkdir -p /apex/com.android.runtime
losetup /dev/loop_apex "${TMPDIR}/apex/apex_payload.img" || error "APEX losetup failed!"
mount -text4 -oro,noatime /dev/loop_apex /apex/com.android.runtime || error "APEX mount failed!"
[ "${apex_mount}" == /apex/com.android.runtime.release ] && apex_mount=/apex/com.android.runtime
[ "${apex_mount}" == /apex/com.android.runtime.debug ] && apex_mount=/apex/com.android.runtime
rm -rf "${TMPDIR}/apex"
elif [ -n "${APEX_DIR}" ]; then
mkdir -p /apex
ln -sf "${APEX_DIR}" /apex/${APEX_NAME}
fi
if [ -f "${apex}" ]; then
unzip -oq "${apex}" apex_payload.img -d /apex
mount_apex_loop "${apex_mount}" || error "APEX loop setup failed!"
elif [ -d "${apex}" ]; then
mount -o bind "${apex}" "${apex_mount}"
fi
done
export ANDROID_RUNTIME_ROOT=/apex/com.android.runtime
export ANDROID_TZDATA_ROOT=/apex/com.android.tzdata
fi
echo " INFO: #10 [APEX_NAME] ${APEX_NAME}"
echo " INFO: #11 [APEX_FILE] ${APEX_FILE}"
echo " INFO: #12 [APEX_DIR] ${APEX_DIR}"
echo " INFO: #13 [APEX_LD] ${APEX_LD}"
echo " INFO: #14 [APEX [ALL]] $(ls /system/apex/*.apex)"
echo " INFO: #10 [APEX_LD] ${APEX_LD}"
echo " INFO: #11 [APEX [ALL]] $(ls /system/apex/*.apex)"
}
# taken from Magisk, with minor modifications for NanoDroid
@ -166,6 +179,28 @@ mount_partitions () {
mount_apex
}
umount_partitions () {
umount -l /system_root 2>/dev/null
umount -l /system 2>/dev/null
umount -l /vendor 2>/dev/null
umount -l /dev/random 2>/dev/null
mount | awk '/ \/apex/{print $3}' | while read apex_mount; do
umount -l "${apex_mount}" 2>/dev/null
done
mount | awk '/ \/apex/{print $1}' | while read apex_loop; do
losetup -d "${apex_loop}" 2>/dev/null
done
unset ANDROID_RUNTIME_ROOT
unset ANDROID_TZDATA_ROOT
unset BOOTCLASSPATH
rm -rf ${APEX_TMP}/apex
rm -rf /apex
}
error () {
ui_print " "
ui_print " !! ${@}"
@ -421,16 +456,18 @@ setup_patcher () {
call_dalvikvm () {
FRAME=/system/framework
APEXB=/apex/com.android.runtime/javalib
if [ -n "${APEX_NAME}" ]; then
APEXB=/apex/com.android.runtime/javalib
BOOTCLASSES=${APEXB}/core-oj.jar:${APEXB}/core-libart.jar:\
if [ -d "${APEXB}" ]; then
export BOOTCLASSPATH=${APEXB}/core-oj.jar:${APEXB}/core-libart.jar:\
${APEXB}/okhttp.jar:${APEXB}/bouncycastle.jar:${APEXB}/apache-xml.jar:\
${FRAME}/framework.jar:${FRAME}/ext.jar:${FRAME}/telephony-common.jar:\
${FRAME}/voip-common.jar:${FRAME}/ims-common.jar:${FRAME}/android.test.base.jar:\
${FRAME}/telephony-ext.jar
${FRAME}/telephony-ext.jar:\
/apex/com.android.conscrypt/javalib/conscrypt.jar:\
/apex/com.android.media/javalib/updatable-media.jar
else
BOOTCLASSES=${FRAME}/core-oj.jar:${FRAME}/core-libart.jar:\
export BOOTCLASSPATH=${FRAME}/core-oj.jar:${FRAME}/core-libart.jar:\
${FRAME}/okhttp.jar:${FRAME}/bouncycastle.jar:${FRAME}/apache-xml.jar:\
${FRAME}/framework.jar:${FRAME}/ext.jar:${FRAME}/telephony-common.jar:\
${FRAME}/voip-common.jar:${FRAME}/ims-common.jar:${FRAME}/android.test.base.jar:\
@ -447,16 +484,7 @@ ${FRAME}/telephony-ext.jar
[[ "${supported_opts}" == *verbose:*jni* ]] && DALVIKVM_OPTS="${DALVIKVM_OPTS} -verbose:jni"
[[ "${supported_opts}" == *verbose:*class* ]] && DALVIKVM_OPTS="${DALVIKVM_OPTS} -verbose:class"
if [ "${ROM_DEX_STATUS}" = "DEODEX" ]; then
/system/bin/dalvikvm \
-Xbootclasspath:${BOOTCLASSES} \
${DALVIKVM_OPTS} \
"${@}"
else
/system/bin/dalvikvm \
${DALVIKVM_OPTS} \
"${@}"
fi
/system/bin/dalvikvm ${DALVIKVM_OPTS} "${@}"
}
deodex_vdex () {
@ -638,4 +666,3 @@ install_addond () {
cp "${BASEDIR}/70-nanodroidpatcher.sh" /system/addon.d/
chmod 0755 /system/addon.d/70-nanodroidpatcher.sh
}

@ -49,14 +49,7 @@ patch_services
install_services
install_addond
if ! ${BOOTMODE} ; then
umount -l /system_root 2>/dev/null
umount -l /system 2>/dev/null
umount -l /vendor 2>/dev/null
umount -l /dev/random 2>/dev/null
umount -l /apex/com.android.runtime 2>/dev/null
losetup -d ${APEX_LOOP} 2>/dev/null
fi
! ${BOOTMODE} && umount_partitions
ui_print " "
ui_print " > Done!"

@ -54,6 +54,8 @@ NanoDroidPatcher () {
patch_services
install_services
umount_partitions
ui_print " "
ui_print " > Done!"
ui_print " "

@ -34,8 +34,17 @@ if ! ${BOOTMODE} ; then
umount -l /system 2>/dev/null
umount -l /vendor 2>/dev/null
umount -l /dev/random 2>/dev/null
umount -l /apex/com.android.runtime 2>/dev/null
losetup -d ${APEX_LOOP} 2>/dev/null
mount | awk '/ \/apex/{print $3}' | while read apex_mount; do
umount -l "${apex_mount}" 2>/dev/null
done
mount | awk '/ \/apex/{print $1}' | while read apex_loop; do
losetup -d "${apex_loop}" 2>/dev/null
done
rm -rf ${APEX_TMP}/apex
rm -rf /apex
fi
ui_print " > Done!"

@ -37,35 +37,67 @@ is_mounted () {
return $?
}
mount_apex () {
APEX_FILE=""
APEX_DIR=""
APEX_LOOP=""
for apex in com.android.runtime com.android.runtime.release com.android.runtime.debug; do
if [ -f /system/apex/${apex}.apex ]; then
APEX_FILE=/system/apex/${apex}.apex
break
elif [ -d /system/apex/${apex} ]; then
APEX_DIR=/system/apex/${apex}
break
# taken from Magisk, with modifications for NanoDroid
mount_apex_loop () {
local number=0
local minorx=1
local loop
[ -e /dev/block/loop1 ] && minorx=$(stat -Lc '%T' /dev/block/loop1)
apex_mount="${1}"
mkdir -p "${apex_mount}"
while [ ${number} -lt 64 ]; do
loop=/dev/block/loop${number}
[ -e ${loop} ] || mknod ${loop} b 7 $((number * minorx))
echo " *** mount_apex_loop [loop] ${loop}"
echo " *** mount_apex_loop [apex_mount] ${apex_mount}"
if losetup "${loop}" /apex/apex_payload.img; then
if mount -text4 -oro,noatime "${loop}" "${apex_mount}"; then
rm -f /apex/apex_payload.img
break
fi
fi
number=$((number + 1))
done
}
if ! ${BOOTMODE}; then
if [ -n "${APEX_FILE}" ]; then
mkdir -p "${TMPDIR}/apex"
unzip -oq "${APEX_FILE}" -d "${TMPDIR}/apex"
# taken from Magisk, with modifications for NanoDroid
mount_apex () {
APEX_LD=""
mkdir -p /apex/com.android.runtime
mount -oloop,ro "${TMPDIR}/apex/apex_payload.img" /apex/com.android.runtime
if ${BOOTMODE}; then
APEX_LD=/system/apex/com.android.runtime
else
APEX_LD=/apex/com.android.runtime
APEX_LOOP=$(mount | awk '/com.android.runtime/{print $1}')
elif [ -n "${APEX_DIR}" ]; then
mkdir -p /apex
ln -sf "${APEX_DIR}" /apex/com.android.runtime
fi
mkdir -p /apex
for apex in /system/apex/*; do
apex_mount="/apex/$(basename ${apex} .apex)"
apex_loop="/dev/loop_apex_$(basename ${apex} .apex)"
[ "${apex_mount}" == /apex/com.android.runtime.release ] && apex_mount=/apex/com.android.runtime
[ "${apex_mount}" == /apex/com.android.runtime.debug ] && apex_mount=/apex/com.android.runtime
if [ -f "${apex}" ]; then
unzip -oq "${apex}" apex_payload.img -d /apex
mount_apex_loop "${apex_mount}" || error "APEX loop setup failed!"
elif [ -d "${apex}" ]; then
mount -o bind "${apex}" "${apex_mount}"
fi
done
export ANDROID_RUNTIME_ROOT=/apex/com.android.runtime
export ANDROID_TZDATA_ROOT=/apex/com.android.tzdata
fi
echo " INFO: #10 [APEX_LD] ${APEX_LD}"
echo " INFO: #11 [APEX [ALL]] $(ls /system/apex/*.apex)"
}
# taken from Magisk, with minor modifications for NanoDroid

@ -113,33 +113,68 @@ error () {
ui_print " !!"
exit 1
}
mount_apex () {
APEX_FILE=""
APEX_DIR=""
APEX_LOOP=""
for apex in com.android.runtime com.android.runtime.release com.android.runtime.debug; do
if [ -f /system/apex/${apex}.apex ]; then
APEX_FILE=/system/apex/${apex}.apex
break
elif [ -d /system/apex/${apex} ]; then
APEX_DIR=/system/apex/${apex}
break
# taken from Magisk, with modifications for NanoDroid
mount_apex_loop () {
local number=0
local minorx=1
local loop
[ -e /dev/block/loop1 ] && minorx=$(stat -Lc '%T' /dev/block/loop1)
apex_mount="${1}"
mkdir -p "${apex_mount}"
while [ ${number} -lt 64 ]; do
loop=/dev/block/loop${number}
[ -e ${loop} ] || mknod ${loop} b 7 $((number * minorx))
echo " *** mount_apex_loop [loop] ${loop}"
echo " *** mount_apex_loop [apex_mount] ${apex_mount}"
if losetup "${loop}" /apex/apex_payload.img; then
if mount -text4 -oro,noatime "${loop}" "${apex_mount}"; then
rm -f /apex/apex_payload.img
break
fi
fi
number=$((number + 1))
done
}
if [ -n "${APEX_FILE}" ]; then
mkdir -p "${TMPDIR}/apex"
unzip -oq "${APEX_FILE}" -d "${TMPDIR}/apex"
# taken from Magisk, with modifications for NanoDroid
mount_apex () {
APEX_LD=""
mkdir -p /apex/com.android.runtime
mount -oloop,ro "${TMPDIR}/apex/apex_payload.img" /apex/com.android.runtime
if ${BOOTMODE}; then
APEX_LD=/system/apex/com.android.runtime
else
APEX_LD=/apex/com.android.runtime
APEX_LOOP=$(mount | awk '/com.android.runtime/{print $1}')
elif [ -n "${APEX_DIR}" ]; then
mkdir -p /apex
ln -sf "${APEX_DIR}" /apex/com.android.runtime
for apex in /system/apex/*; do
apex_mount="/apex/$(basename ${apex} .apex)"
apex_loop="/dev/loop_apex_$(basename ${apex} .apex)"
[ "${apex_mount}" == /apex/com.android.runtime.release ] && apex_mount=/apex/com.android.runtime
[ "${apex_mount}" == /apex/com.android.runtime.debug ] && apex_mount=/apex/com.android.runtime
if [ -f "${apex}" ]; then
unzip -oq "${apex}" apex_payload.img -d /apex
mount_apex_loop "${apex_mount}" || error "APEX loop setup failed!"
elif [ -d "${apex}" ]; then
mount -o bind "${apex}" "${apex_mount}"
fi
done
export ANDROID_RUNTIME_ROOT=/apex/com.android.runtime
export ANDROID_TZDATA_ROOT=/apex/com.android.tzdata
fi
echo " INFO: #10 [APEX_LD] ${APEX_LD}"
echo " INFO: #11 [APEX [ALL]] $(ls /system/apex/*.apex)"
}
# taken from Magisk, with minor modifications for NanoDroid
@ -379,8 +414,20 @@ umount -l /system_root 2>/dev/null
umount -l /system 2>/dev/null
umount -l /vendor 2>/dev/null
umount -l /dev/random 2>/dev/null
umount -l /apex/com.android.runtime 2>/dev/null
losetup -d ${APEX_LOOP} 2>/dev/null
mount | awk '/ \/apex/{print $3}' | while read apex_mount; do
umount -l "${apex_mount}" 2>/dev/null
done
mount | awk '/ \/apex/{print $1}' | while read apex_loop; do
losetup -d "${apex_loop}" 2>/dev/null
done
unset ANDROID_RUNTIME_ROOT
unset ANDROID_TZDATA_ROOT
rm -rf ${APEX_TMP}/apex
rm -rf /apex
ui_print " "
ui_print " > Done!"

Loading…
Cancel
Save