From d5d7c888151331e73bb3792d211b7f200656108c Mon Sep 17 00:00:00 2001 From: Olivier Date: Sat, 2 Dec 2023 20:15:19 +0100 Subject: [PATCH] =?UTF-8?q?T=C3=A9l=C3=A9verser=20les=20fichiers=20vers=20?= =?UTF-8?q?"common"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/functions.sh | 309 ++++++++++++++++++++++++++++++++++ common/install.sh | 28 +++ common/service_balance.txt | 240 ++++++++++++++++++++++++++ common/service_budget.txt | 240 ++++++++++++++++++++++++++ common/service_latency.txt | 240 ++++++++++++++++++++++++++ common/service_throughput.txt | 240 ++++++++++++++++++++++++++ 6 files changed, 1297 insertions(+) create mode 100644 common/functions.sh create mode 100644 common/install.sh create mode 100644 common/service_balance.txt create mode 100644 common/service_budget.txt create mode 100644 common/service_latency.txt create mode 100644 common/service_throughput.txt diff --git a/common/functions.sh b/common/functions.sh new file mode 100644 index 0000000..65c7ac6 --- /dev/null +++ b/common/functions.sh @@ -0,0 +1,309 @@ +########################################################################################## +# +# MMT Extended Utility Functions +# +########################################################################################## + +require_new_ksu() { + ui_print "**********************************" + ui_print " Please install KernelSU v0.6.6+! " + ui_print "**********************************" + exit 1 +} + +umount_mirrors() { + [ -d $ORIGDIR ] || return 0 + for i in $ORIGDIR/*; do + umount -l $i 2>/dev/null + done + rm -rf $ORIGDIR 2>/dev/null + mount -o ro,remount $MAGISKTMP +} + +cleanup() { + $KSU && umount_mirrors + rm -rf $MODPATH/common $MODPATH/install.zip 2>/dev/null +} + +abort() { + ui_print "$1" + rm -rf $MODPATH 2>/dev/null + cleanup + rm -rf $TMPDIR 2>/dev/null + exit 1 +} + +device_check() { + local opt=`getopt -o dm -- "$@"` type=device + eval set -- "$opt" + while true; do + case "$1" in + -d) local type=device; shift;; + -m) local type=manufacturer; shift;; + --) shift; break;; + *) abort "Invalid device_check argument $1! Aborting!";; + esac + done + local prop=$(echo "$1" | tr '[:upper:]' '[:lower:]') + for i in /system /vendor /odm /product; do + if [ -f $i/build.prop ]; then + for j in "ro.product.$type" "ro.build.$type" "ro.product.vendor.$type" "ro.vendor.product.$type"; do + [ "$(sed -n "s/^$j=//p" $i/build.prop 2>/dev/null | head -n 1 | tr '[:upper:]' '[:lower:]')" == "$prop" ] && return 0 + done + [ "$type" == "device" ] && [ "$(sed -n "s/^"ro.build.product"=//p" $i/build.prop 2>/dev/null | head -n 1 | tr '[:upper:]' '[:lower:]')" == "$prop" ] && return 0 + fi + done + return 1 +} + +cp_ch() { + local opt=`getopt -o nr -- "$@"` BAK=true UBAK=true FOL=false + eval set -- "$opt" + while true; do + case "$1" in + -n) UBAK=false; shift;; + -r) FOL=true; shift;; + --) shift; break;; + *) abort "Invalid cp_ch argument $1! Aborting!";; + esac + done + local SRC="$1" DEST="$2" OFILES="$1" + $FOL && local OFILES=$(find $SRC -type f 2>/dev/null) + [ -z $3 ] && PERM=0644 || PERM=$3 + case "$DEST" in + $TMPDIR/*|$MODULEROOT/*|$NVBASE/modules/$MODID/*) BAK=false;; + esac + for OFILE in ${OFILES}; do + if $FOL; then + if [ "$(basename $SRC)" == "$(basename $DEST)" ]; then + local FILE=$(echo $OFILE | sed "s|$SRC|$DEST|") + else + local FILE=$(echo $OFILE | sed "s|$SRC|$DEST/$(basename $SRC)|") + fi + else + [ -d "$DEST" ] && local FILE="$DEST/$(basename $SRC)" || local FILE="$DEST" + fi + if $BAK && $UBAK; then + [ ! "$(grep "$FILE$" $INFO 2>/dev/null)" ] && echo "$FILE" >> $INFO + [ -f "$FILE" -a ! -f "$FILE~" ] && { mv -f $FILE $FILE~; echo "$FILE~" >> $INFO; } + elif $BAK; then + [ ! "$(grep "$FILE$" $INFO 2>/dev/null)" ] && echo "$FILE" >> $INFO + fi + install -D -m $PERM "$OFILE" "$FILE" + done +} + +install_script() { + case "$1" in + -b) shift; + if $KSU; then + local INPATH=$NVBASE/boot-completed.d + else + local INPATH=$SERVICED + sed -i -e '1i (\nwhile [ "$(getprop sys.boot_completed)" != "1" ]; do\n sleep 1\ndone\nsleep 3\n' -e '$a)&' $1 + fi;; + -l) shift; local INPATH=$SERVICED;; + -p) shift; local INPATH=$POSTFSDATAD;; + *) local INPATH=$SERVICED;; + esac + [ "$(grep "#!/system/bin/sh" $1)" ] || sed -i "1i #!/system/bin/sh" $1 + local i; for i in "MODPATH" "LIBDIR" "MODID" "INFO" "MODDIR"; do + case $i in + "MODPATH") sed -i "1a $i=$NVBASE/modules/$MODID" $1;; + "MODDIR") sed -i "1a $i=\${0%/*}" $1;; + *) sed -i "1a $i=$(eval echo \$$i)" $1;; + esac + done + case $1 in + "$MODPATH/post-fs-data.sh"|"$MODPATH/service.sh"|"$MODPATH/uninstall.sh") sed -i "s|^MODPATH=.*|MODPATH=\$MODDIR|" $1;; # MODPATH=MODDIR for these scripts (located in module directory) + "$MODPATH/boot-completed.sh") $KSU && sed -i "s|^MODPATH=.*|MODPATH=\$MODDIR|" $1 || { cp_ch -n $1 $INPATH/$MODID-$(basename $1) 0755; rm -f $MODPATH/boot-completed.sh; };; + *) cp_ch -n $1 $INPATH/$(basename $1) 0755;; + esac +} + +prop_process() { + sed -i -e "/^#/d" -e "/^ *$/d" $1 + [ -f $MODPATH/system.prop ] || mktouch $MODPATH/system.prop + while read LINE; do + echo "$LINE" >> $MODPATH/system.prop + done < $1 +} + +mount_mirrors() { + mount -o rw,remount $MAGISKTMP + mkdir -p $ORIGDIR/system + if $SYSTEM_ROOT; then + mkdir -p $ORIGDIR/system_root + mount -o ro / $ORIGDIR/system_root + mount -o bind $ORIGDIR/system_root/system $ORIGDIR/system + else + mount -o ro /system $ORIGDIR/system + fi + for i in /vendor $PARTITIONS; do + [ ! -d $i -o -d $ORIGDIR$i ] && continue + mkdir -p $ORIGDIR$i + mount -o ro $i $ORIGDIR$i + done +} + +# Credits +ui_print "**************************************" +ui_print "* MMT Extended by Zackptg5 @ XDA *" +ui_print "**************************************" +ui_print " " + +# Check for min/max api version +[ -z $MINAPI ] || { [ $API -lt $MINAPI ] && abort "! Your system API of $API is less than the minimum api of $MINAPI! Aborting!"; } +[ -z $MAXAPI ] || { [ $API -gt $MAXAPI ] && abort "! Your system API of $API is greater than the maximum api of $MAXAPI! Aborting!"; } + +# Min KSU v0.6.6 +[ -z $KSU ] && KSU=false +$KSU && { [ $KSU_VER_CODE -lt 11184 ] && require_new_ksu; } + +# Start debug +set -x + +# Set variables +[ -z $ARCH32 ] && ARCH32="$(echo $ABI32 | cut -c-3)" +[ $API -lt 26 ] && DYNLIB=false +[ -z $DYNLIB ] && DYNLIB=false +[ -z $PARTOVER ] && PARTOVER=false +[ -z $SYSTEM_ROOT ] && SYSTEM_ROOT=$SYSTEM_AS_ROOT # renamed in magisk v26.3 +[ -z $SERVICED ] && SERVICED=$NVBASE/service.d # removed in magisk v26.2 +[ -z $POSTFSDATAD ] && POSTFSDATAD=$NVBASE/post-fs-data.d # removed in magisk v26.2 +INFO=$NVBASE/modules/.$MODID-files +if $KSU; then + MAGISKTMP="/mnt" + ORIGDIR="$MAGISKTMP/mirror" + mount_mirrors +elif [ "$(magisk --path 2>/dev/null)" ]; then + ORIGDIR="$(magisk --path 2>/dev/null)/.magisk/mirror" +elif [ "$(echo $MAGISKTMP | awk -F/ '{ print $NF}')" == ".magisk" ]; then + ORIGDIR="$MAGISKTMP/mirror" +else + ORIGDIR="$MAGISKTMP/.magisk/mirror" +fi +if $DYNLIB; then + LIBPATCH="\/vendor" + LIBDIR=/system/vendor +else + LIBPATCH="\/system" + LIBDIR=/system +fi +# Detect extra partition compatibility (KernelSU or Magisk Delta) +EXTRAPART=false +if $KSU || [ "$(echo $MAGISK_VER | awk -F- '{ print $NF}')" == "delta" ]; then + EXTRAPART=true +elif ! $PARTOVER; then + unset PARTITIONS +fi + +if ! $BOOTMODE; then + ui_print "- Only uninstall is supported in recovery" + ui_print " Uninstalling!" + touch $MODPATH/remove + [ -s $INFO ] && install_script $MODPATH/uninstall.sh || rm -f $INFO $MODPATH/uninstall.sh + recovery_cleanup + cleanup + rm -rf $NVBASE/modules_update/$MODID $TMPDIR 2>/dev/null + exit 0 +fi + +# Extract files +ui_print "- Extracting module files" +unzip -o "$ZIPFILE" -x 'META-INF/*' 'common/functions.sh' -d $MODPATH >&2 +[ -f "$MODPATH/common/addon.tar.xz" ] && tar -xf $MODPATH/common/addon.tar.xz -C $MODPATH/common 2>/dev/null + +# Run addons +if [ "$(ls -A $MODPATH/common/addon/*/install.sh 2>/dev/null)" ]; then + ui_print " "; ui_print "- Running Addons -" + for i in $MODPATH/common/addon/*/install.sh; do + ui_print " Running $(echo $i | sed -r "s|$MODPATH/common/addon/(.*)/install.sh|\1|")..." + . $i + done +fi + +# Remove files outside of module directory +ui_print "- Removing old files" + +if [ -f $INFO ]; then + while read LINE; do + if [ "$(echo -n $LINE | tail -c 1)" == "~" ]; then + continue + elif [ -f "$LINE~" ]; then + mv -f $LINE~ $LINE + else + rm -f $LINE + while true; do + LINE=$(dirname $LINE) + [ "$(ls -A $LINE 2>/dev/null)" ] && break 1 || rm -rf $LINE + done + fi + done < $INFO + rm -f $INFO +fi + +### Install +ui_print "- Installing" + +[ -f "$MODPATH/common/install.sh" ] && . $MODPATH/common/install.sh + +ui_print " Installing for $ARCH SDK $API device..." +# Remove comments from files and place them, add blank line to end if not already present +for i in $(find $MODPATH -type f -name "*.sh" -o -name "*.prop" -o -name "*.rule"); do + [ -f $i ] && { sed -i -e "/^#/d" -e "/^ *$/d" $i; [ "$(tail -1 $i)" ] && echo "" >> $i; } || continue + case $i in + "$MODPATH/boot-completed.sh") install_script -b $i;; + "$MODPATH/service.sh") install_script -l $i;; + "$MODPATH/post-fs-data.sh") install_script -p $i;; + "$MODPATH/uninstall.sh") if [ -s $INFO ] || [ "$(head -n1 $MODPATH/uninstall.sh)" != "# Don't modify anything after this" ]; then + cp -f $MODPATH/uninstall.sh $MODPATH/$MODID-uninstall.sh # Fallback script in case module manually deleted + sed -i "1i[ -d \"\$MODPATH\" ] && exit 0" $MODPATH/$MODID-uninstall.sh + echo 'rm -f $0' >> $MODPATH/$MODID-uninstall.sh + install_script -l $MODPATH/$MODID-uninstall.sh + rm -f $MODPATH/$MODID-uninstall.sh + install_script $MODPATH/uninstall.sh + else + rm -f $INFO $MODPATH/uninstall.sh + fi;; + esac +done + +$IS64BIT || for i in $(find $MODPATH/system -type d -name "lib64"); do rm -rf $i 2>/dev/null; done +[ -d "/system/priv-app" ] || mv -f $MODPATH/system/priv-app $MODPATH/system/app 2>/dev/null +[ -d "/system/xbin" ] || mv -f $MODPATH/system/xbin $MODPATH/system/bin 2>/dev/null +if $DYNLIB; then + for FILE in $(find $MODPATH/system/lib* -type f 2>/dev/null | sed "s|$MODPATH/system/||"); do + [ -s $MODPATH/system/$FILE ] || continue + case $FILE in + lib*/modules/*) continue;; + esac + mkdir -p $(dirname $MODPATH/system/vendor/$FILE) + mv -f $MODPATH/system/$FILE $MODPATH/system/vendor/$FILE + [ "$(ls -A `dirname $MODPATH/system/$FILE`)" ] || rm -rf `dirname $MODPATH/system/$FILE` + done + # Delete empty lib folders (busybox find doesn't have this capability) + toybox find $MODPATH/system/lib* -type d -empty -delete >/dev/null 2>&1 +fi + +# Set permissions +ui_print " " +ui_print "- Setting Permissions" +set_perm_recursive $MODPATH 0 0 0755 0644 +for i in /system/vendor /vendor /system/vendor/app /vendor/app /system/vendor/etc /vendor/etc /system/odm/etc /odm/etc /system/vendor/odm/etc /vendor/odm/etc /system/vendor/overlay /vendor/overlay; do + if [ -d "$MODPATH$i" ] && [ ! -L "$MODPATH$i" ]; then + case $i in + *"/vendor") set_perm_recursive $MODPATH$i 0 0 0755 0644 u:object_r:vendor_file:s0;; + *"/app") set_perm_recursive $MODPATH$i 0 0 0755 0644 u:object_r:vendor_app_file:s0;; + *"/overlay") set_perm_recursive $MODPATH$i 0 0 0755 0644 u:object_r:vendor_overlay_file:s0;; + *"/etc") set_perm_recursive $MODPATH$i 0 2000 0755 0644 u:object_r:vendor_configs_file:s0;; + esac + fi +done +for i in $(find $MODPATH/system/vendor $MODPATH/vendor -type f -name *".apk" 2>/dev/null); do + chcon u:object_r:vendor_app_file:s0 $i +done +set_permissions + +# Complete install +cleanup diff --git a/common/install.sh b/common/install.sh new file mode 100644 index 0000000..ca014c7 --- /dev/null +++ b/common/install.sh @@ -0,0 +1,28 @@ +SOC=`getprop ro.board.platform` +ui_print "" +ui_print "*** $MODID" +ui_print "** SDK $API" +ui_print "** ARCH $ARCH" +ui_print "** SOC $SOC" +ui_print "***" +ui_print "" + + +# +# JoyPixels installation +# + +# The following is the default implementation: extract $ZIPFILE/system to $MODPATH +# Extend/change the logic to whatever you want +ui_print "- Extracting module files" +unzip -o "$ZIPFILE" 'system/fonts/JoyPixels.ttf' -d $MODPATH >&2 + +ui_print "- Searching in fonts.xml" +[[ -d /sbin/.core/mirror ]] && MIRRORPATH=/sbin/.core/mirror || unset MIRRORPATH +FILE=/system/etc/fonts.xml +FILENAME=$(sed -ne '//,/<\/family>/ {s/.*\(.*\)<\/font>.*/\1/p;}' $MIRRORPATH$FILE) +for i in $FILENAME +do + ui_print "- Copying fonts files to $i" + cp -f $MODPATH/system/fonts/JoyPixels.ttf $MODPATH/system/fonts/$i +done diff --git a/common/service_balance.txt b/common/service_balance.txt new file mode 100644 index 0000000..10e86bf --- /dev/null +++ b/common/service_balance.txt @@ -0,0 +1,240 @@ +# +_SLEEPBOOT=60 +RETRY_INTERVAL=${_SLEEPBOOT} #in seconds +MAX_RETRY=3 +retry=${MAX_RETRY} +while (("$retry" > "0")) && [ "$(getprop sys.boot_completed)" != "1" ]; do + sleep ${RETRY_INTERVAL} + (($retry--)) +done + + +### -------------------------------------------------- +### Kraoc +### -------------------------------------------------- + +# Random entropy +setprop kernel.random.read_wakeup_threshold 128 +setprop kernel.random.write_wakeup_threshold 896 +sysctl -e -w kernel.random.read_wakeup_threshold=128 +sysctl -e -w kernel.random.write_wakeup_threshold=896 + +# UI scale +settings put global window_animation_scale 0.25 +settings put global transition_animation_scale 0.25 +settings put global animator_duration_scale 0.25 + + +### -------------------------------------------------- +### Ktweaks +### -------------------------------------------------- + +#!/usr/bin/env bash +# Written by Draco (tytydraco @ GitHub) + +# The name of the current branch for logging purposes +BRANCH="balance" + +# Maximum unsigned integer size in C +UINT_MAX="4294967295" + +# Duration in nanoseconds of one scheduling period +SCHED_PERIOD="$((4 * 1000 * 1000))" + +# How many tasks should we have at a maximum in one scheduling period +SCHED_TASKS="8" + +write() { + # Bail out if file does not exist + [[ ! -f "$1" ]] && return 1 + + # Make file writable in case it is not already + chmod +w "$1" 2> /dev/null + + # Write the new value and bail if there's an error + if ! echo "$2" > "$1" 2> /dev/null + then +# echo "Failed: $1 → $2" + return 1 + fi + + # Log the success +# echo "$1 → $2" +} + +## Check for root permissions and bail if not granted +#if [[ "$(id -u)" -ne 0 ]] +#then +## echo "No root permissions. Exiting." +# exit 1 +#fi + +# Detect if we are running on Android +#grep -q android /proc/cmdline && ANDROID=true +ANDROID=true + +## Log the date and time for records sake +#echo "Time of execution: $(date)" +#echo "Branch: $BRANCH" + +# Sync to data in the rare case a device crashes +#sync + +# Limit max perf event processing time to this much CPU usage +write /proc/sys/kernel/perf_cpu_time_max_percent 5 + +# Group tasks for less stutter but less throughput +write /proc/sys/kernel/sched_autogroup_enabled 1 + +# Execute child process before parent after fork +write /proc/sys/kernel/sched_child_runs_first 1 + +# Preliminary requirement for the following values +write /proc/sys/kernel/sched_tunable_scaling 0 + +# Reduce the maximum scheduling period for lower latency +write /proc/sys/kernel/sched_latency_ns "$SCHED_PERIOD" + +# Schedule this ratio of tasks in the guarenteed sched period +write /proc/sys/kernel/sched_min_granularity_ns "$((SCHED_PERIOD / SCHED_TASKS))" + +# Require preeptive tasks to surpass half of a sched period in vmruntime +write /proc/sys/kernel/sched_wakeup_granularity_ns "$((SCHED_PERIOD / 2))" + +# Reduce the frequency of task migrations +write /proc/sys/kernel/sched_migration_cost_ns 5000000 + +# Always allow sched boosting on top-app tasks +[[ "$ANDROID" == true ]] && write /proc/sys/kernel/sched_min_task_util_for_colocation 0 + +# Improve real time latencies by reducing the scheduler migration time +write /proc/sys/kernel/sched_nr_migrate 32 + +# Disable scheduler statistics to reduce overhead +write /proc/sys/kernel/sched_schedstats 0 + +# Disable unnecessary printk logging +write /proc/sys/kernel/printk_devkmsg off + +# Start non-blocking writeback later +write /proc/sys/vm/dirty_background_ratio 10 + +# Start blocking writeback later +write /proc/sys/vm/dirty_ratio 30 + +# Require dirty memory to stay in memory for longer +write /proc/sys/vm/dirty_expire_centisecs 3000 + +# Run the dirty memory flusher threads less often +write /proc/sys/vm/dirty_writeback_centisecs 3000 + +# Disable read-ahead for swap devices +write /proc/sys/vm/page-cluster 0 + +# Update /proc/stat less often to reduce jitter +write /proc/sys/vm/stat_interval 10 + +# Swap to the swap device at a fair rate +write /proc/sys/vm/swappiness 100 + +# Fairly prioritize page cache and file structures +write /proc/sys/vm/vfs_cache_pressure 100 + +# Enable Explicit Congestion Control +write /proc/sys/net/ipv4/tcp_ecn 1 + +# Enable fast socket open for receiver and sender +write /proc/sys/net/ipv4/tcp_fastopen 3 + +# Disable SYN cookies +write /proc/sys/net/ipv4/tcp_syncookies 0 + +if [[ -f "/sys/kernel/debug/sched_features" ]] +then + # Consider scheduling tasks that are eager to run + write /sys/kernel/debug/sched_features NEXT_BUDDY + + # Schedule tasks on their origin CPU if possible + write /sys/kernel/debug/sched_features TTWU_QUEUE +fi + +[[ "$ANDROID" == true ]] && if [[ -d "/dev/stune/" ]] +then + # We are not concerned with prioritizing latency + write /dev/stune/top-app/schedtune.prefer_idle 0 + + # Mark top-app as boosted, find high-performing CPUs + write /dev/stune/top-app/schedtune.boost 1 +fi + +# Loop over each CPU in the system +for cpu in /sys/devices/system/cpu/cpu*/cpufreq +do + # Fetch the available governors from the CPU + avail_govs="$(cat "$cpu/scaling_available_governors")" + + # Attempt to set the governor in this order + for governor in schedutil interactive + do + # Once a matching governor is found, set it and break for this CPU + if [[ "$avail_govs" == *"$governor"* ]] + then + write "$cpu/scaling_governor" "$governor" + break + fi + done +done + +# Apply governor specific tunables for schedutil +find /sys/devices/system/cpu/ -name schedutil -type d | while IFS= read -r governor +do + # Consider changing frequencies once per scheduling period + write "$governor/up_rate_limit_us" "$((SCHED_PERIOD / 1000))" + write "$governor/down_rate_limit_us" "$((4 * SCHED_PERIOD / 1000))" + write "$governor/rate_limit_us" "$((SCHED_PERIOD / 1000))" + + # Jump to hispeed frequency at this load percentage + write "$governor/hispeed_load" 90 + write "$governor/hispeed_freq" "$UINT_MAX" +done + +# Apply governor specific tunables for interactive +find /sys/devices/system/cpu/ -name interactive -type d | while IFS= read -r governor +do + # Consider changing frequencies once per scheduling period + write "$governor/timer_rate" "$((SCHED_PERIOD / 1000))" + write "$governor/min_sample_time" "$((SCHED_PERIOD / 1000))" + + # Jump to hispeed frequency at this load percentage + write "$governor/go_hispeed_load" 90 + write "$governor/hispeed_freq" "$UINT_MAX" +done + +for queue in /sys/block/*/queue +do + # Choose the first governor available + avail_scheds="$(cat "$queue/scheduler")" + for sched in cfq noop kyber bfq mq-deadline none + do + if [[ "$avail_scheds" == *"$sched"* ]] + then + write "$queue/scheduler" "$sched" + break + fi + done + + # Do not use I/O as a source of randomness + write "$queue/add_random" 0 + + # Disable I/O statistics accounting + write "$queue/iostats" 0 + + # Reduce heuristic read-ahead in exchange for I/O latency + write "$queue/read_ahead_kb" 128 + + # Reduce the maximum number of I/O requests in exchange for latency + write "$queue/nr_requests" 64 +done + +# Always return success, even if the last write fails +#exit 0 \ No newline at end of file diff --git a/common/service_budget.txt b/common/service_budget.txt new file mode 100644 index 0000000..de31543 --- /dev/null +++ b/common/service_budget.txt @@ -0,0 +1,240 @@ +# +_SLEEPBOOT=60 +RETRY_INTERVAL=${_SLEEPBOOT} #in seconds +MAX_RETRY=3 +retry=${MAX_RETRY} +while (("$retry" > "0")) && [ "$(getprop sys.boot_completed)" != "1" ]; do + sleep ${RETRY_INTERVAL} + (($retry--)) +done + + +### -------------------------------------------------- +### Kraoc +### -------------------------------------------------- + +# Random entropy +setprop kernel.random.read_wakeup_threshold 128 +setprop kernel.random.write_wakeup_threshold 896 +sysctl -e -w kernel.random.read_wakeup_threshold=128 +sysctl -e -w kernel.random.write_wakeup_threshold=896 + +# UI scale +settings put global window_animation_scale 0.25 +settings put global transition_animation_scale 0.25 +settings put global animator_duration_scale 0.25 + + +### -------------------------------------------------- +### Ktweaks +### -------------------------------------------------- + +#!/usr/bin/env bash +# Written by Draco (tytydraco @ GitHub) + +# The name of the current branch for logging purposes +BRANCH="budget" + +# Maximum unsigned integer size in C +UINT_MAX="4294967295" + +# Duration in nanoseconds of one scheduling period +SCHED_PERIOD="$((5 * 1000 * 1000))" + +# How many tasks should we have at a maximum in one scheduling period +SCHED_TASKS="5" + +write() { + # Bail out if file does not exist + [[ ! -f "$1" ]] && return 1 + + # Make file writable in case it is not already + chmod +w "$1" 2> /dev/null + + # Write the new value and bail if there's an error + if ! echo "$2" > "$1" 2> /dev/null + then +# echo "Failed: $1 → $2" + return 1 + fi + + # Log the success +# echo "$1 → $2" +} + +## Check for root permissions and bail if not granted +#if [[ "$(id -u)" -ne 0 ]] +#then +## echo "No root permissions. Exiting." +# exit 1 +#fi + +# Detect if we are running on Android +#grep -q android /proc/cmdline && ANDROID=true +ANDROID=true + +## Log the date and time for records sake +#echo "Time of execution: $(date)" +#echo "Branch: $BRANCH" + +# Sync to data in the rare case a device crashes +#sync + +# Limit max perf event processing time to this much CPU usage +write /proc/sys/kernel/perf_cpu_time_max_percent 2 + +# Group tasks for less stutter but less throughput +write /proc/sys/kernel/sched_autogroup_enabled 1 + +# Execute child process before parent after fork +write /proc/sys/kernel/sched_child_runs_first 0 + +# Preliminary requirement for the following values +write /proc/sys/kernel/sched_tunable_scaling 0 + +# Reduce the maximum scheduling period for lower latency +write /proc/sys/kernel/sched_latency_ns "$SCHED_PERIOD" + +# Schedule this ratio of tasks in the guarenteed sched period +write /proc/sys/kernel/sched_min_granularity_ns "$((SCHED_PERIOD / SCHED_TASKS))" + +# Require preeptive tasks to surpass half of a sched period in vmruntime +write /proc/sys/kernel/sched_wakeup_granularity_ns "$((SCHED_PERIOD / 2))" + +# Reduce the frequency of task migrations +write /proc/sys/kernel/sched_migration_cost_ns 5000000 + +# Always allow sched boosting on top-app tasks +[[ "$ANDROID" == true ]] && write /proc/sys/kernel/sched_min_task_util_for_colocation 0 + +# Give up some latency to give the CPU a break +write /proc/sys/kernel/sched_nr_migrate 256 + +# Disable scheduler statistics to reduce overhead +write /proc/sys/kernel/sched_schedstats 0 + +# Disable unnecessary printk logging +write /proc/sys/kernel/printk_devkmsg off + +# Budget devices are low-ram devices, don't let this build up +write /proc/sys/vm/dirty_background_ratio 2 + +# Flush completely when this much of the device is fulled +write /proc/sys/vm/dirty_ratio 5 + +# Expire dirty memory very early +write /proc/sys/vm/dirty_expire_centisecs 500 + +# Run the dirty memory flusher threads more often +write /proc/sys/vm/dirty_writeback_centisecs 500 + +# Disable read-ahead for swap devices +write /proc/sys/vm/page-cluster 0 + +# Update /proc/stat less often to reduce jitter +write /proc/sys/vm/stat_interval 10 + +# Swap to the swap device at a fair rate +write /proc/sys/vm/swappiness 100 + +# Fairly prioritize page cache and file structures +write /proc/sys/vm/vfs_cache_pressure 100 + +# Enable Explicit Congestion Control +write /proc/sys/net/ipv4/tcp_ecn 1 + +# Enable fast socket open for receiver and sender +write /proc/sys/net/ipv4/tcp_fastopen 3 + +# Disable SYN cookies +write /proc/sys/net/ipv4/tcp_syncookies 0 + +if [[ -f "/sys/kernel/debug/sched_features" ]] +then + # Consider scheduling tasks that are eager to run + write /sys/kernel/debug/sched_features NEXT_BUDDY + + # Prioritize power over cache hits + write /sys/kernel/debug/sched_features NO_TTWU_QUEUE +fi + +[[ "$ANDROID" == true ]] && if [[ -d "/dev/stune/" ]] +then + # We are not concerned with prioritizing latency + write /dev/stune/top-app/schedtune.prefer_idle 0 + + # Don't boost foreground tasks, let the governor handle it + write /dev/stune/top-app/schedtune.boost 0 +fi + +# Loop over each CPU in the system +for cpu in /sys/devices/system/cpu/cpu*/cpufreq +do + # Fetch the available governors from the CPU + avail_govs="$(cat "$cpu/scaling_available_governors")" + + # Attempt to set the governor in this order + for governor in schedutil interactive + do + # Once a matching governor is found, set it and break for this CPU + if [[ "$avail_govs" == *"$governor"* ]] + then + write "$cpu/scaling_governor" "$governor" + break + fi + done +done + +# Apply governor specific tunables for schedutil +find /sys/devices/system/cpu/ -name schedutil -type d | while IFS= read -r governor +do + # Consider changing frequencies once per scheduling period + write "$governor/up_rate_limit_us" "$((SCHED_PERIOD / 1000))" + write "$governor/down_rate_limit_us" "$((SCHED_PERIOD / 1000))" + write "$governor/rate_limit_us" "$((SCHED_PERIOD / 1000))" + + # Jump to hispeed frequency at this load percentage + write "$governor/hispeed_load" 99 + write "$governor/hispeed_freq" "$UINT_MAX" +done + +# Apply governor specific tunables for interactive +find /sys/devices/system/cpu/ -name interactive -type d | while IFS= read -r governor +do + # Consider changing frequencies once per scheduling period + write "$governor/timer_rate" "$((SCHED_PERIOD / 1000))" + write "$governor/min_sample_time" "$((SCHED_PERIOD / 1000))" + + # Jump to hispeed frequency at this load percentage + write "$governor/go_hispeed_load" 99 + write "$governor/hispeed_freq" "$UINT_MAX" +done + +for queue in /sys/block/*/queue +do + # Choose the first governor available + avail_scheds="$(cat "$queue/scheduler")" + for sched in cfq noop kyber bfq mq-deadline none + do + if [[ "$avail_scheds" == *"$sched"* ]] + then + write "$queue/scheduler" "$sched" + break + fi + done + + # Do not use I/O as a source of randomness + write "$queue/add_random" 0 + + # Disable I/O statistics accounting + write "$queue/iostats" 0 + + # Reduce heuristic read-ahead in exchange for I/O latency + write "$queue/read_ahead_kb" 64 + + # Increase maximum requests to reduce processing power + write "$queue/nr_requests" 512 +done + +# Always return success, even if the last write fails +#exit 0 \ No newline at end of file diff --git a/common/service_latency.txt b/common/service_latency.txt new file mode 100644 index 0000000..2a3746b --- /dev/null +++ b/common/service_latency.txt @@ -0,0 +1,240 @@ +# +_SLEEPBOOT=60 +RETRY_INTERVAL=${_SLEEPBOOT} #in seconds +MAX_RETRY=3 +retry=${MAX_RETRY} +while (("$retry" > "0")) && [ "$(getprop sys.boot_completed)" != "1" ]; do + sleep ${RETRY_INTERVAL} + (($retry--)) +done + + +### -------------------------------------------------- +### Kraoc +### -------------------------------------------------- + +# Random entropy +setprop kernel.random.read_wakeup_threshold 128 +setprop kernel.random.write_wakeup_threshold 896 +sysctl -e -w kernel.random.read_wakeup_threshold=128 +sysctl -e -w kernel.random.write_wakeup_threshold=896 + +# UI scale +settings put global window_animation_scale 0.25 +settings put global transition_animation_scale 0.25 +settings put global animator_duration_scale 0.25 + + +### -------------------------------------------------- +### Ktweaks +### -------------------------------------------------- + +#!/usr/bin/env bash +# Written by Draco (tytydraco @ GitHub) + +# The name of the current branch for logging purposes +BRANCH="latency" + +# Maximum unsigned integer size in C +UINT_MAX="4294967295" + +# Duration in nanoseconds of one scheduling period +SCHED_PERIOD="$((1 * 1000 * 1000))" + +# How many tasks should we have at a maximum in one scheduling period +SCHED_TASKS="10" + +write() { + # Bail out if file does not exist + [[ ! -f "$1" ]] && return 1 + + # Make file writable in case it is not already + chmod +w "$1" 2> /dev/null + + # Write the new value and bail if there's an error + if ! echo "$2" > "$1" 2> /dev/null + then +# echo "Failed: $1 → $2" + return 1 + fi + + # Log the success +# echo "$1 → $2" +} + +## Check for root permissions and bail if not granted +#if [[ "$(id -u)" -ne 0 ]] +#then +## echo "No root permissions. Exiting." +# exit 1 +#fi + +# Detect if we are running on Android +#grep -q android /proc/cmdline && ANDROID=true +ANDROID=true + +# Log the date and time for records sake +#echo "Time of execution: $(date)" +#echo "Branch: $BRANCH" + +# Sync to data in the rare case a device crashes +#sync + +# Limit max perf event processing time to this much CPU usage +write /proc/sys/kernel/perf_cpu_time_max_percent 3 + +# Group tasks for less stutter but less throughput +write /proc/sys/kernel/sched_autogroup_enabled 1 + +# Execute child process before parent after fork +write /proc/sys/kernel/sched_child_runs_first 1 + +# Preliminary requirement for the following values +write /proc/sys/kernel/sched_tunable_scaling 0 + +# Reduce the maximum scheduling period for lower latency +write /proc/sys/kernel/sched_latency_ns "$SCHED_PERIOD" + +# Schedule this ratio of tasks in the guarenteed sched period +write /proc/sys/kernel/sched_min_granularity_ns "$((SCHED_PERIOD / SCHED_TASKS))" + +# Require preeptive tasks to surpass half of a sched period in vmruntime +write /proc/sys/kernel/sched_wakeup_granularity_ns "$((SCHED_PERIOD / 2))" + +# Reduce the frequency of task migrations +write /proc/sys/kernel/sched_migration_cost_ns 5000000 + +# Always allow sched boosting on top-app tasks +[[ "$ANDROID" == true ]] && write /proc/sys/kernel/sched_min_task_util_for_colocation 0 + +# Improve real time latencies by reducing the scheduler migration time +write /proc/sys/kernel/sched_nr_migrate 4 + +# Disable scheduler statistics to reduce overhead +write /proc/sys/kernel/sched_schedstats 0 + +# Disable unnecessary printk logging +write /proc/sys/kernel/printk_devkmsg off + +# Start non-blocking writeback later +write /proc/sys/vm/dirty_background_ratio 3 + +# Start blocking writeback later +write /proc/sys/vm/dirty_ratio 30 + +# Require dirty memory to stay in memory for longer +write /proc/sys/vm/dirty_expire_centisecs 3000 + +# Run the dirty memory flusher threads less often +write /proc/sys/vm/dirty_writeback_centisecs 3000 + +# Disable read-ahead for swap devices +write /proc/sys/vm/page-cluster 0 + +# Update /proc/stat less often to reduce jitter +write /proc/sys/vm/stat_interval 10 + +# Swap to the swap device at a fair rate +write /proc/sys/vm/swappiness 100 + +# Prioritize page cache over simple file structure nodes +write /proc/sys/vm/vfs_cache_pressure 200 + +# Enable Explicit Congestion Control +write /proc/sys/net/ipv4/tcp_ecn 1 + +# Enable fast socket open for receiver and sender +write /proc/sys/net/ipv4/tcp_fastopen 3 + +# Disable SYN cookies +write /proc/sys/net/ipv4/tcp_syncookies 0 + +if [[ -f "/sys/kernel/debug/sched_features" ]] +then + # Consider scheduling tasks that are eager to run + write /sys/kernel/debug/sched_features NEXT_BUDDY + + # Some sources report large latency spikes during large migrations + write /sys/kernel/debug/sched_features NO_TTWU_QUEUE +fi + +[[ "$ANDROID" == true ]] && if [[ -d "/dev/stune/" ]] +then + # Prefer to schedule top-app tasks on idle CPUs + write /dev/stune/top-app/schedtune.prefer_idle 1 + + # Mark top-app as boosted, find high-performing CPUs + write /dev/stune/top-app/schedtune.boost 1 +fi + +# Loop over each CPU in the system +for cpu in /sys/devices/system/cpu/cpu*/cpufreq +do + # Fetch the available governors from the CPU + avail_govs="$(cat "$cpu/scaling_available_governors")" + + # Attempt to set the governor in this order + for governor in schedutil interactive + do + # Once a matching governor is found, set it and break for this CPU + if [[ "$avail_govs" == *"$governor"* ]] + then + write "$cpu/scaling_governor" "$governor" + break + fi + done +done + +# Apply governor specific tunables for schedutil +find /sys/devices/system/cpu/ -name schedutil -type d | while IFS= read -r governor +do + # Consider changing frequencies once per scheduling period + write "$governor/up_rate_limit_us" 0 + write "$governor/down_rate_limit_us" 0 + write "$governor/rate_limit_us" 0 + + # Jump to hispeed frequency at this load percentage + write "$governor/hispeed_load" 85 + write "$governor/hispeed_freq" "$UINT_MAX" +done + +# Apply governor specific tunables for interactive +find /sys/devices/system/cpu/ -name interactive -type d | while IFS= read -r governor +do + # Consider changing frequencies once per scheduling period + write "$governor/timer_rate" 0 + write "$governor/min_sample_time" 0 + + # Jump to hispeed frequency at this load percentage + write "$governor/go_hispeed_load" 85 + write "$governor/hispeed_freq" "$UINT_MAX" +done + +for queue in /sys/block/*/queue +do + # Choose the first governor available + avail_scheds="$(cat "$queue/scheduler")" + for sched in cfq noop kyber bfq mq-deadline none + do + if [[ "$avail_scheds" == *"$sched"* ]] + then + write "$queue/scheduler" "$sched" + break + fi + done + + # Do not use I/O as a source of randomness + write "$queue/add_random" 0 + + # Disable I/O statistics accounting + write "$queue/iostats" 0 + + # Reduce heuristic read-ahead in exchange for I/O latency + write "$queue/read_ahead_kb" 32 + + # Reduce the maximum number of I/O requests in exchange for latency + write "$queue/nr_requests" 32 +done + +# Always return success, even if the last write fails +#exit 0 \ No newline at end of file diff --git a/common/service_throughput.txt b/common/service_throughput.txt new file mode 100644 index 0000000..d789740 --- /dev/null +++ b/common/service_throughput.txt @@ -0,0 +1,240 @@ +# +_SLEEPBOOT=60 +RETRY_INTERVAL=${_SLEEPBOOT} #in seconds +MAX_RETRY=3 +retry=${MAX_RETRY} +while (("$retry" > "0")) && [ "$(getprop sys.boot_completed)" != "1" ]; do + sleep ${RETRY_INTERVAL} + (($retry--)) +done + + +### -------------------------------------------------- +### Kraoc +### -------------------------------------------------- + +# Random entropy +setprop kernel.random.read_wakeup_threshold 128 +setprop kernel.random.write_wakeup_threshold 896 +sysctl -e -w kernel.random.read_wakeup_threshold=128 +sysctl -e -w kernel.random.write_wakeup_threshold=896 + +# UI scale +settings put global window_animation_scale 0.25 +settings put global transition_animation_scale 0.25 +settings put global animator_duration_scale 0.25 + + +### -------------------------------------------------- +### Ktweaks +### -------------------------------------------------- + +#!/usr/bin/env bash +# Written by Draco (tytydraco @ GitHub) + +# The name of the current branch for logging purposes +BRANCH="throughput" + +# Maximum unsigned integer size in C +UINT_MAX="4294967295" + +# Duration in nanoseconds of one scheduling period +SCHED_PERIOD="$((10 * 1000 * 1000))" + +# How many tasks should we have at a maximum in one scheduling period +SCHED_TASKS="6" + +write() { + # Bail out if file does not exist + [[ ! -f "$1" ]] && return 1 + + # Make file writable in case it is not already + chmod +w "$1" 2> /dev/null + + # Write the new value and bail if there's an error + if ! echo "$2" > "$1" 2> /dev/null + then +# echo "Failed: $1 → $2" + return 1 + fi + + # Log the success +# echo "$1 → $2" +} + +## Check for root permissions and bail if not granted +#if [[ "$(id -u)" -ne 0 ]] +#then +## echo "No root permissions. Exiting." +# exit 1 +#fi + +# Detect if we are running on Android +#grep -q android /proc/cmdline && ANDROID=true +ANDROID=true + +## Log the date and time for records sake +#echo "Time of execution: $(date)" +#echo "Branch: $BRANCH" + +# Sync to data in the rare case a device crashes +#sync + +# Limit max perf event processing time to this much CPU usage +write /proc/sys/kernel/perf_cpu_time_max_percent 20 + +# Sacrifice latency for throughput when grouping tasks +write /proc/sys/kernel/sched_autogroup_enabled 0 + +# Process child-parent forks naturally +write /proc/sys/kernel/sched_child_runs_first 0 + +# Preliminary requirement for the following values +write /proc/sys/kernel/sched_tunable_scaling 0 + +# Reduce the maximum scheduling period for lower latency +write /proc/sys/kernel/sched_latency_ns "$SCHED_PERIOD" + +# Schedule this ratio of tasks in the guarenteed sched period +write /proc/sys/kernel/sched_min_granularity_ns "$((SCHED_PERIOD / SCHED_TASKS))" + +# Require preeptive tasks to surpass half of a sched period in vmruntime +write /proc/sys/kernel/sched_wakeup_granularity_ns "$((SCHED_PERIOD / 2))" + +# Reduce the frequency of task migrations +write /proc/sys/kernel/sched_migration_cost_ns 5000000 + +# Always allow sched boosting on top-app tasks +[[ "$ANDROID" == true ]] && write /proc/sys/kernel/sched_min_task_util_for_colocation 0 + +# Improve real time latencies by reducing the scheduler migration time +write /proc/sys/kernel/sched_nr_migrate 128 + +# Disable scheduler statistics to reduce overhead +write /proc/sys/kernel/sched_schedstats 0 + +# Disable unnecessary printk logging +write /proc/sys/kernel/printk_devkmsg off + +# Start non-blocking writeback later +write /proc/sys/vm/dirty_background_ratio 15 + +# Start blocking writeback later +write /proc/sys/vm/dirty_ratio 30 + +# Require dirty memory to stay in memory for longer +write /proc/sys/vm/dirty_expire_centisecs 3000 + +# Run the dirty memory flusher threads less often +write /proc/sys/vm/dirty_writeback_centisecs 3000 + +# Disable read-ahead for swap devices +write /proc/sys/vm/page-cluster 0 + +# Update /proc/stat less often to reduce jitter +write /proc/sys/vm/stat_interval 10 + +# Swap to the swap device at a fair rate +write /proc/sys/vm/swappiness 100 + +# Allow inodes and dentries to build up a larger cache +write /proc/sys/vm/vfs_cache_pressure 80 + +# Enable Explicit Congestion Control +write /proc/sys/net/ipv4/tcp_ecn 1 + +# Enable fast socket open for receiver and sender +write /proc/sys/net/ipv4/tcp_fastopen 3 + +# Disable SYN cookies +write /proc/sys/net/ipv4/tcp_syncookies 0 + +if [[ -f "/sys/kernel/debug/sched_features" ]] +then + # Consider scheduling tasks that are eager to run + write /sys/kernel/debug/sched_features NEXT_BUDDY + + # Schedule tasks on their origin CPU if possible + write /sys/kernel/debug/sched_features TTWU_QUEUE +fi + +[[ "$ANDROID" == true ]] && if [[ -d "/dev/stune/" ]] +then + # We are not concerned with prioritizing latency + write /dev/stune/top-app/schedtune.prefer_idle 0 + + # Mark top-app as boosted, find high-performing CPUs + write /dev/stune/top-app/schedtune.boost 1 +fi + +# Loop over each CPU in the system +for cpu in /sys/devices/system/cpu/cpu*/cpufreq +do + # Fetch the available governors from the CPU + avail_govs="$(cat "$cpu/scaling_available_governors")" + + # Attempt to set the governor in this order + for governor in schedutil interactive + do + # Once a matching governor is found, set it and break for this CPU + if [[ "$avail_govs" == *"$governor"* ]] + then + write "$cpu/scaling_governor" "$governor" + break + fi + done +done + +# Apply governor specific tunables for schedutil +find /sys/devices/system/cpu/ -name schedutil -type d | while IFS= read -r governor +do + # Consider changing frequencies once per scheduling period + write "$governor/up_rate_limit_us" "$((SCHED_PERIOD / 1000))" + write "$governor/down_rate_limit_us" "$((4 * SCHED_PERIOD / 1000))" + write "$governor/rate_limit_us" "$((SCHED_PERIOD / 1000))" + + # Jump to hispeed frequency at this load percentage + write "$governor/hispeed_load" 85 + write "$governor/hispeed_freq" "$UINT_MAX" +done + +# Apply governor specific tunables for interactive +find /sys/devices/system/cpu/ -name interactive -type d | while IFS= read -r governor +do + # Consider changing frequencies once per scheduling period + write "$governor/timer_rate" "$((SCHED_PERIOD / 1000))" + write "$governor/min_sample_time" "$((SCHED_PERIOD / 1000))" + + # Jump to hispeed frequency at this load percentage + write "$governor/go_hispeed_load" 85 + write "$governor/hispeed_freq" "$UINT_MAX" +done + +for queue in /sys/block/*/queue +do + # Choose the first governor available + avail_scheds="$(cat "$queue/scheduler")" + for sched in cfq noop kyber bfq mq-deadline none + do + if [[ "$avail_scheds" == *"$sched"* ]] + then + write "$queue/scheduler" "$sched" + break + fi + done + + # Do not use I/O as a source of randomness + write "$queue/add_random" 0 + + # Disable I/O statistics accounting + write "$queue/iostats" 0 + + # Sacrifice I/O and memory efficiency for a possible throughput gain + write "$queue/read_ahead_kb" 256 + + # Buffer more requests at once + write "$queue/nr_requests" 512 +done + +# Always return success, even if the last write fails +#exit 0