2
0
mirror of https://gitlab.com/Nanolx/NanoDroid synced 2024-11-07 15:20:36 +00:00
NanoDroid/CommonInstaller

1707 lines
44 KiB
Plaintext
Raw Normal View History

2018-01-23 20:11:52 +00:00
#!/sbin/sh
2019-06-08 20:55:16 +00:00
VERSION=21.0.90.99999999
2018-07-30 19:14:22 +00:00
NANODROID_UPGRADE=0
INSTALL_SUCCESS=TRUE
NANODROID_LIST=/data/adb/NanoDroid_FileList
2019-05-05 10:17:26 +00:00
STORAGE=/data/media/0
2018-01-23 20:11:52 +00:00
2019-02-04 19:00:54 +00:00
print_google_apps()
{
cat <<EOF
AMAPNetworkLocation
2018-08-24 22:28:06 +00:00
BaiduNetworkLocation
BlankStore
2018-12-20 20:30:24 +00:00
ConfigUpdater
GCS
2018-08-24 22:28:06 +00:00
GmsCoreSetupPrebuilt
GmsCore_update
GoogleFeedback
2018-03-13 19:30:55 +00:00
GoogleLoginService
GoogleOneTimeInitializer
GoogleServicesFramework
GoogleConnectivityServices
GoogleTTS
2018-08-24 22:28:06 +00:00
LegacyNetworkLocation
MarketUpdater
MarkupGoogle
NetworkLocation
PlayGames
PlayStore
PrebuiltGmsCore
PrebuiltGmsCorePi
PrebuiltGmsCorePix
2018-08-24 22:28:06 +00:00
UnifiedNlp
Velvet
Vending
2019-02-04 19:00:54 +00:00
WhisperPush
EOF
}
2018-07-08 15:21:02 +00:00
2019-02-04 19:00:54 +00:00
print_google_data ()
{
cat <<EOF
com.amap.android.location
2018-08-24 22:28:06 +00:00
com.baidu.location
com.google.android.location
2018-03-13 19:30:55 +00:00
org.microg.nlp
2019-02-04 19:00:54 +00:00
org.microg.unifiednlp
EOF
}
2018-03-13 19:30:55 +00:00
2019-02-04 19:00:54 +00:00
print_google_data_dirty ()
{
cat <<EOF
com.android.vending
2019-01-01 19:58:44 +00:00
com.google.android.gms
2018-10-11 16:50:51 +00:00
com.google.android.gsf
2019-01-01 19:58:44 +00:00
com.google.android.gsf.login
com.google.android.feedback
2019-02-04 19:00:54 +00:00
com.mgoogle.android.gms
EOF
}
2018-10-11 16:50:51 +00:00
2018-01-23 20:11:52 +00:00
##########################################################################################
# Misc. Functions
##########################################################################################
check_space () {
space_required=524288
space_available=$(df /dev 2>/dev/null | awk '/tmpfs/{print $4}')
echo " required space : ${space_required}"
echo " available space: ${space_available}"
if [ ${space_available} -lt ${space_required} ]; then
error "Less than 512 MB free space availabe from TWRP!"
fi
}
2018-01-23 20:11:52 +00:00
detect_bootmode () {
[ -z ${BOOTMODE} ] && BOOTMODE=false
${BOOTMODE} || ps | grep zygote | grep -qv grep && BOOTMODE=true
${BOOTMODE} || ps -A 2>/dev/null | grep zygote | grep -qv grep && BOOTMODE=true
2019-01-01 19:51:50 +00:00
${BOOTMODE} && error "${MODID} must be flashed from TWRP!"
2018-01-23 20:11:52 +00:00
}
ui_print() {
if ${BOOTMODE}; then
echo "${@}"
else
2018-03-28 18:18:25 +00:00
echo -n -e "ui_print ${@}\n" >> /proc/self/fd/${OUTFD}
echo -n -e "ui_print\n" >> /proc/self/fd/${OUTFD}
2018-01-23 20:11:52 +00:00
fi
}
show_progress() {
echo "progress ${1} ${2}" >> /proc/self/fd/${OUTFD}
}
set_progress() {
echo "set_progress ${1}" >> /proc/self/fd/${OUTFD}
}
2018-01-23 20:11:52 +00:00
grep_prop() {
[ -f /vendor/build.prop ] && \
FILES="/system/build.prop /vendor/build.prop" || \
FILES="/system/build.prop"
sed -n "s/^${1}=//p" ${FILES} | head -n 1
2018-01-23 20:11:52 +00:00
}
grep_cmdline() {
local REGEX="s/^${1}=//p"
sed -E 's/ +/\n/g' /proc/cmdline | \
sed -n "${REGEX}" 2>/dev/null
}
2018-01-23 20:11:52 +00:00
is_mounted() {
2019-03-28 19:09:41 +00:00
grep -q "$(readlink -f ${1})" /proc/mounts 2>/dev/null
2018-01-23 20:11:52 +00:00
return $?
}
set_perm () {
chown ${2}:${3} ${1} || error "failed change owner for ${1}"
chmod ${4} ${1} || error "failed to change mode for ${1}"
2018-01-23 20:11:52 +00:00
if [ ! -z "${5}" ]; then
chcon ${5} ${1} 2>/dev/null
else chcon 'u:object_r:system_file:s0' ${1} 2>/dev/null
fi
}
set_perm_recursive() {
find ${1} -type d 2>/dev/null | while read dir; do
set_perm ${dir} ${2} ${3} ${4} ${6}
done
find ${1} -type f 2>/dev/null | while read file; do
set_perm ${file} ${2} ${3} ${5} ${6}
done
}
set_perm_data () {
if [ "${1}" = "-r" ]; then
echo " perm: data [recursive] {${2}}"
set_perm_recursive ${2} 0 0 0755 0644
else
echo " perm: data [single] {${1}}"
set_perm ${1} 0 0 0644
fi
}
set_perm_bin () {
if [ "${1}" = "-r" ]; then
echo " perm: exec [recursive] {${2}}"
set_perm_recursive ${2} 0 0 0755 0755
else
echo " perm: exec [single] {${1}}"
set_perm ${1} 0 0 0755
fi
}
2018-08-23 19:27:15 +00:00
installinfo_add () {
if [ "${MODE}" = "SYSTEM" ]; then
for file in ${@}; do
echo ${file} >> ${NANODROID_LIST}
done
fi
}
2018-01-23 20:11:52 +00:00
detect_outfd () {
if [ -z $OUTFD ] || readlink /proc/$$/fd/$OUTFD | grep -q /tmp; then
# We will have to manually find out OUTFD
for FD in `ls /proc/$$/fd`; do
if readlink /proc/$$/fd/$FD | grep -q pipe; then
if ps | grep -v grep | grep -q " 3 $FD "; then
OUTFD=$FD
2018-01-23 20:11:52 +00:00
break
fi
fi
done
fi
}
show_banner () {
ui_print " "
ui_print "*****************************"
ui_print " NanoDroid ${VERSION} "
ui_print " created by Nanolx "
case ${MODID} in
NanoDroid )
ui_print " Full package "
;;
2018-01-23 20:11:52 +00:00
NanoDroid_microG )
ui_print " microG package "
;;
NanoDroid_FDroid )
ui_print " F-Droid package "
;;
NanoDroid_BromiteWebView )
ui_print " Bromite WebView package "
;;
2018-11-23 20:04:36 +00:00
NanoDroid_OsmAnd )
ui_print " OsmAnd package "
;;
2018-01-23 20:11:52 +00:00
esac
ui_print "*****************************"
ui_print " "
}
error () {
ui_print " !!"
ui_print "${@}"
ui_print " !!"
if is_mounted /data; then
[ "${MODE}" = "MAGISK" ] && rm -rf "${MODPATH}"
2018-01-23 20:11:52 +00:00
recovery_cleanup
INSTALL_SUCCESS=FALSE
nanodroid_storelogs
fi
2018-01-23 20:11:52 +00:00
exit 1
}
# taken from Magisk, with minor modifications for NanoDroid
2018-02-25 13:26:55 +00:00
mount_partitions () {
SLOT=$(grep_cmdline androidboot.slot_suffix)
if [ -z ${SLOT} ]; then
SLOT=_$(grep_cmdline androidboot.slot)
2018-02-25 18:50:51 +00:00
[ "${SLOT}" = "_" ] && SLOT=
fi
2018-09-04 18:07:06 +00:00
is_mounted /data || mount /data || error "failed to mount /data!"
mount -o bind /dev/urandom /dev/random
! is_mounted /system && mount -o rw /system || mount -o rw,remount /system
2018-02-25 13:26:55 +00:00
if [ ! -f /system/build.prop ]; then
SYSTEMBLOCK=$(find /dev/block -iname system${SLOT} | head -n 1)
2019-03-28 19:09:41 +00:00
mount -o rw ${SYSTEMBLOCK} /system
fi
2018-08-04 18:07:14 +00:00
[ -f /system/build.prop ] || is_mounted /system || error "failed to mount /system (unsupported A/B device?)"
2019-03-28 19:09:41 +00:00
if [ -f /system/init.rc ]; then
2018-03-07 19:20:21 +00:00
mkdir /system_root 2>/dev/null
mount --move /system /system_root
mount -o bind /system_root/system /system
fi
2018-08-04 18:50:54 +00:00
[ ! -f /system/build.prop ] && error "failed to mount /system (unsupported A/B device?)"
if [ -L /system/vendor ]; then
! is_mounted /vendor && mount /vendor
if ! is_mounted /vendor; then
VENDORBLOCK=$(find /dev/block -iname vendor${SLOT} | head -n 1)
2019-03-28 19:09:41 +00:00
mount -o ro ${VENDORBLOCK} /vendor
fi
elif [ -d /system/vendor ]; then
### XXX work-around required for some ROMs
echo " xxx compat /vendor link created!"
ln -sf /system/vendor /vendor >/dev/null
fi
mount | awk '{print $1 " on " $3 " params: " $6}'
}
2018-01-23 20:11:52 +00:00
detect_mode () {
[ -f /data/adb/.nanodroid-list ] && mv /data/adb/.nanodroid-list "${NANODROID_LIST}"
2018-01-23 20:11:52 +00:00
case "${nanodroid_forcesystem}" in
2018-01-28 10:31:15 +00:00
1 )
MODE_DETECT=forced
2018-09-07 16:27:53 +00:00
MODE=SYSTEM
2018-01-28 10:31:15 +00:00
;;
0 | *)
MODE=SYSTEM
MODE_DETECT=detected
for magisk in /data/adb/magisk/magisk /data/magisk/magisk \
/data/.magisk/magisk /data/adb/modules; do
if [ -e ${magisk} ]; then
MODE=MAGISK
break
fi
done
2019-03-01 13:28:04 +00:00
if [ -f "${NANODROID_LIST}" ]; then
MODE=SYSTEM
NANODROID_UPGRADE=1
2018-01-23 20:11:52 +00:00
fi
;;
esac
ui_print " > Mode | ${MODE} | ${MODE_DETECT}"
ui_print " "
case ${MODE} in
SYSTEM )
recovery_actions
unset MODPATH
;;
2018-03-18 19:15:17 +00:00
MAGISK )
magisk_install_setup
case ${MODID} in
NanoDroid | NanoDroid_microG )
magisk_install_preinst
;;
esac
2018-08-19 16:46:55 +00:00
rm -rf "${MODPATH}"
;;
esac
if [ "${nanodroid_fonts}" -eq 1 ]; then
if test -h ${MODPATH}/system/fonts/Roboto-Regular.ttf; then
CUSTOM_FONT="$(basename $(readlink ${MODPATH}/system/fonts/Roboto-Regular.ttf) .ttf)"
ui_print " << Detected NanoDroid-Font (${CUSTOM_FONT})"
fi
fi
[ "${ROM_NO_XBIN}" -eq 1 ] && \
NANODROID_BINDIR="${MODPATH}/system/bin" || \
NANODROID_BINDIR="${MODPATH}/system/xbin"
2018-01-23 20:11:52 +00:00
}
unpack_zip () {
TMPDIR=/dev/tmp
TMP_LIBDIR=${TMPDIR}/nanodroid-lib
INSTALLER=${TMPDIR}/install
rm -rf ${INSTALLER}
mkdir -p ${INSTALLER} || error "failed to prepare environment!"
2018-01-23 20:11:52 +00:00
ui_print " > prepare installation"
2019-04-25 18:49:26 +00:00
unzip -oq "${ZIP}" -d "${INSTALLER}" || \
error "failed to prepare environment!"
2019-02-04 19:00:54 +00:00
rm -rf ${TMPDIR}/framework-res
rm -f ${TMPDIR}/*.xml
rm -f ${TMPDIR}/*.list
2018-01-23 20:11:52 +00:00
}
nanodroid_finalize () {
case ${MODID} in
NanoDroid | NanoDroid_microG )
if [ "${nanodroid_overlay}" -eq 1 ]; then
2019-06-08 20:40:33 +00:00
ui_print " << with /system applications overlays"
2018-08-19 16:46:55 +00:00
${NANODROID_BINDIR}/nanodroid-overlay --create
else
2019-06-08 20:40:33 +00:00
ui_print " << without /system applications overlays"
fi
;;
2018-04-22 18:08:38 +00:00
esac
if [ "${MODE}" = "MAGISK" ]; then
magisk_install_finish
else
install_addond
recovery_cleanup
sort ${NANODROID_LIST} | uniq > /tmp/nanodroid-list
mv /tmp/nanodroid-list ${NANODROID_LIST}
fi
2018-02-20 17:59:32 +00:00
ui_print " "
ui_print " Thanks for using NanoDroid "
ui_print " "
sync
nanodroid_storelogs
2018-12-03 18:56:00 +00:00
rm -rf ${INSTALLER}
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
2018-01-23 20:11:52 +00:00
}
##########################################################################################
# Architecture detection
##########################################################################################
detect_arch () {
SDK_VERSION=$(grep_prop ro.build.version.sdk)
ABI=$(grep_prop ro.product.cpu.abi | cut -c-3)
ABI2=$(grep_prop ro.product.cpu.abi2 | cut -c-3)
ABILONG=$(grep_prop ro.product.cpu.abi)
ARCH=arm
[ "$ABI" = "x86" ] && ARCH=x86
[ "$ABI2" = "x86" ] && ARCH=x86
[ "$ABILONG" = "arm64-v8a" ] && ARCH=arm64
[ "$ABILONG" = "x86_64" ] && ARCH=x86_64
2018-01-23 20:11:52 +00:00
case ${ARCH} in
arm ) BIN_ARCH="arm"
LIB_ARCHES="armeabi-v7a armeabi"
SWIPE_LIBDIR=lib ;;
arm64 ) BIN_ARCH="arm"
LIB_ARCHES="arm64-v8a armeabi-v7a armeabi"
SWIPE_LIBDIR=lib64 ;;
x86 ) BIN_ARCH="x86"
LIB_ARCHES="x86 armeabi-v7a armeabi"
SWIPE_LIBDIR=lib ;;
x86_64 ) BIN_ARCH="x86"
LIB_ARCHES="x86_64 x86 armeabi-v7a armeabi"
SWIPE_LIBDIR=lib64 ;;
esac
UNZIP="${INSTALLER}/system/xbin/unzip.${BIN_ARCH}"
chmod +x "${UNZIP}"
2019-05-23 16:56:37 +00:00
AAPT="${INSTALLER}/aapt.${BIN_ARCH}"
chmod +x "${AAPT}"
2018-01-26 14:32:52 +00:00
2018-01-23 20:11:52 +00:00
case ${SDK_VERSION} in
19 ) GSYNC_VER=K ;;
21 | 22 ) GSYNC_VER=L ;;
23 ) GSYNC_VER=M ;;
24 | 25 ) GSYNC_VER=N ;;
26 | 27 ) GSYNC_VER=O ;;
28 ) GSYNC_VER=P ;;
2018-01-23 20:11:52 +00:00
* ) GSYNC_UNSUPPORTED=1 ;;
esac
case ${ARCH} in
arm )
case ${SDK_VERSION} in
19 | 21 | 22 | 23 | 27 | 28 )
LIBJNI_IME=libjni_latinimegoogle.so_${SDK_VERSION}
;;
24 | 25 | 26 )
LIBJNI_IME=libjni_latinimegoogle.so_23
;;
* )
SWIPE_UNSUPPORTED=1
;;
esac
;;
arm64 )
case ${SDK_VERSION} in
21 | 22 | 23 | 27 | 28 )
LIBJNI_IME=libjni_latinimegoogle.so_${SDK_VERSION}
;;
24 | 25 | 26 )
LIBJNI_IME=libjni_latinimegoogle.so_23
;;
* )
SWIPE_UNSUPPORTED=1
;;
esac
;;
x86 | x86_64 )
case ${SDK_VERSION} in
19 | 21 | 22 )
SWIPE_UNSUPPORTED=1
;;
23 | 24 | 25 | 26 | 27 | 28 )
LIBJNI_IME=libjni_latinimegoogle.so
;;
* )
SWIPE_UNSUPPORTED=1
;;
esac
;;
esac
2018-01-23 20:11:52 +00:00
if [[ "${SDK_VERSION}" -lt 21 ]]; then
UNFOLD_APP_DIR=1
else UNFOLD_APP_DIR=0
fi
if [[ "${SDK_VERSION}" -lt 19 ]]; then
ui_print " "
ui_print " ++ Installing on pre-KitKat ROM, full"
ui_print " ++ compatibility is not garantueed!"
ui_print " "
fi
if [ ! -d /system/xbin ]; then
ROM_NO_XBIN=1
echo " ++ ROM has no /system/xbin, using /system/bin instead"
2019-05-12 20:24:38 +00:00
else ROM_NO_XBIN=0
fi
2018-04-09 18:22:48 +00:00
[ ! -d /data/adb ] && mkdir /data/adb
2018-01-23 20:11:52 +00:00
}
setup_busybox () {
OLD_PATH=${PATH}
mkdir -p ${INSTALLER}/busybox
ln -s ${INSTALLER}/busybox.${BIN_ARCH} ${INSTALLER}/busybox/busybox
2018-09-01 09:23:15 +00:00
chmod 0755 ${INSTALLER}/busybox.${BIN_ARCH}
${INSTALLER}/busybox.${BIN_ARCH} --install -s ${INSTALLER}/busybox/
chmod 0755 ${INSTALLER}/sqlite3.${BIN_ARCH}
# XXX Magisk recovery_actions() compat
export BBDIR="${INSTALLER}/busybox"
export PATH="${INSTALLER}/busybox:${PATH}"
}
# Taken from Magisk, used for System Mode installation
recovery_actions () {
mv /sbin /sbin_tmp
OLD_LD_LIB=$LD_LIBRARY_PATH
OLD_LD_PRE=$LD_PRELOAD
unset LD_LIBRARY_PATH
unset LD_PRELOAD
}
# Taken from Magisk, used for System Mode installation
recovery_cleanup () {
mv /sbin_tmp /sbin 2>/dev/null
[ -z $OLD_PATH ] || export PATH=$OLD_PATH
[ -z $OLD_LD_LIB ] || export LD_LIBRARY_PATH=$OLD_LD_LIB
[ -z $OLD_LD_PRE ] || export LD_PRELOAD=$OLD_LD_PRE
}
2018-01-23 20:11:52 +00:00
##########################################################################################
# Magisk Mode Installation
##########################################################################################
magisk_install_setup () {
ui_print "******************************"
ui_print "Powered by Magisk (@topjohnwu)"
ui_print "******************************"
ui_print " "
ui_print " > setup Magisk environment"
if [ -f /data/adb/magisk/util_functions.sh ]; then
NVBASE=/data/adb
. /data/adb/magisk/util_functions.sh
else
error "Magisk version 15.0 or newer is required"
fi
2018-01-23 20:11:52 +00:00
2019-03-28 19:09:41 +00:00
if [ ${MAGISK_VER_CODE} -gt 18100 ]; then
MOUNTPATH=${NVBASE}/modules
MODPATH=${MOUNTPATH}/${MODID}
2018-01-23 20:11:52 +00:00
2019-03-28 19:09:41 +00:00
# XXX when upgrading from Magisk 18.1 to 19.0 and flashing NanoDroid in one go,
# XXX and NanoDroid installation logs exist, assume an upgrade
2019-05-11 19:28:25 +00:00
[[ "$(find /data/adb -type f -name 'NanoDroid*')" && -f ${NVBASE}/magisk.img ]] && NANODROID_UPGRADE=1
[[ -d "${STORAGE}/nanodroid_logs" && -f ${NVBASE}/magisk.img ]] && NANODROID_UPGRADE=1
2018-01-23 20:11:52 +00:00
2019-03-28 19:09:41 +00:00
recovery_actions
else
error "Magisk version 19.0 or newer is required"
2019-02-04 19:00:54 +00:00
fi
2018-01-23 20:11:52 +00:00
case ${MODID} in
NanoDroid )
# check for sub-modules which are not
# supposed to be installed alongside
for dir in NanoDroid_microG NanoDroid_FDroid; do
2018-11-12 17:04:21 +00:00
if [ -d ${MOUNTPATH}/${dir} ]; then
ui_print " !! ${dir} module detected - uninstalling!"
2018-11-12 17:04:21 +00:00
rm -rf ${MOUNTPATH}/${dir}
NANODROID_UPGRADE=1
2018-01-23 20:11:52 +00:00
fi
done
;;
2018-09-08 17:05:01 +00:00
NanoDroid_microG | NanoDroid_FDroid )
2018-01-23 20:11:52 +00:00
# check for Full package and abort if found
2018-11-12 17:04:21 +00:00
[ -d ${MOUNTPATH}/NanoDroid ] && \
error "${MODID} can't be installed along side the Full package"
;;
2018-11-23 20:18:01 +00:00
NanoDroid_BromiteWebView | NanoDroid_OsmAnd )
true
;;
* )
error "unknown module intended to be installed!?"
2018-01-23 20:11:52 +00:00
;;
esac
2018-09-08 17:05:01 +00:00
2018-11-12 17:04:21 +00:00
[ -d ${MODPATH} ] && NANODROID_UPGRADE=1
2018-01-23 20:11:52 +00:00
}
magisk_install_preinst () {
if [ -f ${MODPATH}/system.prop ]; then
2018-01-23 20:11:52 +00:00
ui_print " << backing up module's system.prop"
cp ${MODPATH}/system.prop ${TMPDIR}/system.prop
2018-01-23 20:11:52 +00:00
fi
if [ -f ${MODPATH}/system/framework/services.jar ]; then
2018-09-16 08:52:38 +00:00
ui_print " << backing up patched services.jar"
cp ${MODPATH}/system/framework/services.jar ${TMPDIR}/services.jar
2018-01-23 20:11:52 +00:00
fi
if [ -d ${MODPATH}/logs ]; then
ui_print " << backing up init.d script logs"
cp -r ${MODPATH}/logs ${TMPDIR}/logs
fi
if [ -d ${MODPATH}/logcats ]; then
ui_print " << backing up logcats"
cp -r ${MODPATH}/logcats ${TMPDIR}/logcats
fi
2018-01-23 20:11:52 +00:00
}
magisk_install_postinst () {
if [ -f ${TMPDIR}/system.prop ]; then
ui_print " << restoring system.prop"
cp ${TMPDIR}/system.prop ${MODPATH}/system.prop
2018-01-23 20:11:52 +00:00
fi
if [ "${nanodroid_microg}" -ne 0 -o "${MODID}" = "NanoDroid_microG" ]; then
if [ ! -z $(grep_prop ro.setupwizard.mode) ]; then
echo "ro.setupwizard.mode=DISABLED" >> ${MODPATH}/system.prop
fi
fi
if [ -d ${TMPDIR}/logs ]; then
ui_print " << restoring init.d script logs"
cp -r ${TMPDIR}/logs ${MODPATH}/logs
fi
if [ -d ${TMPDIR}/logcats ]; then
ui_print " << restoring logcats"
cp -r ${TMPDIR}/logcats ${MODPATH}/logcats
fi
2018-01-23 20:11:52 +00:00
if [ -f ${TMPDIR}/services.jar ]; then
ui_print " << restoring patched services.jar"
mkdir -p ${MODPATH}/system/framework
cp ${TMPDIR}/services.jar ${MODPATH}/system/framework/services.jar
2018-01-23 20:11:52 +00:00
fi
}
magisk_install_finish () {
# Magisk Module files
cp -af ${INSTALLER}/module.prop ${MODPATH}/module.prop
2018-02-09 16:09:36 +00:00
if [ -f ${INSTALLER}/service.sh ]; then
cp -af ${INSTALLER}/service.sh ${MODPATH}/service.sh
2018-02-09 16:09:36 +00:00
chmod +x ${MODPATH}/service.sh
fi
2018-01-23 20:11:52 +00:00
case ${MODID} in
NanoDroid | NanoDroid_microG )
magisk_install_postinst
;;
esac
2018-03-28 18:36:36 +00:00
if [ "${nanodroid_fonts}" -eq 1 -a ! -z ${CUSTOM_FONT} ]; then
ui_print " << Restore NanoDroid-Font (${CUSTOM_FONT})"
2018-08-19 16:46:55 +00:00
${NANODROID_BINDIR}/nanodroid-font -s "${CUSTOM_FONT}"
fi
recovery_cleanup
2018-01-23 20:11:52 +00:00
}
##########################################################################################
# Destroy all GApps!
##########################################################################################
gapps_solve_conflicts () {
# first get rid of conflicting packages
2019-02-04 19:00:54 +00:00
print_google_apps | while read app; do
echo " ++ removing app: ${app} [google_apps]"
${NANODROID_BINDIR}/nanodroid-overlay --add ${app}
2018-01-23 20:11:52 +00:00
rm -rf /data/dalvik-cache/*/system"@priv-app@${app}"[@\.]*@classes.*
rm -rf /data/dalvik-cache/*/system"@app@${app}"[@\.]*@classes.*
done
2019-02-04 19:00:54 +00:00
print_google_data | while read app; do
echo " ++ removing data for: ${app} [google_data]"
rm -rf /data/data/${app}
rm -rf /data/user/*/${app}
rm -rf /data/user_de/*/${app}
rm -rf /data/app/${app}-*
rm -rf /mnt/asec/${app}-*
2019-05-05 10:17:26 +00:00
rm -rf ${STORAGE}/Android/data/${app}
done
}
2018-07-08 15:21:02 +00:00
gapps_destroy_artifacts () {
# this removes original Play Services
# only if this is a fresh NanoDroid installation
if [ "${NANODROID_UPGRADE}" -eq 0 ]; then
rm -rf /data/dalvik-cache/*/system"@priv-app@GmsCore"[@\.]*@classes.*
2018-07-08 15:21:02 +00:00
2019-02-04 19:00:54 +00:00
print_google_data_dirty | while read app; do
echo " ++ removing data for: ${app} [google_data_dirty]"
2018-07-08 15:21:02 +00:00
rm -rf /data/data/${app}
rm -rf /data/user/*/${app}
rm -rf /data/user_de/*/${app}
rm -rf /data/app/${app}-*
2018-10-11 16:50:51 +00:00
rm -rf /mnt/asec/${app}-*
2019-05-05 10:17:26 +00:00
rm -rf ${STORAGE}/Android/data/${app}
done
2018-12-03 19:33:00 +00:00
find /data/system* -type f -name 'accounts*db' 2>/dev/null | while read database; do
2018-12-03 19:02:48 +00:00
echo " ++ deleting Google Accounts from ${database} (if any)"
${INSTALLER}/sqlite3.${BIN_ARCH} ${database} \
"DELETE FROM accounts WHERE type='com.google';"
done
2018-12-03 19:33:00 +00:00
find /data/system/users -type f -name 'runtime-permissions.xml' 2>/dev/null | while read file; do
if grep -q "com.google.android" "${file}"; then
rm -f "${file}"
2018-12-03 19:02:48 +00:00
echo " ++ resetting permissions: ${file}"
fi
done
2018-07-08 15:21:02 +00:00
if [ -f /data/system/packages.list ]; then
2019-02-04 19:00:54 +00:00
print_google_data_dirty | while read app; do
echo " ++ de-registering app: ${app} (if installed)"
sed -e "/${app}/d" -i /data/system/packages.list
done
fi
fi
}
2018-07-08 15:21:02 +00:00
##########################################################################################
# check if ROM has native fake signature spoofing support
# by @ale5000
##########################################################################################
check_fake_package_signature () {
PERMISSION=android.permission.FAKE_PACKAGE_SIGNATURE
PERMISSION_OD=$(echo -n "${PERMISSION}" | od -A n -t x1 | tr -d '\n' | sed -e 's/^ //g;s/ /00/g')
HAS_FAKESIGN=false
FW_RES_DIR="${TMPDIR}/framework-res"
FW_RES_FILE="${FW_RES_DIR}/AndroidManifest.xml"
2019-02-04 19:00:54 +00:00
if [ ! -f ${FW_RES_FILE} ]; then
2019-02-04 19:00:54 +00:00
mkdir -p "${FW_RES_DIR}"
"${UNZIP}" -oq /system/framework/framework-res.apk -d "${FW_RES_DIR}"
2019-02-04 19:00:54 +00:00
fi
grep -qF "${PERMISSION}" "${FW_RES_FILE}" && HAS_FAKESIGN=true
od -A n -t x1 "${FW_RES_FILE}" | tr -d ' \n' | grep -qF "${PERMISSION_OD}" && HAS_FAKESIGN=true
${HAS_FAKESIGN} && return 0 || return 1
}
##########################################################################################
# check if Bromite System WebView is supported
##########################################################################################
check_bromite_webview_support () {
WEBVIEW_PKG="com.android.webview"
HAS_WEBVIEW=false
FW_RES_DIR="${TMPDIR}/framework-res"
FW_RES_FILE="${FW_RES_DIR}/res/xml/config_webview_packages.xml"
if [ ! -f ${FW_RES_FILE} ]; then
mkdir -p "${FW_RES_DIR}"
"${UNZIP}" -oq /system/framework/framework-res.apk -d "${FW_RES_DIR}"
fi
grep -qF "${WEBVIEW_PKG}" "${FW_RES_FILE}" && HAS_WEBVIEW=true
${HAS_WEBVIEW} && return 0 || return 1
}
##########################################################################################
# privapp permission whitelist generation
##########################################################################################
dump_system_privapp_permissions () {
SYS_LIST="${TMPDIR}/privapp-permissions.list"
# XXX this looks shitty
2019-05-23 17:18:49 +00:00
"${AAPT}" dump xmltree /system/framework/framework-res.apk AndroidManifest.xml | \
tr -d '\n' | sed -e 's/E:/\n/g' | grep '(type 0x11)0x12' | \
awk -F\" '{print $2}' | sort > "${SYS_LIST}"
# XXX pre-patched custom ROM
check_fake_package_signature && \
echo "android.permission.FAKE_PACKAGE_SIGNATURE" >> "${SYS_LIST}"
}
create_privapp_permissions_whitelist () {
APK="${MODPATH}/system/priv-app/${1}/${1}.apk"
APK_NAME="$("${AAPT}" dump badging "${APK}" | awk -F \' '/^package: name/{print $2}')"
APK_LIST="${TMPDIR}/${APK_NAME}.list"
SYS_LIST="${TMPDIR}/privapp-permissions.list"
APP_WHITELIST="${TMPDIR}/${APK_NAME}.xml"
INST_WHITELIST="/system/etc/permissions/${APK_NAME}.xml"
[ ! -f "${SYS_LIST}" ] && dump_system_privapp_permissions
"${AAPT}" dump permissions "${APK}" | \
awk -F \' '/^uses-permission:/{print $2}' | \
2019-05-23 17:01:17 +00:00
sort > "${APK_LIST}"
echo '<?xml version="1.0" encoding="utf-8"?>
<permissions>
<privapp-permissions package="'${APK_NAME}'">' > "${APP_WHITELIST}"
cat "${APK_LIST}" | while read perm; do
if grep -q "${perm}" "${SYS_LIST}"; then
echo " ++ package ${APK_NAME} needs privapp-whitelist ${perm}"
echo ' <permission name="'${perm}'" />' >> "${APP_WHITELIST}"
fi
done
echo ' </privapp-permissions>
</permissions>' >> "${APP_WHITELIST}"
mkdir -p "${MODPATH}/system/etc/permissions/"
cp "${APP_WHITELIST}" "${MODPATH}/${INST_WHITELIST}"
set_perm_data "${MODPATH}/${INST_WHITELIST}"
installinfo_add "${INST_WHITELIST}"
}
##########################################################################################
# Generic Installation
##########################################################################################
install_microg () {
# install microG if requested
# respectively force if it's the microG package
if [ "${nanodroid_microg}" -ne 0 -o "${MODID}" = "NanoDroid_microG" ]; then
gapps_solve_conflicts
gapps_destroy_artifacts
2018-07-08 15:21:02 +00:00
NLPBACKEND="nlpBackendNominatim"
2019-01-05 23:31:05 +00:00
ui_print " << with microg"
ui_print " ++ Nominatim geocoder backend"
${NANODROID_BINDIR}/nanodroid-overlay --add NominatimGeocoderBackend
${NANODROID_BINDIR}/nanodroid-overlay --add NominatimNlpBackend
if [ "${nanodroid_nlpbackend:0:1}" -eq 1 ]; then
NLPBACKEND="${NLPBACKEND} nlpBackendDejavu"
2019-01-05 23:31:05 +00:00
ui_print " ++ Déjà Vu location backend"
${NANODROID_BINDIR}/nanodroid-overlay --add DejaVuNlpBackend
${NANODROID_BINDIR}/nanodroid-overlay --add DejaVuBackend
fi
if [ "${nanodroid_nlpbackend:1:1}" -eq 1 ]; then
NLPBACKEND="${NLPBACKEND} nlpBackendIchnaea"
2019-01-05 23:31:05 +00:00
ui_print " ++ Ichnaea location backend"
${NANODROID_BINDIR}/nanodroid-overlay --add IchnaeaNlpBackend
${NANODROID_BINDIR}/nanodroid-overlay --add MozillaNlpBackend
fi
if [ "${nanodroid_nlpbackend:2:1}" -eq 1 ]; then
NLPBACKEND="${NLPBACKEND} nlpBackendApple"
2019-01-05 23:31:05 +00:00
ui_print " ++ Apple location backend"
fi
2018-01-23 20:11:52 +00:00
2019-01-05 23:27:14 +00:00
if [ "${nanodroid_nlpbackend:3:1}" -eq 1 ]; then
NLPBACKEND="${NLPBACKEND} nlpBackendRadiocell"
2019-01-05 23:31:05 +00:00
ui_print " ++ Radiocell location backend"
fi
if [ "${nanodroid_gmscore}" -eq 1 ]; then
2018-11-28 20:35:30 +00:00
ui_print " ++ Official microG GmsCore"
nanodroid_install_apk GmsCore_Official "" GmsCore
2018-11-28 20:35:30 +00:00
else
ui_print " ++ NanoDroid microG GmsCore"
2019-01-10 19:37:34 +00:00
nanodroid_install_apk GmsCore_NanoDroid multilib GmsCore
fi
if [ "${nanodroid_microg}" -ne 2 ]; then
for app in GsfProxy DroidGuard; do
nanodroid_install_apk ${app}
done
${NANODROID_BINDIR}/nanodroid-overlay --add GmsDroidGuard
fi
2018-11-28 20:35:30 +00:00
for app in ${NLPBACKEND}; do
nanodroid_install_apk ${app}
done
check_fake_package_signature || \
sed '/android.permission.FAKE_PACKAGE_SIGNATURE/d' -i \
${INSTALLER}/system/etc/default-permissions/microg-permissions.xml
2018-12-23 15:19:54 +00:00
create_privapp_permissions_whitelist GmsCore
2018-03-02 18:31:30 +00:00
nanodroid_install_file etc/permissions/features.xml
nanodroid_install_file etc/default-permissions/microg-permissions.xml
nanodroid_install_file etc/sysconfig/microg-a5k.xml
2018-01-23 20:11:52 +00:00
else ui_print " << without microG"
fi
}
install_mapsv1 () {
# install mapsv1 if requested
if [ "${nanodroid_mapsv1}" -eq 1 ]; then
ui_print " << with Maps API version 1"
2018-03-02 18:31:30 +00:00
nanodroid_install_file etc/permissions/com.google.android.maps.xml
2018-11-06 20:55:39 +00:00
nanodroid_install_file framework/com.google.android.maps.jar
2018-01-23 20:11:52 +00:00
else ui_print " << without Maps API version 1"
fi
}
install_gsync () {
# install GSync if requested
if [ "${nanodroid_gsync}" -eq 1 ]; then
if [ "${GSYNC_UNSUPPORTED}" -eq 1 ]; then
ui_print " << Google Sync Adapters are unsupported on SDK ${SDK_VERSION}"
2018-01-23 20:11:52 +00:00
else
ui_print " << with Google Sync Adapters (${GSYNC_VER})"
for app in GoogleCalendarSync GoogleContactsSync GoogleBackupTransport; do
nanodroid_install_apk ${app}
2018-01-23 20:11:52 +00:00
done
create_privapp_permissions_whitelist GoogleBackupTransport
2019-01-03 18:08:58 +00:00
nanodroid_install_file etc/default-permissions/google-sync-permissions.xml
2018-01-23 20:11:52 +00:00
fi
else ui_print " << without Google Sync Adapters"
fi
}
install_fdroid () {
# install F-Droid if requested
# respectively force if it's the F-Droid package
if [ "${nanodroid_fdroid}" -eq 1 -o "${MODID}" = "NanoDroid_FDroid" ]; then
ui_print " << with F-Droid"
nanodroid_install_apk FDroid
nanodroid_install_apk FDroidPrivileged
${NANODROID_BINDIR}/nanodroid-overlay --add FDroidPriv
create_privapp_permissions_whitelist FDroidPrivileged
2018-10-20 11:40:27 +00:00
nanodroid_install_file etc/org.fdroid.fdroid/additional_repos.xml
2018-01-23 20:11:52 +00:00
else ui_print " << without F-Droid"
fi
}
install_apps () {
# install apps if requested
if [ "${nanodroid_apps}" -eq 1 ]; then
ui_print " << with applications"
APP_STRING=" <<>"
INSTALL_APPS=$(cat "${cfg_apps}")
for app in ${INSTALL_APPS}; do
[[ -d "${INSTALLER}/system/app/${app}" ]] && \
APP_STRING="${APP_STRING} ${app}, "
done
ui_print "${APP_STRING}"
for app in ${INSTALL_APPS}; do
if [[ -d /system/app/${app} ]]; then
ui_print " <<> app: ${app} already provided by ROM"
2018-01-23 20:11:52 +00:00
elif [[ -d "${INSTALLER}/system/app/${app}" ]]; then
nanodroid_install_apk ${app}
else ui_print " <<>> app: ${app} missing"
fi
done
else ui_print " << without applications"
fi
}
install_store () {
STORE_CHOICE=${nanodroid_play:0:1}
FAKE_STORE=${nanodroid_play:1:1}
[ "${FAKE_STORE}" -eq 1 ] && STORE_CONFLICT="Phonesky" || STORE_CONFLICT=""
2019-01-14 19:24:18 +00:00
# install Yalp, Aurora or Play Store whichever requested
case "${STORE_CHOICE}" in
1 )
# force unselect Fake Store when user has choosen Play Store
STORE_CONFLICT="FakeStore"
FAKE_STORE=0
2018-10-31 19:54:23 +00:00
2019-01-14 19:24:18 +00:00
ui_print " << with Play Store"
nanodroid_install_apk Phonesky
create_privapp_permissions_whitelist Phonesky
2018-10-31 19:54:23 +00:00
nanodroid_install_file etc/default-permissions/phonesky-permissions.xml
;;
2 )
2019-01-14 19:24:18 +00:00
ui_print " << with Yalp Store"
nanodroid_install_apk YalpStore
create_privapp_permissions_whitelist YalpStore
;;
3 )
2019-01-14 19:24:18 +00:00
ui_print " << with Aurora Store"
nanodroid_install_apk AuroraStore
;;
2018-08-18 16:36:44 +00:00
2019-01-14 19:24:18 +00:00
* )
ui_print " << without App Store"
;;
esac
2018-08-18 16:36:44 +00:00
2019-01-14 19:24:18 +00:00
# Only install Fake Store if requested and Play Store is not installed
if [ "${FAKE_STORE}" -eq 1 ]; then
ui_print " << with Fake Store"
nanodroid_install_apk FakeStore
2019-01-14 19:24:18 +00:00
check_fake_package_signature && \
nanodroid_install_file etc/default-permissions/fakestore-permissions.xml
create_privapp_permissions_whitelist FakeStore
else ui_print " << without Fake Store"
fi
if [ ! -z "${STORE_CONFLICT}" ]; then
${NANODROID_BINDIR}/nanodroid-overlay --add ${STORE_CONFLICT}
if [ "${NANODROID_UPGRADE}" -eq 0 ]; then
rm -rf /data/data/com.android.vending
rm -rf /data/user/*/com.android.vending
rm -rf /data/user_de/*/com.android.vending
rm -rf /data/app/com.android.vending-*
fi
fi
2018-01-23 20:11:52 +00:00
}
install_zelda () {
# install Zelda Ringtones when requested
if [ "${nanodroid_zelda}" -eq 1 ]; then
ui_print " << with Zelda sounds"
nanodroid_install_dir media
else ui_print " << without Zelda sounds"
fi
}
install_bash () {
2018-03-12 17:40:40 +00:00
if [ "${nanodroid_bash}" -eq 1 ]; then
ui_print " << with GNU Bash Shell"
2018-03-12 17:40:40 +00:00
nanodroid_install_file etc/bash_logout
nanodroid_install_file etc/bashrc
nanodroid_install_file xbin/bash bin
nanodroid_install_file xbin/bash.bin.${BIN_ARCH} bin
nanodroid_install_file xbin/bashbug.${BIN_ARCH} bin
nanodroid_install_file xbin/less bin
nanodroid_install_file xbin/less.bin.${BIN_ARCH} bin
2018-03-12 17:40:40 +00:00
else ui_print " << without GNU Bash Shell"
fi
2018-01-23 20:11:52 +00:00
}
2018-03-15 19:55:02 +00:00
install_nanodroidscripts () {
ui_print " << with NanoDroid Scripts"
2018-03-15 19:54:06 +00:00
for script in npem nutl novl \
nanodroid-perm nanodroid-util \
nanodroid-overlay; do
nanodroid_install_file xbin/${script} bin
2018-03-15 19:54:06 +00:00
done
2018-01-23 20:11:52 +00:00
nanodroid_substitute xbin/nanodroid-overlay
2018-03-17 16:24:02 +00:00
if [ "${MODE}" = "MAGISK" ]; then
for script in nprp nanodroid-prop; do
nanodroid_install_file xbin/${script} bin
done
nanodroid_substitute xbin/nanodroid-prop
fi
2018-03-17 13:28:47 +00:00
}
install_fonts () {
if [ "${nanodroid_fonts}" -eq 1 ]; then
ui_print " << with Nintendo Fonts"
nanodroid_install_file xbin/nanodroid-font bin
nanodroid_substitute xbin/nanodroid-font
nanodroid_install_file xbin/nfnt bin
2018-03-17 13:28:47 +00:00
nanodroid_install_dir fonts
2018-03-17 13:16:31 +00:00
fi
2018-01-23 20:11:52 +00:00
}
install_nano () {
2018-03-12 17:40:40 +00:00
if [ "${nanodroid_nano}" -eq 1 ]; then
ui_print " << with GNU Nano Terminal Editor"
2018-03-12 17:40:40 +00:00
nanodroid_install_dir etc/terminfo
2018-01-23 20:11:52 +00:00
nanodroid_install_file xbin/nano bin
nanodroid_install_file xbin/nano.bin bin
2018-03-12 17:40:40 +00:00
else ui_print " << without GNU Nano Terminal Editor"
fi
2018-01-23 20:11:52 +00:00
}
install_shell_utils () {
2018-03-12 17:40:40 +00:00
if [ "${nanodroid_utils}" -eq 1 ]; then
ui_print " << with Shell Utilities"
2018-03-12 17:40:40 +00:00
# architecture dependend stuff
for binary in col colcrt colrm column findfs findmnt \
hexdump lessecho lesskey look lsblk lscpu lsipc \
2018-03-12 17:40:40 +00:00
lslocks lsns ncal setterm unzip whereis; do
nanodroid_install_file xbin/${binary}.${BIN_ARCH} bin
2018-03-12 17:40:40 +00:00
done
else ui_print " << without Shell Utilities"
fi
2018-01-23 20:11:52 +00:00
}
install_initd () {
if [ "${nanodroid_init}" -eq 1 ]; then
ui_print " << with init scripts"
if [ "${MODE}" = "SYSTEM" ]; then
INIT_BASE="${MODPATH}/system/etc/init.d"
else INIT_BASE="${MODPATH}/init.d"
fi
mkdir -p "${INIT_BASE}"
cp "${INSTALLER}/system/etc/init.d"/* "${INIT_BASE}/"
set_perm_bin "${INIT_BASE}"
2019-05-08 17:40:41 +00:00
for init in 10_sqlite 20_fstrim 30_logcat 40_external_sd 50_logscleaner; do
2018-08-23 19:27:15 +00:00
installinfo_add "/system/etc/init.d/${init}"
done
2018-01-23 20:11:52 +00:00
else ui_print " << without init scripts"
fi
}
2018-11-08 17:27:34 +00:00
install_bromite_webview () {
if [ "${MODID}" = "NanoDroid_BromiteWebView" ]; then
if ! check_bromite_webview_support; then
error "ROM does not support Bromite WebView installation!"
else
ui_print " << with Bromite WebView"
case ${ARCH} in
arm | arm64 | x86 ) BROMITE_ARCH=${ARCH} ;;
x86_64 ) BROMITE_ARCH=x86 ;;
esac
WEBVIEW_REPLACE=BromiteWebView
BACKUP_PATH="${STORAGE}/nanodroid_backups/$(grep_prop ro.build.flavor)_$(grep_prop ro.build.id)"
2018-11-08 17:27:34 +00:00
for app in webview webviewstub WebViewStub Webview; do
if [ -d /system/app/${app} ]; then
if [ "${MODE}" = "SYSTEM" ]; then
echo " backing up ${app} to ${BACKUP_PATH}/app/${app}"
mkdir -p "${BACKUP_PATH}/app"
rm -rf "${BACKUP_PATH}/app/${app}"
mv /system/app/${app} "${BACKUP_PATH}/app/"
fi
2019-01-06 17:57:15 +00:00
WEBVIEW_REPLACE=${app}
break
fi
done
2019-01-06 17:57:15 +00:00
if [ "${NANODROID_UPGRADE}" -eq 0 ]; then
for app in com.android.webview; do
rm -rf /data/data/${app}
rm -rf /data/user/*/${app}
rm -rf /data/user_de/*/${app}
rm -rf /data/app/${app}-*
rm -rf /mnt/asec/${app}-*
rm -rf ${STORAGE}/Android/data/${app}
done
fi
2018-11-08 17:27:34 +00:00
nanodroid_install_apk BromiteWebView_${BROMITE_ARCH} multilib ${WEBVIEW_REPLACE}
fi
2018-11-08 17:27:34 +00:00
fi
}
2018-11-23 20:04:36 +00:00
install_osmand () {
2018-11-23 20:18:01 +00:00
if [ "${MODID}" = "NanoDroid_OsmAnd" ]; then
2018-11-23 20:04:36 +00:00
ui_print " << with OsmAnd"
nanodroid_install_apk OsmAnd
2018-11-23 20:18:01 +00:00
nanodroid_install_apk OsmAnd_ContourLines
2018-11-23 20:04:36 +00:00
fi
}
2018-01-23 20:11:52 +00:00
install_swipe () {
if [ "${nanodroid_swipe}" -eq 1 ]; then
if [ "${SWIPE_UNSUPPORTED}" -eq 1 ]; then
ui_print " << Swipe Libraries are unsupported on SDK ${SDK_VERSION}"
else
ui_print " << with swipe libraries"
2018-01-23 20:11:52 +00:00
SWIPE_SRC="${INSTALLER}/swipe/${ARCH}"
SWIPE_DEST="/system/${SWIPE_LIBDIR}"
2018-01-23 20:11:52 +00:00
mkdir -p "${MODPATH}${SWIPE_DEST}"
2018-01-23 20:11:52 +00:00
cp "${SWIPE_SRC}/libjni_keyboarddecoder.so" "${MODPATH}${SWIPE_DEST}" || \
error "failed to install libjni_keyboarddecoder.so"
set_perm_data "${MODPATH}${SWIPE_DEST}/libjni_keyboarddecoder.so"
2018-01-23 20:11:52 +00:00
cp "${SWIPE_SRC}/${LIBJNI_IME}" "${MODPATH}${SWIPE_DEST}/libjni_latinimegoogle.so" || \
error "failed to install libjni_latinimegoogle.so"
set_perm_data "${MODPATH}${SWIPE_DEST}/libjni_latinimegoogle.so"
installinfo_add "${SWIPE_DEST}/libjni_keyboarddecoder.so"
installinfo_add "${SWIPE_DEST}/libjni_latinimegoogle.so"
fi
2018-01-23 20:11:52 +00:00
else ui_print " << without swipe libraries"
fi
}
install_addond () {
if [ -d /system/addon.d ]; then
ui_print " << System Mode OTA survival"
cp "${INSTALLER}/CommonAddon" "/system/addon.d/91-nanodroid.sh" || \
error "failed to install System Mode OTA survival"
chmod 0755 "/system/addon.d/91-nanodroid.sh"
sed -e "s|@MODID@|${MODID}|g" -i "/system/addon.d/91-nanodroid.sh"
else
ui_print " << ROM does not have addon.d support"
fi
}
2018-01-23 20:11:52 +00:00
##########################################################################################
# Advanced Installation Functions
##########################################################################################
nanodroid_install_dir () {
dir="${1}"
dest="/system/${dir}"
[ ! -d "${INSTALLER}/system/${dir}" ] && \
error "dir: ${dir} not found"
2018-01-23 20:11:52 +00:00
echo " installing dir: ${dir}"
mkdir -p "${MODPATH}${dest}"
cp -r "${INSTALLER}/system/${dir}"/* "${MODPATH}${dest}/" || \
error "failed to install ${dir}"
2018-01-23 20:11:52 +00:00
case ${2} in
bin ) set_perm_bin -r "${MODPATH}${dest}" ;;
* ) set_perm_data -r "${MODPATH}${dest}" ;;
esac
2018-08-23 19:27:15 +00:00
find "${INSTALLER}/system/${dir}" -type f | \
sed -e "s,^${INSTALLER},,g" | \
installinfo_add
2018-01-23 20:11:52 +00:00
}
nanodroid_install_apk () {
app=${1}
multilib=${2}
alias=${3}
2018-01-23 20:11:52 +00:00
unset prefix
unset source
2018-01-23 20:11:52 +00:00
for sdir in system/app system/priv-app gsync/${GSYNC_VER}/app gsync/${GSYNC_VER}/priv-app; do
if [ -f "${INSTALLER}/${sdir}/${app}/${app}.apk" ]; then
source="${INSTALLER}/${sdir}/${app}/${app}.apk"
dir=system/$(basename ${sdir})
break
fi
done
2018-01-23 20:11:52 +00:00
[ -z "${source}" ] && error "app ${app} not found"
2018-01-23 20:11:52 +00:00
if [ "${UNFOLD_APP_DIR}" -eq 1 ]; then
dest="${MODPATH}/${dir}"
2018-01-23 20:11:52 +00:00
else
if [ -z "${alias}" ]; then
dest="${MODPATH}/${dir}/${app}"
else dest="${MODPATH}/${dir}/${alias}"
fi
2018-01-23 20:11:52 +00:00
fi
if [ ! -z "${alias}" ]; then
dest_apk=${alias}.apk
else
dest_apk=${app}.apk
fi
mkdir -p "${dest}"
2018-01-23 20:11:52 +00:00
echo " installing app: ${app}"
echo " from: ${source}"
echo " into: ${dest} [${dest_apk}]"
cp "${source}" "${dest}/${dest_apk}" || \
error "failed to install ${source} to ${dest}"
2018-01-23 20:11:52 +00:00
installinfo_add "${dest}/${dest_apk}"
2018-01-23 20:11:52 +00:00
nanodroid_install_lib "${dest}/${dest_apk}" "${2}"
2018-01-23 20:11:52 +00:00
set_perm_data -r "${dest}"
2018-01-23 20:11:52 +00:00
}
nanodroid_install_file () {
dir="$(dirname "${1}")"
file="$(basename "${1}")"
unset source
for sdir in system gsync; do
if [ -f "${INSTALLER}/${sdir}/${dir}/${file}" ]; then
source="${INSTALLER}/${sdir}/${dir}/${file}"
break
fi
done
2018-01-23 20:11:52 +00:00
[ -z "${source}" ] && error "file: ${file} not found"
2018-01-23 20:11:52 +00:00
# if /system/xbin does not exist, use /system/bin
[ "${dir}" = "xbin" -a "${ROM_NO_XBIN}" -eq 1 ] && xdir="bin" || xdir="${dir}"
2018-01-23 20:11:52 +00:00
# strip off .${BIN_ARCH} from final filename (if any)
xfile=$(basename ${file} .${BIN_ARCH})
echo " installing file: ${xfile}"
mkdir -p "${MODPATH}/system/${xdir}/"
cp "${source}" "${MODPATH}/system/${xdir}/${xfile}" || \
error "failed to install ${xfile}"
2018-01-23 20:11:52 +00:00
case ${2} in
bin ) set_perm_bin "${MODPATH}/system/${xdir}/${xfile}" ;;
* ) set_perm_data "${MODPATH}/system/${xdir}/${xfile}" ;;
2018-01-23 20:11:52 +00:00
esac
2018-08-23 19:27:15 +00:00
installinfo_add "/system/${xdir}/${xfile}"
2018-01-23 20:11:52 +00:00
}
nanodroid_install_lib () {
apk="${1}"
dest="$(dirname ${1})"
multilib="${2}"
unset libd
2018-01-23 20:11:52 +00:00
if [ "${UNFOLD_APP_DIR}" -eq 1 ]; then
case ${ARCH} in
arm | x86 ) libd=${MODPATH}/system/lib ;;
arm64 | x86_64 ) libd=${MODPATH}/system/lib64 ;;
esac
else
libd=${dest}/lib
2018-01-23 20:11:52 +00:00
fi
rm -rf ${TMP_LIBDIR}
mkdir -p ${TMP_LIBDIR}
unset srcdir
"${UNZIP}" -oq "${apk}" "lib/*" -d "${TMP_LIBDIR}" \
2018-01-23 20:11:52 +00:00
2>/dev/null
unzip_return=$?
case ${unzip_return} in
0 ) echo " ${app} does have libs" ;;
11 ) echo " ${app} does not have any libs" ;;
50 ) error " not enough space available!" ;;
2019-04-26 20:35:51 +00:00
* ) error " unpacking libs for ${app} failed [${unzip_return}]" ;;
2018-01-23 20:11:52 +00:00
esac
if [ -d ${TMP_LIBDIR}/lib ]; then
for ARCHLIB in ${LIB_ARCHES}; do
if [ -d ${TMP_LIBDIR}/lib/${ARCHLIB} ]; then
srcdir=${TMP_LIBDIR}/lib/${ARCHLIB}
case ${srcdir} in
*arm64* ) echo " ${app}: installing arm64 libs"
lib_arch=arm64 ;;
*arm* ) echo " ${app}: installing arm libs"
lib_arch=arm ;;
*x86_64* ) echo " ${app}: installing x86_64 libs"
lib_arch=x86_64 ;;
*x86* ) echo " ${app}: installing x86 libs"
lib_arch=x86 ;;
esac
echo " from: ${srcdir}"
echo " into: ${libd}/${lib_arch}"
mkdir -p "${libd}/${lib_arch}"
for lib in ${srcdir}/*; do
echo " library: $(basename ${lib})"
cp ${lib} "${libd}/${lib_arch}/" || \
2019-04-26 20:35:51 +00:00
error " installing libs for ${app} failed"
installinfo_add "${libd}/${lib_arch}/$(basename ${lib})"
done
[ -z "${multilib}" ] && break
fi
done
2018-01-23 20:11:52 +00:00
fi
}
nanodroid_substitute () {
dir="$(dirname "${1}")"
file="$(basename "${1}")"
# if /system/xbin does not exist, use /system/bin
[ "${dir}" = "xbin" -a "${ROM_NO_XBIN}" -eq 1 ] && dir="bin"
target="${MODPATH}/system/${dir}/${file}"
[ ! -f "${target}" ] && error "file: ${file} not found"
2018-01-23 20:11:52 +00:00
if grep -q @ZIPDIR@ "${target}"; then
if [[ "${ZIPDIR}" == "/external_sd" ]]; then
# /external_sd is already known by `nanodroid-overlay`
# no need to add it a second time
sed -e 's|@ZIPDIR@||' -i ${target}
echo " substitute: remove @ZIPDIR@ in ${target}"
else
sed -e "s|@ZIPDIR@|${ZIPDIR}|g" -i ${target}
echo " substitute: adjust @ZIPDIR@ in ${target}"
fi
fi
if grep -q @MODPATH@ ${target}; then
sed -e "s|@MODPATH@|${MODPATH}|g" -i ${target}
2018-01-23 20:11:52 +00:00
echo " substitute: adjust @MODPATH@ in ${target}"
fi
}
nanodroid_storelogs () {
curdate=$(date +%Y%m%d_%H.%M.%S)
nanodroid_logfile="${STORAGE}/nanodroid_logs/${MODID}_${VERSION}_log_${curdate}.log"
nanodroid_twrplog="${STORAGE}/nanodroid_logs/${MODID}_${VERSION}_twrp_${curdate}.log"
mkdir -p "${STORAGE}/nanodroid_logs"
2018-01-23 20:11:52 +00:00
echo "\
Installation successful: ${INSTALL_SUCCESS}
2018-01-23 20:11:52 +00:00
### VALUES ###
ZIP=${ZIP}
ZIPDIR=${ZIPDIR}
TMPDIR=${TMPDIR}
TMP_LIBDIR=${TMP_LIBDIR}
INSTALLER=${INSTALLER}
MODID=${MODID}
SDK_VERSION=${SDK_VERSION}
ARCH=${ARCH}
LIB_ARCHES=${LIB_ARCHES}
MODPATH=${MODPATH}
SWIPE_LIBDIR=${SWIPE_LIBDIR}
MODE=${MODE}
MAGISK_VER_CODE=${MAGISK_VER_CODE}
CUSTOM_FONT=${CUSTOM_FONT}
ROM_NO_XBIN=${ROM_NO_XBIN}
2018-07-08 18:13:12 +00:00
NANODROID_UPGRADE=${NANODROID_UPGRADE}
2018-08-19 16:46:55 +00:00
NANODROID_BINDIR=${NANODROID_BINDIR}
2019-05-11 19:37:50 +00:00
HAS_FAKESIGN=${HAS_FAKESIGN}
HAS_WEBVIEW=${HAS_WEBVIEW}
2018-01-23 20:11:52 +00:00
2019-01-12 09:04:51 +00:00
### MOUNTED PARTITIONS ###
" >> ${nanodroid_logfile}
mount | awk '{print $1 " on " $3 " params: " $6}' \
>> ${nanodroid_logfile}
2019-04-27 21:23:14 +00:00
echo "
### DISK USAGE ###
" >> ${nanodroid_logfile}
df 2>/dev/null | sed '/^\//d' >> ${nanodroid_logfile}
2019-04-27 21:23:14 +00:00
2019-01-12 09:04:51 +00:00
echo "
2018-01-23 20:11:52 +00:00
### SETUP ###
2019-04-25 18:57:07 +00:00
" >> ${nanodroid_logfile}
2018-01-23 20:11:52 +00:00
cat "${cfg_setup}" >> ${nanodroid_logfile}
2018-01-23 20:11:52 +00:00
2018-04-10 19:14:52 +00:00
if [ ! -z "${cfg_apps}" ]; then
2018-01-23 20:11:52 +00:00
echo "
### APPS ###
" >> ${nanodroid_logfile}
2018-01-23 20:11:52 +00:00
cat "${cfg_apps}" >> ${nanodroid_logfile}
2018-01-23 20:11:52 +00:00
2018-04-10 19:14:52 +00:00
fi
if [ ! -z "${cfg_overlay}" ]; then
2018-01-23 20:11:52 +00:00
echo "
### OVERLAY ###
" >> ${nanodroid_logfile}
2018-01-23 20:11:52 +00:00
cat "${cfg_overlay}" >> ${nanodroid_logfile}
2018-01-23 20:11:52 +00:00
2018-04-10 19:14:52 +00:00
fi
chown root:sdcard_rw ${nanodroid_logfile}
chmod 0644 ${nanodroid_logfile}
cat /tmp/recovery.log > ${nanodroid_twrplog}
chown root:sdcard_rw ${nanodroid_twrplog}
chmod 0644 ${nanodroid_twrplog}
ui_print " | storing installation logs in ${STORAGE}/nanodroid_logs/"
2018-11-22 18:57:45 +00:00
ui_print " | NanoDroid log:"
ui_print " || ""$(basename ${nanodroid_logfile})"
ui_print " | TWRP log:"
ui_print " || $(basename ${nanodroid_twrplog})"
ui_print " "
2018-01-23 20:11:52 +00:00
}
##########################################################################################
# NanoDroid Configuration File Handling
##########################################################################################
# check for configuration files
2019-05-05 10:17:26 +00:00
config_locations="${STORAGE} /external_sd ${ZIPDIR} /data"
2018-01-23 20:11:52 +00:00
get_config () {
config=""
config_exists=0
for path in ${config_locations}; do
if test -r "${path}/.nanodroid-${1}"; then
config="${path}/.nanodroid-${1}"
config_exists=1
return
fi
done
}
set_prop () {
2018-09-15 17:21:42 +00:00
echo "${1}=${2}" >> "${cfg_setup}"
2018-01-23 20:11:52 +00:00
}
# check whether '.nanodroid-setup' has all required entries
check_cfg_setup () {
2018-09-15 17:21:42 +00:00
source "${cfg_setup}"
2018-01-23 20:11:52 +00:00
2018-09-15 17:21:42 +00:00
[ -z "${nanodroid_fdroid}" ] && set_prop nanodroid_fdroid 1
[ -z "${nanodroid_microg}" ] && set_prop nanodroid_microg 1
[ -z "${nanodroid_gmscore}" ] && set_prop nanodroid_gmscore 0
2018-09-15 17:21:42 +00:00
[ -z "${nanodroid_apps}" ] && set_prop nanodroid_apps 1
[ -z "${nanodroid_play}" ] && set_prop nanodroid_play 10
2018-12-08 13:43:50 +00:00
# in NanoDroid 20.3 nanodroid_play has changed
if [ "${#nanodroid_play}" -lt 2 ]; then
case "${nanodroid_play}" in
0 ) tmp_prop="00" ;;
1 ) tmp_prop="10" ;;
2 ) tmp_prop="20" ;;
3 ) tmp_prop="01" ;;
4 ) tmp_prop="21" ;;
* ) tmp_prop="10" ;;
esac
2018-11-27 18:55:04 +00:00
sed -e '/^nanodroid_play/d' -i "${cfg_setup}"
set_prop nanodroid_play "${tmp_prop}"
fi
2018-01-23 20:11:52 +00:00
if [ "${MODID}" = "NanoDroid" ]; then
2018-09-15 17:21:42 +00:00
[ -z "${nanodroid_overlay}" ] && set_prop nanodroid_overlay 1
else [ -z "${nanodroid_overlay}" ] && set_prop nanodroid_overlay 0
2018-01-23 20:11:52 +00:00
fi
2018-09-15 17:21:42 +00:00
[ -z "${nanodroid_zelda}" ] && set_prop nanodroid_zelda 1
[ -z "${nanodroid_mapsv1}" ] && set_prop nanodroid_mapsv1 1
[ -z "${nanodroid_init}" ] && set_prop nanodroid_init 1
[ -z "${nanodroid_gsync}" ] && set_prop nanodroid_gsync 0
[ -z "${nanodroid_forcesystem}" ] && set_prop nanodroid_forcesystem 0
[ -z "${nanodroid_swipe}" ] && set_prop nanodroid_swipe 0
[ -z "${nanodroid_nlpbackend}" ] && set_prop nanodroid_nlpbackend 100
2018-12-08 13:43:50 +00:00
# in NanoDroid 20.3 nanodroid_nlpbackend has changed
if [ "${#nanodroid_nlpbackend}" -eq 1 ]; then
case "${nanodroid_nlpbackend}" in
0 ) tmp_prop="000" ;;
1 ) tmp_prop="100" ;;
2 ) tmp_prop="010" ;;
2018-11-27 19:24:55 +00:00
3 ) tmp_prop="110" ;;
* ) tmp_prop="100" ;;
esac
sed -e '/^nanodroid_nlpbackend/d' -i "${cfg_setup}"
set_prop nanodroid_nlpbackend "${tmp_prop}"
fi
# in NanoDroid 20.5 nanodroid_nlpbackend has changed
if [ "${#nanodroid_nlpbackend}" -eq 3 ]; then
tmp_prop="${nanodroid_nlpbackend}0"
sed -e '/^nanodroid_nlpbackend/d' -i "${cfg_setup}"
set_prop nanodroid_nlpbackend "${tmp_prop}"
fi
2018-09-15 17:21:42 +00:00
[ -z "${nanodroid_bash}" ] && set_prop nanodroid_bash 1
[ -z "${nanodroid_nano}" ] && set_prop nanodroid_nano 1
[ -z "${nanodroid_utils}" ] && set_prop nanodroid_utils 1
[ -z "${nanodroid_fonts}" ] && set_prop nanodroid_fonts 1
# in NanoDroid 21.0.90 nanodroid_override was dropped
sed -e '/nanodroid_override/d' -i "${cfg_setup}"
2018-09-15 17:21:42 +00:00
source "${cfg_setup}"
2018-01-23 20:11:52 +00:00
}
2018-09-15 17:21:42 +00:00
# check whether '.nanodroid-apps' is up to date
2018-01-23 20:11:52 +00:00
check_cfg_apps () {
# <= 16.3 has KeePass DX instead of KeePassDroid, migrate
2018-03-17 16:08:36 +00:00
if grep -q KeePassDroid "${cfg_apps}"; then
sed -e 's/KeePassDroid/KeePassDX/g' -i "${cfg_apps}"
fi
2018-06-15 19:37:24 +00:00
# <= 17.0~beta1 && <= 17.2~beta1 has Bucket (LibreSubtratum) instead of Substratum, migrate
if grep -q Bucket "${cfg_apps}"; then
sed -e 's/Bucket/Substratum/g' -i "${cfg_apps}"
fi
2018-09-15 17:21:42 +00:00
# <= 18.1 has Orfox instead of TorBrowser, migrate
if grep -q Orfox "${cfg_apps}"; then
sed -e 's/Orfox/TorBrowser/g' -i "${cfg_apps}"
2018-09-29 20:05:51 +00:00
fi
# <= 18.4 has Adaway instead of Blockada, migrate
if grep -q Adaway "${cfg_apps}"; then
sed -e 's/Adaway/Blokada/g' -i "${cfg_apps}"
2019-04-24 18:55:29 +00:00
fi
# >= 20.7.92 no longer ships YahooWeatherProvider, remove
if grep -q YahooWeatherProvider "${cfg_apps}"; then
sed -e '/YahooWeatherProvider/d' -i "${cfg_apps}"
2019-05-11 18:41:36 +00:00
fi
# >= 20.8.90 no longer ships OmniJAWS, remove
if grep -q OmniJAWS "${cfg_apps}"; then
sed -e '/OmniJAWS/d' -i "${cfg_apps}"
fi
# >= 21.0.90 has Alarmio instead of OmniClock, migrate
if grep -q OmniClock "${cfg_apps}"; then
sed -e 's/OmniClock/Alarmio/g' -i "${cfg_apps}"
fi
# >= 21.0.90 no longer ships OpenWeatherMapProvider, remove
if grep -q OpenWeatherMapProvider "${cfg_apps}"; then
sed -e '/OpenWeatherMapProvider/d' -i "${cfg_apps}"
2018-09-15 17:21:42 +00:00
fi
2018-01-23 20:11:52 +00:00
}
2018-09-15 17:21:42 +00:00
# check whether '.nanodroid-overlay' is up to date
2018-01-23 20:11:52 +00:00
check_cfg_overlay () {
return 0
2018-01-23 20:11:52 +00:00
}
get_cfg_setup () {
get_config setup
if [ "$config_exists" -eq 1 ]; then
cfg_setup="${config}"
check_cfg_setup
ui_print " > Config | nanodroid-setup | $(dirname ${cfg_setup})"
else
cfg_setup="${INSTALLER}/.nanodroid-setup"
source "${cfg_setup}"
ui_print " > Config | nanodroid-setup | fallback"
fi
}
get_cfg_overlay () {
get_config overlay
if [ "$config_exists" -eq 1 ]; then
cfg_overlay="${config}"
check_cfg_overlay
ui_print " > Config | nanodroid-overlay | $(dirname ${cfg_overlay})"
else
cfg_overlay="${INSTALLER}/.nanodroid-overlay"
ui_print " > Config | nanodroid-overlay | fallback"
fi
}
get_cfg_apps () {
get_config apps
if [ "$config_exists" -eq 1 ]; then
cfg_apps="${config}"
check_cfg_apps
ui_print " > Config | nanodroid-apps | $(dirname ${cfg_apps})"
else
cfg_apps="${INSTALLER}/.nanodroid-apps"
ui_print " > Config | nanodroid-apps | fallback"
fi
}