[SCRIPT] Run init.d scripts once every N days [ZipAlign/SQLite3/others] - Android Software/Hacking General [Developers Only]
There are many ROMs that include the ZipAlign or SQLite3 vacuum on boot, but these command are not really needed to run on EVERY boot, once every few days can be enough, so I came out with this script.
To run it, you need to have busybox with the stat applet (should be there always), which gives information about a file, including last modification date.
This is done is by checking the last modification date on a file, which is touched or changed only when the main script is executed.
Currently I modified the ZipAlign and SQLite vacuum in my own rom to use this technique, and they seem to work fine. The monitored file is the log of the operation done, which is stored in the /data/ directory
ZipAlign on Boot:
Code:
#!/system/bin/sh
# Automatic ZipAlign by Wes Garner
# ZipAlign files in /data that have not been previously ZipAligned (using md5sum)
# Thanks to oknowton for the changes
# Changelog:
# 1.0 (11/30/09) Original
# 1.1 (12/01/09) Switched to zipalign -c 4 to check the apk instead of MD5 (oknowton)
# 1.2 (06/01/13) Run the main script only once every N days (default 7 days, 1 week) (mcbyte_it)
[COLOR="DarkRed"]LOG_FILE=/data/zipalign.log
#Interval between ZipAlign runs, in seconds, 604800=1 week
RUN_EVERY=604800
# Get the last modify date of the Log file, if the file does not exist, set value to 0
if [ -e $LOG_FILE ]; then
LASTRUN=`stat -t $LOG_FILE | awk '{print $14}'`
else
LASTRUN=0
fi;
# Get current date in epoch format
CURRDATE=`date +%s`
# Check the interval
INTERVAL=$(expr $CURRDATE - $LASTRUN)
# If interval is more than the set one, then run the main script
if [ $INTERVAL -gt $RUN_EVERY ];
then[/COLOR]
[COLOR="Green"] if [ -e $LOG_FILE ]; then
rm $LOG_FILE;
fi;
echo "Starting Automatic ZipAlign $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;
for apk in /data/app/*.apk ; do
zipalign -c 4 $apk;
ZIPCHECK=$?;
if [ $ZIPCHECK -eq 1 ]; then
echo ZipAligning $(basename $apk) | tee -a $LOG_FILE;
zipalign -f 4 $apk /cache/$(basename $apk);
if [ -e /cache/$(basename $apk) ]; then
cp -f -p /cache/$(basename $apk) $apk | tee -a $LOG_FILE;
rm /cache/$(basename $apk);
else
echo ZipAligning $(basename $apk) Failed | tee -a $LOG_FILE;
fi;
else
echo ZipAlign already completed on $apk | tee -a $LOG_FILE;
fi;
done;
echo "Automatic ZipAlign finished at $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;[/color]
[COLOR="DarkRed"]fi[/COLOR]
SQLite3 vacuum:
Code:
#!/system/bin/sh
# ========================================
# init.d script for McByte jkSGS3
# ========================================
# SQLite database vaccum
# Frequent inserts, updates, and deletes can cause the database file to become fragmented - where data for a single table or index is scattered around the database file.
# Running VACUUM ensures that each table and index is largely stored contiguously within the database file.
# In some cases, VACUUM may also reduce the number of partially filled pages in the database, reducing the size of the database file further.
# sqlite3 binary in /system/xbin is required!
# Changelog
# v1.0 - (??/??/????) - original version
# v1.1 - (06/01/2013) - run only every X seconds, default = 1 week (mcbyte_it)
#
[COLOR="DarkRed"]# Log file location
LOG_FILE=/data/sqlite.log
#Interval between SQLite3 runs, in seconds, 604800=1 week
RUN_EVERY=604800
# Get the last modify date of the Log file, if the file does not exist, set value to 0
if [ -e $LOG_FILE ]; then
LASTRUN=`stat -t $LOG_FILE | awk '{print $14}'`
else
LASTRUN=0
fi;
# Get current date in epoch format
CURRDATE=`date +%s`
# Check the interval
INTERVAL=$(expr $CURRDATE - $LASTRUN)
# If interval is more than the set one, then run the main script
if [ $INTERVAL -gt $RUN_EVERY ];
then[/COLOR]
[COLOR="Green"]if [ -e $LOG_FILE ]; then
rm $LOG_FILE;
fi;
echo "SQLite database VACUUM and REINDEX started at $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;
for i in `busybox find /d* -iname "*.db"`; do
/system/xbin/sqlite3 $i 'VACUUM;';
resVac=$?
if [ $resVac == 0 ]; then
resVac="SUCCESS";
else
resVac="ERRCODE-$resVac";
fi;
/system/xbin/sqlite3 $i 'REINDEX;';
resIndex=$?
if [ $resIndex == 0 ]; then
resIndex="SUCCESS";
else
resIndex="ERRCODE-$resIndex";
fi;
echo "Database $i: VACUUM=$resVac REINDEX=$resIndex" | tee -a $LOG_FILE;
done
echo "SQLite database VACUUM and REINDEX finished at $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;[/COLOR]
[COLOR="DarkRed"]fi;[/COLOR]
This looks like a great idea :good: is it possible to easily change the intended interval at which yo want the scripts to run though?
HTCDreamOn said:
This looks like a great idea :good: is it possible to easily change the intended interval at which yo want the scripts to run though?
Click to expand...
Click to collapse
Sure, check the examples I posted, they are well commented. Just change the value of the "RUN_EVERY".
I'll take a look
mcbyte_it said:
Sure, check the examples I posted, they are well commented. Just change the value of the "RUN_EVERY".
Click to expand...
Click to collapse
Awesome, I'll give them a go!
how can i modify this script to zimpalign /system/app too?
UnitedOceanic said:
how can i modify this script to zimpalign /system/app too?
Click to expand...
Click to collapse
There is no much sense of zipaligning system apps every x days, once they are zipaligned (when making the ROM zip), they remain zipaligned. some apks might need zip aligning if they get moved/installed as system apps after rom install.
Not to mention the stability, I don't know the exact boot mechanism of android, if you start zip aligning system apps during the init.d, it might cause instability to some system apps.
But if you mount the /system partition as read/write, do the zipaligning loop, then remount it as read-only, it should be possible.
still, I don't recommend doing so....
i pushed many apps from /data/app to /system/app.
I deleted the libs from the apks and copied them to /system/libs to saved space. however I forgot to zipalign the apks after removing the libs. I used the zipalign script from the rom toolbox app unfortunately it didn't work as expected. it just deleted the apps that should have been zipaligned.
I don't really want to zipalign /system at every boot. just once for the modified apks.
mcbyte_it said:
There are many ROMs that include the ZipAlign or SQLite3 vacuum on boot, but these command are not really needed to run on EVERY boot, once every few days can be enough, so I came out with this script.
To run it, you need to have busybox with the stat applet (should be there always), which gives information about a file, including last modification date.
This is done is by checking the last modification date on a file, which is touched or changed only when the main script is executed.
Currently I modified the ZipAlign and SQLite vacuum in my own rom to use this technique, and they seem to work fine. The monitored file is the log of the operation done, which is stored in the /data/ directory
ZipAlign on Boot:
Code:
#!/system/bin/sh
# Automatic ZipAlign by Wes Garner
# ZipAlign files in /data that have not been previously ZipAligned (using md5sum)
# Thanks to oknowton for the changes
# Changelog:
# 1.0 (11/30/09) Original
# 1.1 (12/01/09) Switched to zipalign -c 4 to check the apk instead of MD5 (oknowton)
# 1.2 (06/01/13) Run the main script only once every N days (default 7 days, 1 week) (mcbyte_it)
[COLOR="DarkRed"]LOG_FILE=/data/zipalign.log
#Interval between ZipAlign runs, in seconds, 604800=1 week
RUN_EVERY=604800
# Get the last modify date of the Log file, if the file does not exist, set value to 0
if [ -e $LOG_FILE ]; then
LASTRUN=`stat -t $LOG_FILE | awk '{print $14}'`
else
LASTRUN=0
fi;
# Get current date in epoch format
CURRDATE=`date +%s`
# Check the interval
INTERVAL=$(expr $CURRDATE - $LASTRUN)
# If interval is more than the set one, then run the main script
if [ $INTERVAL -gt $RUN_EVERY ];
then[/COLOR]
[COLOR="Green"] if [ -e $LOG_FILE ]; then
rm $LOG_FILE;
fi;
echo "Starting Automatic ZipAlign $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;
for apk in /data/app/*.apk ; do
zipalign -c 4 $apk;
ZIPCHECK=$?;
if [ $ZIPCHECK -eq 1 ]; then
echo ZipAligning $(basename $apk) | tee -a $LOG_FILE;
zipalign -f 4 $apk /cache/$(basename $apk);
if [ -e /cache/$(basename $apk) ]; then
cp -f -p /cache/$(basename $apk) $apk | tee -a $LOG_FILE;
rm /cache/$(basename $apk);
else
echo ZipAligning $(basename $apk) Failed | tee -a $LOG_FILE;
fi;
else
echo ZipAlign already completed on $apk | tee -a $LOG_FILE;
fi;
done;
echo "Automatic ZipAlign finished at $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;[/color]
[COLOR="DarkRed"]fi[/COLOR]
SQLite3 vacuum:
Code:
#!/system/bin/sh
# ========================================
# init.d script for McByte jkSGS3
# ========================================
# SQLite database vaccum
# Frequent inserts, updates, and deletes can cause the database file to become fragmented - where data for a single table or index is scattered around the database file.
# Running VACUUM ensures that each table and index is largely stored contiguously within the database file.
# In some cases, VACUUM may also reduce the number of partially filled pages in the database, reducing the size of the database file further.
# sqlite3 binary in /system/xbin is required!
# Changelog
# v1.0 - (??/??/????) - original version
# v1.1 - (06/01/2013) - run only every X seconds, default = 1 week (mcbyte_it)
#
[COLOR="DarkRed"]# Log file location
LOG_FILE=/data/sqlite.log
#Interval between SQLite3 runs, in seconds, 604800=1 week
RUN_EVERY=604800
# Get the last modify date of the Log file, if the file does not exist, set value to 0
if [ -e $LOG_FILE ]; then
LASTRUN=`stat -t $LOG_FILE | awk '{print $14}'`
else
LASTRUN=0
fi;
# Get current date in epoch format
CURRDATE=`date +%s`
# Check the interval
INTERVAL=$(expr $CURRDATE - $LASTRUN)
# If interval is more than the set one, then run the main script
if [ $INTERVAL -gt $RUN_EVERY ];
then[/COLOR]
[COLOR="Green"]if [ -e $LOG_FILE ]; then
rm $LOG_FILE;
fi;
echo "SQLite database VACUUM and REINDEX started at $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;
for i in `busybox find /d* -iname "*.db"`; do
/system/xbin/sqlite3 $i 'VACUUM;';
resVac=$?
if [ $resVac == 0 ]; then
resVac="SUCCESS";
else
resVac="ERRCODE-$resVac";
fi;
/system/xbin/sqlite3 $i 'REINDEX;';
resIndex=$?
if [ $resIndex == 0 ]; then
resIndex="SUCCESS";
else
resIndex="ERRCODE-$resIndex";
fi;
echo "Database $i: VACUUM=$resVac REINDEX=$resIndex" | tee -a $LOG_FILE;
done
echo "SQLite database VACUUM and REINDEX finished at $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;[/COLOR]
[COLOR="DarkRed"]fi;[/COLOR]
Click to expand...
Click to collapse
Thanks for this awesome script i was able to get an idea for this. I tried this two scripts but only zipalign works even though i have sqlite3 in stored in xbin.
mcbyte_it said:
There are many ROMs that include the ZipAlign or SQLite3 vacuum on boot, but these command are not really needed to run on EVERY boot, once every few days can be enough, so I came out with this script.
To run it, you need to have busybox with the stat applet (should be there always), which gives information about a file, including last modification date.
This is done is by checking the last modification date on a file, which is touched or changed only when the main script is executed.
Currently I modified the ZipAlign and SQLite vacuum in my own rom to use this technique, and they seem to work fine. The monitored file is the log of the operation done, which is stored in the /data/ directory
ZipAlign on Boot:
Code:
#!/system/bin/sh
# Automatic ZipAlign by Wes Garner
# ZipAlign files in /data that have not been previously ZipAligned (using md5sum)
# Thanks to oknowton for the changes
# Changelog:
# 1.0 (11/30/09) Original
# 1.1 (12/01/09) Switched to zipalign -c 4 to check the apk instead of MD5 (oknowton)
# 1.2 (06/01/13) Run the main script only once every N days (default 7 days, 1 week) (mcbyte_it)
[COLOR="DarkRed"]LOG_FILE=/data/zipalign.log
#Interval between ZipAlign runs, in seconds, 604800=1 week
RUN_EVERY=604800
# Get the last modify date of the Log file, if the file does not exist, set value to 0
if [ -e $LOG_FILE ]; then
LASTRUN=`stat -t $LOG_FILE | awk '{print $14}'`
else
LASTRUN=0
fi;
# Get current date in epoch format
CURRDATE=`date +%s`
# Check the interval
INTERVAL=$(expr $CURRDATE - $LASTRUN)
# If interval is more than the set one, then run the main script
if [ $INTERVAL -gt $RUN_EVERY ];
then[/COLOR]
[COLOR="Green"]if [ -e $LOG_FILE ]; then
rm $LOG_FILE;
fi;
echo "Starting Automatic ZipAlign $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;
for apk in /data/app/*.apk ; do
zipalign -c 4 $apk;
ZIPCHECK=$?;
if [ $ZIPCHECK -eq 1 ]; then
echo ZipAligning $(basename $apk) | tee -a $LOG_FILE;
zipalign -f 4 $apk /cache/$(basename $apk);
if [ -e /cache/$(basename $apk) ]; then
cp -f -p /cache/$(basename $apk) $apk | tee -a $LOG_FILE;
rm /cache/$(basename $apk);
else
echo ZipAligning $(basename $apk) Failed | tee -a $LOG_FILE;
fi;
else
echo ZipAlign already completed on $apk | tee -a $LOG_FILE;
fi;
done;
echo "Automatic ZipAlign finished at $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;[/color]
[COLOR="DarkRed"]fi[/COLOR]
SQLite3 vacuum:
Code:
#!/system/bin/sh
# ========================================
# init.d script for McByte jkSGS3
# ========================================
# SQLite database vaccum
# Frequent inserts, updates, and deletes can cause the database file to become fragmented - where data for a single table or index is scattered around the database file.
# Running VACUUM ensures that each table and index is largely stored contiguously within the database file.
# In some cases, VACUUM may also reduce the number of partially filled pages in the database, reducing the size of the database file further.
# sqlite3 binary in /system/xbin is required!
# Changelog
# v1.0 - (??/??/????) - original version
# v1.1 - (06/01/2013) - run only every X seconds, default = 1 week (mcbyte_it)
#
[COLOR="DarkRed"]# Log file location
LOG_FILE=/data/sqlite.log
#Interval between SQLite3 runs, in seconds, 604800=1 week
RUN_EVERY=604800
# Get the last modify date of the Log file, if the file does not exist, set value to 0
if [ -e $LOG_FILE ]; then
LASTRUN=`stat -t $LOG_FILE | awk '{print $14}'`
else
LASTRUN=0
fi;
# Get current date in epoch format
CURRDATE=`date +%s`
# Check the interval
INTERVAL=$(expr $CURRDATE - $LASTRUN)
# If interval is more than the set one, then run the main script
if [ $INTERVAL -gt $RUN_EVERY ];
then[/COLOR]
[COLOR="Green"]if [ -e $LOG_FILE ]; then
rm $LOG_FILE;
fi;
echo "SQLite database VACUUM and REINDEX started at $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;
for i in `busybox find /d* -iname "*.db"`; do
/system/xbin/sqlite3 $i 'VACUUM;';
resVac=$?
if [ $resVac == 0 ]; then
resVac="SUCCESS";
else
resVac="ERRCODE-$resVac";
fi;
/system/xbin/sqlite3 $i 'REINDEX;';
resIndex=$?
if [ $resIndex == 0 ]; then
resIndex="SUCCESS";
else
resIndex="ERRCODE-$resIndex";
fi;
echo "Database $i: VACUUM=$resVac REINDEX=$resIndex" | tee -a $LOG_FILE;
done
echo "SQLite database VACUUM and REINDEX finished at $( date +"%m-%d-%Y %H:%M:%S" )" | tee -a $LOG_FILE;[/COLOR]
[COLOR="DarkRed"]fi;[/COLOR]
Click to expand...
Click to collapse
Hi guys! I recently installed lollipop touch wiz and installed the two scripts on the Op, managed to get the sql script to work fine but when the zip align tries to run it errors out in the log, any advice to what I've done wrong or if you guys know of a change in lollipop that doesn't play nice with zip aligning?
Starting Automatic ZipAlign 06-04-2014 15:23:01
ZipAligning *.apk
ZipAligning *.apk Failed
Automatic ZipAlign finished at 06-04-2014 15:23:01
Click to expand...
Click to collapse
All I've done as far as modify the script is I got rid of the color tags.
Also the sql log shows the correct date as well, where this script does not.
Thank you in advance guys!
Any chance to make this flasheable thx!
how to make an specific init.d script runs every x minutes?
and when unlock the screen
Related
[Q] How do i Odex a build from my computer
all of the tutorials i have seen on how to odex is pushing a script to the phone after its installed i am looking to do this before first boot. any help its appreciated
here is the script from an and build, try in linux and see what happens (of course edit for your folder structure) #!/system/bin/sh # # system/app odex-er by Paul O'Brien @ www.MoDaCo.com # # experimental - nandroid backup before you run this script! # # version 0.1, 29th January 2010 # updated by Martin Johnson, M.J.Johnson @ massey.ac.nz June 2010 for Vogue # rm /tmp.odex cd /data/app # Check for and delete leftover .odex files after uninstalled apps for filename in *.odex do name=`basename $filename .odex` if [ ! -f $name.apk -a -f $filename ] then rm $filename echo "Removed $filename" fi done; # Loop through all installed apps for filename in *.apk do name=`basename $filename .apk` if [ ! -f $name.odex -o $filename -nt $name.odex ] then # step 1 - odex the apk rm -f /tmp.odex /system/bin/dexopt-wrapper $filename /tmp.odex # step 2 - did we succesfully odex? if [ $? -eq 0 ] then # step 3 - remove the classes.dex from the apk /system/bin/zip -d $filename classes.dex # continue only if classes.dex was present if [ $? -eq 0 ] then # step 4 - zipalign, just in case /system/bin/zipalign -f -v 4 $filename /$filename.new mv -f /$filename.new $filename mv -f /tmp.odex $name.odex touch $name.odex echo "Odexed $filename" else echo "Error $filename did not contain classes.dex" fi else echo "Error creating odex from $filename" fi else echo "Nothing to do: $filename" fi done;
Any more thoughts??
[Script] Chroot Control Script
One of the fun things you can do on your Android device, is to play around with different ways of getting a real distro (Debian, Ubuntu etc.) working along side the Android system. There are several (A lot) of tutorials in here on how to do this, so this part will not be covered here. This thread only contains some scripts that will help make it easier working with the chroot. Most of the scripts that comes with the endless pool of chroot tutorials, is only made to mount and unmount the distro image in the most simple way. But nothing that helps walking in and out of the chroot without mount/unmount, and nothing that takes different services, busy devices etc. into consideration. The debian.sh script in this thread has many tasks. It will on execution check to see if the image is mounted or not. If the image is mounted, it will just enter the chroot. If not, it will mount the image and then enter the chroot. On exit it will provide you with the option of exiting the chroot or exit and unmount. Also it provides 4 custom scripts that is placed and executed inside the chroot. One for mount, unmount, enter chroot, leave chroot. This makes it possible to control chroot services much easier. The script debian.sh is executed using the command "debian". You can also unmount the chroot from within the android shell by executing "debian unmount" instead of entering the chroot and then exit choosing to unmount. The unmount process has several and different unmount attempts in case of busy devices, running services etc. which will make sure that the chroot is successfully unmounted. File: /system/bin/debian Code: #!/system/bin/sh su -c "/system/bin/debian.sh [email protected]" File: /system/bin/debian.sh Code: #!/system/bin/sh createLinuxBoot() { if [ ! -f $FILESYSTEM ]; then echo "Missing the $DIST filesystem image!" return 0 elif [ ! -z "$(mount | grep "$MOUNTPOINT ")" ]; then # If the loop device is already mounted, we do nothing. echo " - $DIST is already mounted. Entering chroot..." else echo " - Executing mount proccess of $DIST..." if [ ! -d $MOUNTPOINT ]; then # Create the mount point if it does not already exist busybox mkdir -p $MOUNTPOINT 2> /dev/null if [ ! -d $MOUNTPOINT ]; then echo "It was not possible to create the missing mount location ($MOUNTPOINT)!" return 0 fi fi # Android places loop devices in /dev/block/ instead of root /dev/ # If there are none in /dev/ we create links between /dev/loopX and /dev/block/loopX so that losetup will work as it should. if [ ! -e /dev/loop0 ]; then for i in 0 1 2 3 4 5 6 7 do # Create each block device mknod /dev/loop$i b 7 $i done fi # Android also placed the frame buffer in /dev/grapichs instead of /dev if [ ! -e /dev/fb0 ]; then mknod /dev/fb0 b 29 0 fi # Locate the current loop device file if [ ! -z "$(losetup | grep "$FILESYSTEM")" ]; then # If the filesystem file is already attached to an loop device, we get the path to the device file. loblk=$(losetup | grep "$FILESYSTEM" | cut -d ":" -f 1) else # If the filesystem file is not yet attached, we attach it. loblk=$(losetup -f) losetup $loblk $FILESYSTEM 2> /dev/null # Make sure that the device was successfully attached to a loop device file if [ -z "$(losetup | grep "$FILESYSTEM")" ]; then echo "It was not possible to attach the $DIST filesystem to a loop device!" return 0 fi fi # Mount the filesystem mount $loblk $MOUNTPOINT 2> /dev/null if [ ! -z "$(mount | grep "$MOUNTPOINT ")" ]; then # Bind some Android dirs to the linux filesystem for i in $MOUNT_BIND do # Bind the dirs if they are not already binded if [ -z "$(mount | grep "$MOUNTPOINT/$i ")" ]; then # Create any missing dirs in the mountpoint if [ ! -d $MOUNTPOINT/$i ]; then busybox mkdir -p $MOUNTPOINT/$i 2> /dev/zero fi mount --bind /$i $MOUNTPOINT/$i fi done # FIX the "stdin: is not a tty" error in direct hadware case. if [ -z "$(mount | grep "$MOUNTPOINT/dev/pts ")" ]; then mount -t devpts devpts $MOUNTPOINT/dev/pts fi # For the network. #sysctl -w net.ipv4.ip_forward=1 echo 1 > /proc/sys/net/ipv4/ip_forward # Cleanup tmp folder. rm -rf $MOUNTPOINT/tmp/* else echo "It was not possible to mount $DIST at the specified location ($MOUNTPOINT)!" return 0 fi if [ -f $MOUNTPOINT/etc/init.chroot/rc_mount.sh ]; then # Execute the mount init file, if it exists chroot $MOUNTPOINT /etc/init.chroot/rc_mount.sh fi echo " - $DIST was successsfully mounted. Entering chroot..." fi return 1 } removeLinuxBoot() { if [ -z "$(mount | grep "$MOUNTPOINT ")" ]; then # If linux is not mounted, then do nothing. echo " - $DIST is already unmounted. Exiting..." else echo " - Executing unmount process of $DIST..." if [ -f $MOUNTPOINT/etc/init.chroot/rc_unmount.sh ]; then # Execute the unmount init script, if it exist. chroot $MOUNTPOINT /etc/init.chroot/rc_unmount.sh fi sync # The sleep part is very important. It may take some time before /dev is no longer busy # after executing some services in the rc_unmount.sh script. sleep 1 # Make sure that we have an loop device file to use if [ ! -z "$(losetup | grep "$FILESYSTEM")" ]; then # Get the loop device file loblk=$(losetup | grep "$FILESYSTEM" | cut -d ":" -f 1) for i in $UMOUNT_BIND do # Unmount all binding dirs if [ ! -z "$(mount | grep "$MOUNTPOINT/$i ")" ]; then umount $MOUNTPOINT/$i 2> /dev/zero fi done sync # Unmount the device # In most cases one umount attempt will be enough. # However it may take up to 3 tries in order to make it work. # It depends on the types of services running or has been running before unmounting. umount $MOUNTPOINT 2> /dev/null && sleep 1 2> /dev/zero if [ ! -z "$(mount | grep "$MOUNTPOINT ")" ]; then sync umount $MOUNTPOINT 2> /dev/null && sleep 1 2> /dev/zero fi # If the device could not be unmounted if [ ! -z "$(mount | grep "$MOUNTPOINT ")" ]; then echo " - Unable to unmount $DIST. Will attempt to kill attached processes..." # Try to kill all processes holding the device fuser -k -9 $loblk sync # Use umount with the -l option to take care of the rest umount -l $MOUNTPOINT 2> /dev/null && sleep 1 fi # Make sure the device has been successfully unmounted if [ -z "$(mount | grep "$MOUNTPOINT ")" ]; then # Try to detach the device from the loop device file losetup -d $loblk 2> /dev/null # Make sure that the device was successfully detached if [ -z "$(losetup | grep "$FILESYSTEM")" ]; then echo "$DIST has been successfully unmounted!" else echo "$DIST has been successfully unmounted, but was not able not detach the loop device!" fi else echo "$DIST could not be successfully unmounted!" fi else echo "Could not locate the loop device. $DIST was not unmounted!" fi fi } if [ -z "$EXPORTED" ]; then export EXPORTED="TRUE" # Basic needed variables export TERM=linux export HOME=/root export USER=root export LOGNAME=root export UID=0 export SHELL=bash # Here you can add all of the paths that should be binded. One list for mount and one reversed list for unmount. export MOUNT_BIND="dev dev/pts dev/cpuctl proc sys sys/kernel/debug system d vendor acct sdcard cache sd-ext data" export UMOUNT_BIND="dev/cpuctl dev/pts dev proc sys/kernel/debug d sys vendor acct sdcard cache sd-ext system data" # Here you can change mount and image paths export DIST="Debian" # The name of the distro. Is used for the messages. export FILESYSTEM=/mnt/sdcard/debian.img # Path to the distro image file export MOUNTPOINT=/data/debian # Path where the distro is to be mounted fi export OLDPATH=$PATH export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/root/bin:$PATH if [ "$1" = "unmount" ]; then removeLinuxBoot else createLinuxBoot if [ $? -eq 1 ]; then if [ -f $MOUNTPOINT/etc/init.chroot/rc_enter.sh ]; then chroot $MOUNTPOINT /etc/init.chroot/rc_enter.sh fi chroot $MOUNTPOINT /bin/bash -i if [ -f $MOUNTPOINT/etc/init.chroot/rc_leave.sh ]; then chroot $MOUNTPOINT /etc/init.chroot/rc_leave.sh fi echo -n " - Type [Y] to unmount $DIST or random key to exit chroot ]# " read ACTION if [ "$ACTION" = "y" ] || [ "$ACTION" = "Y" ]; then removeLinuxBoot fi fi fi # Restore the PATH variable when executing chroot export PATH=$OLDPATH By default debian.sh will look for /mnt/sdcard/debian.img and mount it at /data/debian The script has build-in first-time-install functionality that will create missing directories etc. Just change the variable "FILESYSTEM" in debian.sh to the correct path and filename of your distro image, and it will handle the rest. Chroot Init Scripts Inside your chroot, you can create the directory /etc/init.chroot and create the fallowing files. rc_mount.sh - Executed after mount rc_unmount.sh - Executed before unmount rc_enter.sh - Executed when entering chroot rc_leave.sh - Executed when leaving chroot Here are an example of a mount and unmount script used to control tightvncserver. File: (chroot) /etc/init.chroot/rc_mount.sh Code: #!/bin/sh # Make sure that the vncserver is completly stopped before starting. if [ ! -f /tmp/.X11-unix/X1 ] && [ ! -f /tmp/.X1-lock ]; then # Start vncserver vncserver -geometry 800x480 :1 else # This is in case something went wrong the last time # it was shut down. Perhaps an uncomplete unmount. vncserver -kill :1 2> /dev/zero unset /tmp/.X11-unix/X1 2> /dev/zero 2> /dev/zero unset /tmp/.X1-lock 2> /dev/zero 2> /dev/zero vncserver -geometry 800x480 :1 fi File: (chroot) /etc/init.chroot/rc_unmount.sh Code: #!/bin/sh # Only stop this if it is started if [ -f /tmp/.X11-unix/X1 ] || [ -f /tmp/.X1-lock ]; then vncserver -kill :1 # Make sure that these are removed unset /tmp/.X11-unix/X1 2> /dev/zero unset /tmp/.X1-lock 2> /dev/zero fi Using these scripts, the VNC Server is started on chroot mount and stopped on chroot unmount. You can still leave and enter the chroot keeping the VNC Server running.
[SCRIPT][UPDATED 03.26.14] Fix Lag, Defrag/Free Memory with |=>TrimDropOff<=|
Updated 03.26.14 - Released v2.1 - bug fixes and code cleaned Introduction: I am by no means a developer. I am just an android enthusiast who has learned a bit of bash. The reason I made this script was that settings>>wifi>>advanced was not promptly turning wifi off when my device would sleep; sometimes it would not turn off at all. So I figured since I am making a script to resolve this issue I might as well add a couple of other functions as well. To this end I noticed some people saying THIS APP was helpful and I missed the Flush-O-Matic script from V6 SuperCharger so I added fstrim and drop_caches=3 to the script. Click to expand... Click to collapse What will this do? The script will allow you to sync wifi, fstrim, and/or drop_caches=3 with sleep and/or it will allow you to schedule fstrim and/or drop_caches=3 using crond. The scheduling option can work on either a hourly (you can choose to run desired programs every hour on the hour, every two hours on the hour, every 3 hours on the hour, etc) or daily basis (you can choose to run desired programs at a given time on the hour). Both the sync and schedule options will load themselves in to memory each boot and each time your device goes to sleep and/or when scheduled the scripts will depending on your options: (1) sync your data so as to ensure no data is lost; (2) TRIM your /system, /data, and /cache partitions; (3) DROP CACHES = 3; and (4) turn off wifi. In addition, there is also an on-the-fly script to manually trim partitions and drop caches when desired. Click to expand... Click to collapse Benefits: Reduce lag/improve i/o efficiency (see THIS and THIS). Although android automatically invokes fstrim when certain conditions are met, these criteria could seldom if ever be met depending upon your usage style. The init.d script should ensure fstrim is invoked more frequently for most users. Should use less ram than apps that perform similar functions (I say should because I have never used such apps, but I imagine they consume more that .2-.5 mb of ram). Click to expand... Click to collapse Requirements: root init.d busybox fstrim (should be in all nexus 4.3+ roms) Click to expand... Click to collapse Warning/Disclaimer: Although these scripts function as intended on my device – Nexus 7 (2013), SlimKat (weekly), ElementalX...Use at your own risk. Neither I nor XDA are responsible for any possible deleterious effects. Click to expand... Click to collapse Known Issues/Bugs: If you use the sync option, scripts with a lower priority than Z99 will not execute. The log files don't always display as intended...dunno why...any help/suggestions would be appreciated. Let me know if you find any others . Click to expand... Click to collapse Install, Usage/Verification, & Uninstall: Install - Note: If you use crond for other tasks, both the install and uninstall routine account for this potential contigency and should leave your other crond tasks uneffects. make a nandroid backup download the zip (<<NOT flashable) attached to this post extract the zip’s contents if you were/are using the first version of this script manually delete: /etc/init.d/07TrimDropOff, /data/TrimDropOff_Awake.log, and /data/TrimDropOff_Sleep.log run TrimDropOffInstaller with superuser permission via terminal or script manager. follow the scripts prompts reboot enjoy Usage/Verification - Assuming you have followed the install procedure, next, put your device to sleep and then wake it if you are using the sync option. Now check the various logs in /data/TrimDropOff. The logs will show the time, the script’s PIDs, the path of the PIDs (just to double-check the PIDs are correct), the ram used by the PIDs, action(s) preformed (amount trimmed from each partition and/or if drop_cahes was run), or errors. If you want verify manually via terminal do [pgrep -f TrimDrop] for the sync option or [pgrep crond] for the scheduling option to get the PIDs, do [cat /proc/PID/cmdline] for each PID to verify it truly belongs to Z99TrimDropOff or crond, and do [dumpsys meminfo | grep PID] for each PID to verify ram usage (this command will yield duplicates, which can be disregarded and may output undesired additional results, which can be filtered by looking through the results for the relevant PID). To use the on-the-fly script to trim and/or drop as desired, in terminal do [su -c trimdrop]. Should you want to reconfigure your setup, uninstall before reinstalling to avoid potential issues. Uninstall - Note: If you use crond for other tasks, both the install and uninstall routine account for this potential contigency and should leave your other crond tasks uneffects. Rerun TrimDropOffInstaller with superuser permission and use uninstall option at the beginning of the script. Reboot and all will be back to as it was before. Click to expand... Click to collapse To-Do List: Make in to an AROMA package. I don't know, you tell me . Click to expand... Click to collapse Code: #!/system/bin/sh # This script was authored by Defiant07 @ xda. Feel free to use it as you see fit, but please give proper credits. # Big thanks to zeppelinrox, dk_zero-cool, & gu5t3r @ xda for their contributions to portions of this script (see the code of my other script SwapItOn @ xda for detailed citations). # Read Karl Marx. input_error(){ echo "That is not a valid input...try again...bye ." exit 69 } mount_rw(){ mount -o remount,rw / 2>/dev/null mount -o remount,rw rootfs 2>/dev/null busybox mount -o remount,rw / 2>/dev/null busybox mount -o remount,rw rootfs 2>/dev/null mount -o remount,rw /system 2>/dev/null busybox mount -o remount,rw /system 2>/dev/null busybox mount -o remount,rw $(busybox mount | awk '/system /{print $1,$3}') 2>/dev/null } mount_ro(){ mount -o remount,ro / 2>/dev/null mount -o remount,ro rootfs 2>/dev/null busybox mount -o remount,ro / 2>/dev/null busybox mount -o remount,ro rootfs 2>/dev/null mount -o remount,ro /system 2>/dev/null busybox mount -o remount,ro /system 2>/dev/null busybox mount -o remount,ro $(busybox mount | awk '/system /{print $1,$3}') 2>/dev/null } clear if [ ! "`busybox`" ]; then echo "Missing busybox...try again...bye ." exit 69 fi id=$(id); id=${id#*=}; id=${id%%[\( ]*} if [ "$id" = "0" ] || [ "$id" = "root" ]; then echo "" 1>/dev/null else echo "Not running as root...try again...bye ." exit 69 fi if [ ! -d /etc/init.d ]; then echo "Missing /etc/init.d...try again...bye ." exit 69 fi if [ ! "`grep -r fstrim /system/bin`" ] && [ ! "`grep -r fstrim /system/xbin`" ]; then echo "Missing fstrim...try again...bye ." exit 69 fi echo "Do you want to install or uninstall TrimDropOff?" echo "Note: If you are rerunning this script to" echo "reconfigure your setup, uninstall first." echo -n "Input (i)nstall or (u)ninstall: " read install_uninstall echo case $install_uninstall in i|I)mount_rw if [ ! -d "/sqlite_stmt_journals" ]; then mkdir /sqlite_stmt_journals fi if [ ! -d "/data/TrimDropOff" ]; then mkdir /data/TrimDropOff chmod 755 /data/TrimDropOff fi;; u|U)mount_rw rm /system/etc/init.d/Z99TrimDropOff_Sync 2>/dev/null rm /system/etc/init.d/07TrimDropOff_Cron 2>/dev/null rm /system/xbin/trimdrop 2>/dev/null rm -rf /data/TrimDropOff 2>/dev/null echo "Are you using cron.d for any other services?" echo -n "Input es or o: " read crond_use echo case $crond_use in y|Y)sed '/TrimDropOff/d' -i /system/etc/cron.d/crontabs/root 2>/dev/null;; n|N)rm -rf /system/etc/cron.d 2>/dev/null;; *)input_error;; esac mount_ro echo "All done. You can close your app now." echo "Reboot your device to stop all processes." exit 0;; *)input_error;; esac wifi_only(){ cat > /system/etc/init.d/Z99TrimDropOff_Sync << EOF #!/system/bin/sh tdo_time(){ while [ ! "\`ps | grep -m 1 [a]ndroid\`" ]; do sleep 10; done while [ 1 ]; do AWAKE=\`cat /sys/power/wait_for_fb_wake\` if [ "\$AWAKE" = "awake" ]; then exec 1>/data/TrimDropOff/Awake.log svc wifi enable echo "\$(date +"%r %Y.%m.%d"): Waiting for screen to sleep. Confirming script in memory..." echo "PIDs:" pgrep -f TrimDrop pidls=\`pgrep -f TrimDrop\` echo "Verify Correct PIDs:" for i in \$pidls; do cat /proc/\$i/cmdline done echo "" echo "RAM Usage:" for i in \$pidls; do dumpsys meminfo | grep \$i | grep sh | grep -m 1 pid done fi SLEEPING=\`cat /sys/power/wait_for_fb_sleep\` if [ "\$SLEEPING" = "sleeping" ]; then exec 1>/data/TrimDropOff/Sleep.log echo "\$(date +"%r %Y.%m.%d"): Offing." svc wifi disable fi done } if [ "\`ps | grep -m 1 [a]ndroid\`" ]; then tdo_time else exec > /data/TrimDropOff/Sync_BootErrors.log 2>&1 tdo_time & fi exit 0 EOF } fstrim_only(){ cat > /system/etc/init.d/Z99TrimDropOff_Sync << EOF #!/system/bin/sh tdo_time(){ while [ ! "\`ps | grep -m 1 [a]ndroid\`" ]; do sleep 10; done while [ 1 ]; do AWAKE=\`cat /sys/power/wait_for_fb_wake\` if [ "\$AWAKE" = "awake" ]; then exec 1>/data/TrimDropOff/Awake.log echo "\$(date +"%r %Y.%m.%d"): Waiting for screen to sleep. Confirming script in memory..." echo "PIDs:" pgrep -f TrimDrop pidls=\`pgrep -f TrimDrop\` echo "Verify Correct PIDs:" for i in \$pidls; do cat /proc/\$i/cmdline done echo "" echo "RAM Usage:" for i in \$pidls; do dumpsys meminfo | grep \$i | grep sh | grep -m 1 pid done fi SLEEPING=\`cat /sys/power/wait_for_fb_sleep\` if [ "\$SLEEPING" = "sleeping" ]; then exec 1>/data/TrimDropOff/Sleep.log echo "\$(date +"%r %Y.%m.%d"): Trimming." echo "/system:" busybox sync fstrim -v /system echo "/data:" busybox sync fstrim -v /data echo "/cache:" busybox sync fstrim -v /cache fi done } if [ "\`ps | grep -m 1 [a]ndroid\`" ]; then tdo_time else exec > /data/TrimDropOff/Sync_BootErrors.log 2>&1 tdo_time & fi exit 0 EOF } drop_only(){ cat > /system/etc/init.d/Z99TrimDropOff_Sync << EOF #!/system/bin/sh tdo_time(){ while [ ! "\`ps | grep -m 1 [a]ndroid\`" ]; do sleep 10; done while [ 1 ]; do AWAKE=\`cat /sys/power/wait_for_fb_wake\` if [ "\$AWAKE" = "awake" ]; then exec 1>/data/TrimDropOff/Awake.log echo "\$(date +"%r %Y.%m.%d"): Waiting for screen to sleep. Confirming script in memory..." echo "PIDs:" pgrep -f TrimDrop pidls=\`pgrep -f TrimDrop\` echo "Verify Correct PIDs:" for i in \$pidls; do cat /proc/\$i/cmdline done echo "" echo "RAM Usage:" for i in \$pidls; do dumpsys meminfo | grep \$i | grep sh | grep -m 1 pid done fi SLEEPING=\`cat /sys/power/wait_for_fb_sleep\` if [ "\$SLEEPING" = "sleeping" ]; then exec 1>/data/TrimDropOff/Sleep.log echo "\$(date +"%r %Y.%m.%d"): Dropping." echo "drop caches:" busybox sync busybox sysctl -w vm.drop_caches=3 fi done } if [ "\`ps | grep -m 1 [a]ndroid\`" ]; then tdo_time else exec > /data/TrimDropOff/Sync_BootErrors.log 2>&1 tdo_time & fi exit 0 EOF } wifi_fstrim(){ cat > /system/etc/init.d/Z99TrimDropOff_Sync << EOF #!/system/bin/sh tdo_time(){ while [ ! "\`ps | grep -m 1 [a]ndroid\`" ]; do sleep 10; done while [ 1 ]; do AWAKE=\`cat /sys/power/wait_for_fb_wake\` if [ "\$AWAKE" = "awake" ]; then exec 1>/data/TrimDropOff/Awake.log svc wifi enable echo "\$(date +"%r %Y.%m.%d"): Waiting for screen to sleep. Confirming script in memory..." echo "PIDs:" pgrep -f TrimDrop pidls=\`pgrep -f TrimDrop\` echo "Verify Correct PIDs:" for i in \$pidls; do cat /proc/\$i/cmdline done echo "" echo "RAM Usage:" for i in \$pidls; do dumpsys meminfo | grep \$i | grep sh | grep -m 1 pid done fi SLEEPING=\`cat /sys/power/wait_for_fb_sleep\` if [ "\$SLEEPING" = "sleeping" ]; then exec 1>/data/TrimDropOff/Sleep.log echo "\$(date +"%r %Y.%m.%d"): Trimming, Offing." echo "/system:" busybox sync fstrim -v /system echo "/data:" busybox sync fstrim -v /data echo "/cache:" busybox sync fstrim -v /cache svc wifi disable fi done } if [ "\`ps | grep -m 1 [a]ndroid\`" ]; then tdo_time else exec > /data/TrimDropOff/Sync_BootErrors.log 2>&1 tdo_time & fi exit 0 EOF } wifi_drop(){ cat > /system/etc/init.d/Z99TrimDropOff_Sync << EOF #!/system/bin/sh tdo_time(){ while [ ! "\`ps | grep -m 1 [a]ndroid\`" ]; do sleep 10; done while [ 1 ]; do AWAKE=\`cat /sys/power/wait_for_fb_wake\` if [ "\$AWAKE" = "awake" ]; then exec 1>/data/TrimDropOff/Awake.log svc wifi enable echo "\$(date +"%r %Y.%m.%d"): Waiting for screen to sleep. Confirming script in memory..." echo "PIDs:" pgrep -f TrimDrop pidls=\`pgrep -f TrimDrop\` echo "Verify Correct PIDs:" for i in \$pidls; do cat /proc/\$i/cmdline done echo "" echo "RAM Usage:" for i in \$pidls; do dumpsys meminfo | grep \$i | grep sh | grep -m 1 pid done fi SLEEPING=\`cat /sys/power/wait_for_fb_sleep\` if [ "\$SLEEPING" = "sleeping" ]; then exec 1>/data/TrimDropOff/Sleep.log echo "\$(date +"%r %Y.%m.%d"): Dropping, Offing." echo "drop caches:" busybox sync busybox sysctl -w vm.drop_caches=3 svc wifi disable fi done } if [ "\`ps | grep -m 1 [a]ndroid\`" ]; then tdo_time else exec > /data/TrimDropOff/Sync_BootErrors.log 2>&1 tdo_time & fi exit 0 EOF } fstrim_drop(){ cat > /system/etc/init.d/Z99TrimDropOff_Sync << EOF #!/system/bin/sh tdo_time(){ while [ ! "\`ps | grep -m 1 [a]ndroid\`" ]; do sleep 10; done while [ 1 ]; do AWAKE=\`cat /sys/power/wait_for_fb_wake\` if [ "\$AWAKE" = "awake" ]; then exec 1>/data/TrimDropOff/Awake.log echo "\$(date +"%r %Y.%m.%d"): Waiting for screen to sleep. Confirming script in memory..." echo "PIDs:" pgrep -f TrimDrop pidls=\`pgrep -f TrimDrop\` echo "Verify Correct PIDs:" for i in \$pidls; do cat /proc/\$i/cmdline done echo "" echo "RAM Usage:" for i in \$pidls; do dumpsys meminfo | grep \$i | grep sh | grep -m 1 pid done fi SLEEPING=\`cat /sys/power/wait_for_fb_sleep\` if [ "\$SLEEPING" = "sleeping" ]; then exec 1>/data/TrimDropOff/Sleep.log echo "\$(date +"%r %Y.%m.%d"): Trimming, Dropping." echo "/system:" busybox sync fstrim -v /system echo "/data:" busybox sync fstrim -v /data echo "/cache:" busybox sync fstrim -v /cache echo "drop caches:" busybox sync busybox sysctl -w vm.drop_caches=3 fi done } if [ "\`ps | grep -m 1 [a]ndroid\`" ]; then tdo_time else exec > /data/TrimDropOff/Sync_BootErrors.log 2>&1 tdo_time & fi exit 0 EOF } wifi_fstrim_drop(){ cat > /system/etc/init.d/Z99TrimDropOff_Sync << EOF #!/system/bin/sh tdo_time(){ while [ ! "\`ps | grep -m 1 [a]ndroid\`" ]; do sleep 10; done while [ 1 ]; do AWAKE=\`cat /sys/power/wait_for_fb_wake\` if [ "\$AWAKE" = "awake" ]; then exec 1>/data/TrimDropOff/Awake.log svc wifi enable echo "\$(date +"%r %Y.%m.%d"): Waiting for screen to sleep. Confirming script in memory..." echo "PIDs:" pgrep -f TrimDrop pidls=\`pgrep -f TrimDrop\` echo "Verify Correct PIDs:" for i in \$pidls; do cat /proc/\$i/cmdline done echo "" echo "RAM Usage:" for i in \$pidls; do dumpsys meminfo | grep \$i | grep sh | grep -m 1 pid done fi SLEEPING=\`cat /sys/power/wait_for_fb_sleep\` if [ "\$SLEEPING" = "sleeping" ]; then exec 1>/data/TrimDropOff/Sleep.log echo "\$(date +"%r %Y.%m.%d"): Trimming, Dropping, Offing." echo "/system:" busybox sync fstrim -v /system echo "/data:" busybox sync fstrim -v /data echo "/cache:" busybox sync fstrim -v /cache echo "drop caches:" busybox sync busybox sysctl -w vm.drop_caches=3 svc wifi disable fi done } if [ "\`ps | grep -m 1 [a]ndroid\`" ]; then tdo_time else exec > /data/TrimDropOff/Sync_BootErrors.log 2>&1 tdo_time & fi exit 0 EOF } echo "Do you want to sync fstrim, drop_caches=3, and/or" echo "wifi with sleep?" echo "WARNING: This will cause init.d scripts with a" echo "priority lower than Z99 to NOT execute." echo -n "Input es or o: " read TDOsync echo case $TDOsync in y|Y)echo "Which function(s) would you like to sync with sleep?" echo "Input 1 for wifi only, 2 for fstrim only," echo "3 for drop_caches only, 4 for wifi and fstrim" echo "5 for wifi and drop, 6 for fstrim and drop, or" echo -n "7 for all: " read sync_opt echo case $sync_opt in 1)wifi_only;; 2)fstrim_only;; 3)drop_only;; 4)wifi_fstrim;; 5)wifi_drop;; 6)fsrim_drop;; 7)wifi_fstrim_drop;; *)input_error;; esac chmod 755 /system/etc/init.d/Z99TrimDropOff_Sync;; n|N);; *)input_error;; esac only_fstrim(){ cat > /data/TrimDropOff/TrimDropOff_Cron << EOF #!/system/bin/sh # This script was authored by Defiant07 @ xda. Feel free to use it as you see fit, but please give proper credits. # Read Karl Marx. exec 1>/data/TrimDropOff/CronRan.log echo "\$(date +"%r %Y.%m.%d"): Trimming." echo "/system:" busybox sync fstrim -v /system echo "/data:" busybox sync fstrim -v /data echo "/cache:" busybox sync fstrim -v /cache exit 0 EOF } only_drop(){ cat > /data/TrimDropOff/TrimDropOff_Cron << EOF #!/system/bin/sh # This script was authored by Defiant07 @ xda. Feel free to use it as you see fit, but please give proper credits. # Read Karl Marx. exec 1>/data/TrimDropOff/CronRan.log echo "\$(date +"%r %Y.%m.%d"): Dropping." echo "drop caches:" busybox sync busybox sysctl -w vm.drop_caches=3 exit 0 EOF } both_funct(){ cat > /data/TrimDropOff/TrimDropOff_Cron << EOF #!/system/bin/sh # This script was authored by Defiant07 @ xda. Feel free to use it as you see fit, but please give proper credits. # Read Karl Marx. exec 1>/data/TrimDropOff/CronRan.log echo "\$(date +"%r %Y.%m.%d"): Trimming, Dropping." echo "/system:" busybox sync fstrim -v /system echo "/data:" busybox sync fstrim -v /data echo "/cache:" busybox sync fstrim -v /cache echo "drop caches:" busybox sync busybox sysctl -w vm.drop_caches=3 exit 0 EOF } cron_starter(){ cat > /system/etc/init.d/07TrimDropOff_Cron << EOF #!/system/bin/sh # This script was authored by Defiant07 @ xda. Feel free to use it as you see fit, but please give proper credits. # Read Karl Marx. tdo_time(){ while [ ! "\`ps | grep -m 1 [a]ndroid\`" ]; do sleep 10; done crond exec 1>/data/TrimDropOff/CronBoot.log echo "\$(date +"%r %Y.%m.%d"): cron.d service started." echo "PIDs:" pgrep crond pidls=\`pgrep crond\` echo "Verify Correct PIDs:" for i in \$pidls; do cat /proc/\$i/cmdline done echo "" echo "RAM Usage:" for i in \$pidls; do dumpsys meminfo | grep \$i | grep -m 1 crond done } if [ "\`ps | grep -m 1 [a]ndroid\`" ]; then tdo_time else exec > /data/TrimDropOff/Cron_BootErrors.log 2>&1 tdo_time & fi exit 0 EOF } echo "Do you want to run fstrim and/or drop_caches" echo "on a schedule?" echo -n "Input es or o: " read sched_opt echo case $sched_opt in y|Y)echo "Which function do you want to schedule?" echo "Input (f)strim only, (d)rop_caches only," echo -n "or (b)oth: " read funct_opt echo case $funct_opt in f|F)only_fstrim;; d|D)only_drop;; b|B)both_funct;; *)input_error;; esac chmod 755 /data/TrimDropOff/TrimDropOff_Cron echo "Do you want to schedule the function(s)" echo "on an hourly or daily basis?" echo -n "Input (h)ourly or (d)aily: " read sched_opt echo if [ ! -d "/system/etc/cron.d" ]; then mkdir /system/etc/cron.d chmod 755 /system/etc/cron.d fi if [ ! -d "/system/etc/cron.d/crontabs" ]; then mkdir /system/etc/cron.d/crontabs chmod 755 /system/etc/cron.d/crontabs fi cron_starter chmod 755 /system/etc/init.d/07TrimDropOff_Cron case $sched_opt in h|H)echo "Input 1 to run every hour, 2 to run every two hours," echo -n "3 to run every three hours...etc: " read hour_opt echo if [ ! "`echo $hour_opt | awk '!/[^0-9]/'`" ]; then input_error fi if [ -f "/system/etc/cron.d/crontabs/root" ]; then echo "0 */$hour_opt * * * nohup /data/TrimDropOff/TrimDropOff_Cron" >> /system/etc/cron.d/crontabs/root else echo "0 */$hour_opt * * * nohup /data/TrimDropOff/TrimDropOff_Cron" > /system/etc/cron.d/crontabs/root fi chmod 755 /system/etc/cron.d/crontabs/root;; d|D)echo "Input 0 to run at midnight every day," echo "1 to run at 1:00 am...13 to run at 1:00 pm" echo -n "...etc...up to 23: " read daily_opt echo if [ ! "`echo $daily_opt | awk '!/[^0-9]/ && $1<=23'`" ]; then input_error fi if [ -f "/system/etc/cron.d/crontabs/root" ]; then echo "0 $daily_opt * * * nohup /data/TrimDropOff/TrimDropOff_Cron" >> /system/etc/cron.d/crontabs/root else echo "0 $daily_opt * * * nohup /data/TrimDropOff/TrimDropOff_Cron" > /system/etc/cron.d/crontabs/root fi chmod 755 /system/etc/cron.d/crontabs/root;; *)input_error;; esac;; n|N);; *)input_error;; esac cat > /system/xbin/trimdrop << EOF #!/system/bin/sh # This script was authored by Defiant07 @ xda. Feel free to use it as you see fit, but please give proper credits. # Read Karl Marx. clear trimmer(){ echo "/system:" busybox sync fstrim -v /system echo "/data:" busybox sync fstrim -v /data echo "/cache:" busybox sync fstrim -v /cache } dropper(){ echo "drop caches:" busybox sync busybox sysctl -w vm.drop_caches=3 } echo -n "Do you want to run (f)strim, (d)rop_caches=3, or (b)oth? " read funct_opt echo case \$funct_opt in f|F)trimmer;; d|D)dropper;; b|B)trimmer dropper;; *)echo "That is not a valid input...try again...bye ." exit 69;; esac echo echo "All done...enjoy! You can close your app now." exit 0 EOF chmod 755 /system/xbin/trimdrop mount_ro echo "In addition to making the files required by" echo "your desired configuration, I have also made" echo "an on-the-fly script to run fstrim and/or" echo "drop_caches on-demand." echo "To use it, in terminal do: su -c trimdrop" echo sleep 3 echo "Reboot your device to start your desired services." echo sleep 3 echo "If you want to know how to verify everything" echo "is working, read the script's OP (FFS)!" echo sleep 5 echo "All done...enjoy! You can close your app now." exit 0 Click to expand... Click to collapse Changelog: v2.0 made in to installer script added cron options added bootloop precautions to the init.d scripts (should make it compatible with all devices that meet the requirments) the on-the-fly script, trimdrop, now allows user to choose fstrim and/or drop_caches=3 added more syncs to further ensure no data is lost a bunch of other stuff I probably forget v2.1 bug fixes - fixed issue if using only sync option (missing directory); fixed display of irrelevant errors in uninstall routine cleaned code a bit (reduced redundancy) Click to expand... Click to collapse Download History: Defiant07s_TrimDropOff.zip - [Click for QR Code] (1.6 KB, 162 views) Defiant07s_TrimDropOff_v2.0_[NOT_FLASHABLE].zip - [Click for QR Code] (3.0 KB, 89 views) Click to expand... Click to collapse Credits: Big thanks to @zeppelinrox, @dk_zero-cool, & @gu5t3r for their contributions to portions of this script (see the code of my other script SwapItOn for detailed citations). Much thanks to @mdamaged for spotting the issue with sync init.d script and his note regarding syncing data. Click to expand... Click to collapse Don't forget to click THANKS and RATE 5 STARS if you found this useful :highfive:. peep my other script SwapItOn Update to v2.1 if you were only using the sync option. If you were using both the sync and schedule options or only the schedule option there is no need to update; the bug I found would not effect you.
reserved...on the off chance it will be needed
Thanks, sounds interesting. I'm assuming the zip can be flashed right after flashing a new rom?
MidnightDevil said: Thanks, sounds interesting. I'm assuming the zip can be flashed right after flashing a new rom? Click to expand... Click to collapse Not a flashable ZIP per line 2.
AnarchoXen said: Not a flashable ZIP per line 2. Click to expand... Click to collapse Oh, thanks
Is compatible with custom kernel? Franco in my case vía n7II r-paco
Will performing trimming operations too frequently cause additional flash memory degradation?
MidnightDevil said: Thanks, sounds interesting. I'm assuming the zip can be flashed right after flashing a new rom? Click to expand... Click to collapse As you were informed the zip is NOT flashable. If there is sufficient interest (say a 100 downloads) I'll make it flashable/aroma. jordirpz said: Is compatible with custom kernel? Franco in my case vía n7II r-paco Click to expand... Click to collapse Yes, it should be compatible...the fstrim utility is part of the rom (it should be in all nexus 4.3+ roms). creeve4 said: Will performing trimming operations too frequently cause additional flash memory degradation? Click to expand... Click to collapse No, to my limited knowledge it should not be harmful (in fact it should increase lifespan - google "fstrim lifespan"). Did a quick google search but could not find anything definitive/reliable regarding frequency...what I did see seemed to suggest 'no' though. If you are concerned about the frequency, you could not install the init.d script and just use the on-the-fly script, trimdrop, to trim on-demand. Should there be interest and if I have the motivation and time, I have been thinking about making this in to an installer script and/or aroma zip with cron-based options so it could be scheduled hourly, daily, or weekly.
Scheduling options would be awesome!
creeve4 said: Scheduling options would be awesome! Click to expand... Click to collapse +1
creeve4 said: Scheduling options would be awesome! Click to expand... Click to collapse BUBA0071 said: +1 Click to expand... Click to collapse Seems there is a decent amount of interest (almost 100 downloads already ...thanks peeps), as such I'll add options and make things more configurable. Regarding scheduling, I was thinking of doing hourly, daily (with ability to choose time), and weekly (with ability to choose day and time) options. Would every other hour or some other setting be desirable? Regarding installation, what would be the preferred method, an installer script (e.g. V6 SuperCharger) or AROMA? Flashable zips would be another option, but would have less options/be less configurable. Gimme some feedback and I'll put something together in the next week or two depending on work and my motivation .
wasn't this a nexus 7 2012 issue and fixed in the new version 2013?
defiant07 said: Seems there is a decent amount of interest (almost 100 downloads already ...thanks peeps), as such I'll add options and make things more configurable. Regarding scheduling, I was thinking of doing hourly, daily (with ability to choose time), and weekly (with ability to choose day and time) options. Would every other hour or some other setting be desirable? Regarding installation, what would be the preferred method, an installer script (e.g. V6 SuperCharger) or AROMA? Flashable zips would be another option, but would have less options/be less configurable. Gimme some feedback and I'll put something together in the next week or two depending on work and my motivation . Click to expand... Click to collapse My 2 cents: I would choose a daily option for my device. I prefer Aroma over a script, but if you cannot get the customization you want with Aroma, then by all means go with a script. Thanks again for the script and willingness to make it even better!
Thanks for the scripts, I time my startup, and this improved startup time by about 3-4secs, among other noticible improvements, apparently the stock OS does not run fstrim enough, initial operations freed several gigs on the data partition, and hundreds of megs on the others...
creeve4 said: My 2 cents: I would choose a daily option for my device. I prefer Aroma over a script, but if you cannot get the customization you want with Aroma, then by all means go with a script. Thanks again for the script and willingness to make it even better! Click to expand... Click to collapse +1
Im going to turn this into a cron job, that will take care of scheduling, unless anyone else gets there first ( please lol ) Will give it a go in its present form, whats its resource footprint just sitting there waiting for screen off ? Can we trigger the action from the screen off event ? or some other interupt type way ? Great script by the way, your bash is damn site better than mine, jealous lol
KiaraTheDragon said: wasn't this a nexus 7 2012 issue and fixed in the new version 2013? Click to expand... Click to collapse Yes, I think this is true to a degree...it was more of a problem on the 2012 and other nexus devices. See the links in the OP for the conditions that need to be met for fstrim to autorun...for some users (myself included) the conditions will seldom if ever be met. Also see @mdamaged post; I get similar results the first time fstrim is initiated by my script after each boot...subsequent runs normally only frees up memory on /data. creeve4 said: My 2 cents: I would choose a daily option for my device. I prefer Aroma over a script, but if you cannot get the customization you want with Aroma, then by all means go with a script. Thanks again for the script and willingness to make it even better! Click to expand... Click to collapse imfun said: +1 Click to expand... Click to collapse Okay will get to making an AROMA package...it will be my first, but it looks easy enough :fingers-crossed:...gimme a week or two to put it together and fully test. mdamaged said: Thanks for the scripts, I time my startup, and this improved startup time by about 3-4secs, among other noticible improvements, apparently the stock OS does not run fstrim enough, initial operations freed several gigs on the data partition, and hundreds of megs on the others... Click to expand... Click to collapse Thanks for the feedback. I get similar results. jubei_mitsuyoshi said: Im going to turn this into a cron job, that will take care of scheduling, unless anyone else gets there first ( please lol ) Will give it a go in its present form, whats its resource footprint just sitting there waiting for screen off ? Can we trigger the action from the screen off event ? or some other interupt type way ? Great script by the way, your bash is damn site better than mine, jealous lol Click to expand... Click to collapse See the first post on this page and my response to @creeve4 and @imfun in this post. I will make an AROMA package with cron options for fstrim and drop_caches=3. However, should you feel ambitious and beat me to it, props to you...I will give you full credit in the OP and link your post as the d/l source so you should get the 'thanks' too. Regarding triggering with screen on/off or some other event: It can probably be done, but I it's beyond my knowledge (screen on/off was actually the first trigger event I looked in to using, but despite fairly extensive searching I could not find how to detect it). Regarding resource footprint: Read the OP (usage section) it explains where to find the log which contains this info and how to do it via terminal (should you not trust me )...also see OP (benefits section): in all my testing I have never seen it use more that .8 mb, but most of the time it is less than .2 mb.
Okay will get to making an AROMA package...it will be my first, but it looks easy enough :fingers-crossed:...gimme a week or two to put it together and fully test. Click to expand... Click to collapse Can't wait already, because after whole day or two, hard usage of my nexus 7 tablet, the tablet starts to get laggy. I can see this on web browsing, touch press delay time, and onyl rebooting seems to help... Hope after istaling this will solve the problems
ohhh no dont want any credit lol lol, i have turned it into a cron job quite simply by adding it to the cron initilising script Code: ########### # IMPORTS # ########### . /system/etc/init.d.cfg ############# # FUNCTIONS # ############# symlink_system_bin() { # crond has "/bin/sh" hardcoded if busybox [ ! -h /bin ] then mount -o remount,rw rootfs / busybox ln -s /system/bin /bin mount -o remount,ro rootfs / fi } export_timezone() { # set timezone (if you're not between -0500 and -0800 you get PST) # todo - support other timezones timezone=`date +%z` if busybox [ $timezone = "-0800" ]; then TZ=PST8PDT elif busybox [ $timezone = "-0700" ]; then TZ=MST7MDT elif busybox [ $timezone = "-0600" ]; then TZ=CST6CDT elif busybox [ $timezone = "-0500" ]; then TZ=EST5EDT else TZ=PST8PDT fi export TZ } set_crontab() { # use /data/cron, call the crontab file "root" if busybox [ -e /data/cron/root ] then mkdir -p /data/cron cat > /data/cron/root << EOF 0 20 * * * sync; echo 3 > /proc/sys/vm/drop_caches 0 20 * * * sync; fstrim -v /system 0 20 * * * sync; fstrim -v /data 0 20 * * * sync; fstrim -v /cache 01 * * * * busybox run-parts /system/etc/cron/cron.hourly 02 4 * * * busybox run-parts /system/etc/cron/cron.daily 22 4 * * 0 busybox run-parts /system/etc/cron/cron.weekly EOF fi busybox crond -c /data/cron } ######## # MAIN # ######## if $enable_cron -a is_busybox_applet_available crond then symlink_system_bin export_timezone set_crontab fi adding the lines Code: 0 20 * * * sync; echo 3 > /proc/sys/vm/drop_caches 0 20 * * * sync; fstrim -v /system 0 20 * * * sync; fstrim -v /data 0 20 * * * sync; fstrim -v /cache should drop the caches and fstrim every 8 hours, oviously set to anything you want. i also stuck it in boot at the end /system/etc/init.d/92jubei Code: #!/system/bin/sh if $file_system_speedups then busybox mount -o remount,noatime,barrier=0,nobh /system busybox mount -o remount,noatime /data busybox mount -o remount,noatime,barrier=0,nobh /cache else busybox mount -o remount,noatime,nobh /system busybox mount -o remount,noatime /data busybox mount -o remount,noatime,nobh /cache fi echo "$(date +"%r %Y.%m.%d"): Trimming, Dropping." busybox sync echo "/system:" fstrim -v /system echo "/data:" fstrim -v /data echo "/cache:" fstrim -v /cache echo "drop caches:" busybox sysctl -w vm.drop_caches=3 exit 0 For an aroma script you will prob have to stick the file in /system/etc/cron/cron.hourly, daily, weekly and just give peeps that choice, will be most simple way. Ps not a fan of aroma lol
Ok, I should have spotted this issue right away, but did not, so here goes. It seems the use of while loop in the script in the OP causes any scripts with a lower priority in init.d to never get ran, if the script in the OP is the only one in your init.d this does not matter, nor should it matter if you have at boot script with a higher priority (they get ran before the OPs script). I run the ElementalX kernel which depends on a init.d to initialize some parameters for the kernel, with this script in init.d they never get initialized, in my case this resulted in some things not 'taking' such as the battery life extender, which on my device, is set to stop charging at 4100mv, however, since the while loop kept the ElementalX init.d from running, it kept charging to ~4300mv, this is how I noticed (actually none of my settings wrt ElementalX were being initialized, but this symptom was most pronounced). A simple fix would be to move up the priority of the ElementalX init.d script, but this would have to be done after each flash, and frankly since I run Tasker anyway, I saw no need for this, what I did was remove the OPs script from init.d and simply made a very simple task in Tasker to run /system/xbin/trimdrop when display goes off, it could just as easily be a time event. Anyways, hope that helps someone who may come across this with other kernels, or other at-boot scripts which depend on being ran before the OPs script. Again, thanks to the OP for his work. Also, I added another sync just before the drop caches, since the state of dirtyness could change after the fstrims.
[SCRIPT] Helium server PC download - separation
This is simple linux script I've made to separate all apps from one big zip file made by Helium sever -> PC download. Helium wiki says to don't try to do anything with this file, but I didn't want to restore all that stuff that I've backuped before bootloader unlock on my nexus 4. I'm sure it can be writed better, but it's working Just place script file and unziped backup folder (must be named "backup") in one directory. After execution of the script everything should be ready to copying to carbon folder on your sd card/internal memory and restoring like after normal backup. Tested on Ubuntu 14.04. I'm not responsible for data loss or any other problem. Use at your own risk. Constructive criticism welcome. Code: #!/bin/bash DIRECTORY='./backup' if [ -f $DIRECTORY/backup.json ]; then cp $DIRECTORY/backup.json $DIRECTORY/temp.json sed -e "s/{\"packages\"://g" $DIRECTORY/temp.json > $DIRECTORY/temp2.json tr '[]' ' ' < $DIRECTORY/temp2.json | tee $DIRECTORY/temp.json tr '}' '\n' < $DIRECTORY/temp.json | tee $DIRECTORY/temp2.json sed -e "s/,{/{/g" $DIRECTORY/temp2.json > $DIRECTORY/temp.json sed -e 's/^[ \t]*//' $DIRECTORY/temp.json > $DIRECTORY/temp2.json sed '/^$/d' $DIRECTORY/temp2.json > $DIRECTORY/temp.json sed 's/\([^|]\)$/\1}/' $DIRECTORY/temp.json > $DIRECTORY/temp_last.json fi; count=`ls -1 $DIRECTORY/*.ab 2>/dev/null | wc -l` if [ $count != 0 ]; then for i in $DIRECTORY/*.ab ; do AB=$(basename $i) mkdir -p $DIRECTORY/${AB%.*} mv -i $DIRECTORY/$AB $DIRECTORY/${AB%.*}/ if [ -f $DIRECTORY/${AB%.*}.png ]; then mv -i $DIRECTORY/${AB%.*}.png $DIRECTORY/${AB%.*}/._${AB%.*}.png fi; if [ ! -f $DIRECTORY/${AB%.*}/${AB%.*}.json ];then touch $DIRECTORY/${AB%.*}/${AB%.*}.json fi; while read p; do if [[ "$p" =~ "${AB%.*}" ]]; then echo "$p" > $DIRECTORY/${AB%.*}/${AB%.*}.json fi; done <$DIRECTORY/temp_last.json done; fi; rm $DIRECTORY/temp.json rm $DIRECTORY/temp2.json rm $DIRECTORY/temp_last.json exit;
Can somebody help me with this shell script?
Basically what I want to do is convert this into batch script for windows and by using Linux Binaries from Sourceforge create a script that basically does the same thing except it doesnt have to be pushed into my Phone's system it works directly in windows using ADB commands! The script in question looks like this Spoiler: THIS Script Bash: #adb shell mkdir /data/media/0/PartitionImages #adb push .\backupPartitions.sh /data/media/0/PartitionImages/backupPartitions.sh #adb shell chmod 0755 /data/media/0/PartitionImages/backupPartitions.sh #adb shell /data/media/0/PartitionImages/backupPartitions.sh #adb pull /data/media/0/PartitionImages .\PartitionImages max_blocks=102400 names="" compress=0 while getopts "h?bzn:" opt; do case "$opt" in h|\?) echo "Usage $0 [-z] [-b MaxBlocks] [-n partition1 ] [-n partition2 ]" echo " options:" echo "-z optional to tar.gz the output folder default=false" echo "-b 102400 optional maximum number of blocks of the partition - 0 will dump all partitions default=$max_blocks" echo "-n partitionName... optional - one or more partitions to dump" exit 0 ;; z) compress=1 ;; b) max_blocks=$OPTARG ;; n) names+=" $OPTARG" ;; esac done script=$(readlink -f "$0") script_path=$(dirname "$script") serial=$(cat /sys/class/android_usb/f_accessory/device/iSerial) serial_date=$serial/$(date +"%Y_%m_%d_%H_%M_%S") output_path=$script_path/$serial_date echo "********************************" echo "Backup partitions TO $output_path" echo "********************************" mkdir -p $output_path part_dir=$(find /dev/block/platform -name by-name) partitions=$(ls -la $part_dir | awk '{if ( $10 == "->") print $9 ">" $11 }') getprop > $output_path/build.prop echo "Id Name Size MD5" > $output_path/partitions.txt for f in $partitions do part_id=$(echo $f | sed 's/^[^>]*>\/dev\/block\///') part_name=$(echo $f | sed 's/>.*//') size=$(cat /proc/partitions | awk -v p=$part_id '{if ( $4 == p ) print $3}') checksum="0" skip=0 if [ $max_blocks -gt 0 -a $size -gt $max_blocks ] then skip=1 echo "Skipping $part_name Id $part_id due to size" else if [ "$names" -ne "" ] then if echo $names | grep -w $part_name > /dev/null; then skip=0 else skip=1 echo "Skipping $part_name Id $part_id" fi fi fi if [ "$skip" -eq "0" ] then echo "Processing $part_name Id $part_id Size $size"; dd if=/dev/block/$part_id of=$output_path/$part_name.img checksum=$(md5sum -b $output_path/$part_name.img | sed 's/ .*//') fi echo "$part_id $part_name $size $checksum" >> $output_path/partitions.txt done if [ "$compress" -eq "1" ] then cd $script_path tar cz $serial_date > $output_path.tar.gz rm -rf $output_path fi its from an old Xda Dev thread original post and author givitago I tried by guidelines from an "Appendix N. Converting DOS Batch Files to Shell Scripts" from another site to turn the shell script variables into batch script ones but since I got no experience with either of them my attempt turned into an amalgamation of the two's code in one.. Spoiler: it turned Into THIS Code: ::adb shell mkdir /data/media/0/PartitionImages ::adb push .\backupPartitions.sh /data/media/0/PartitionImages/backupPartitions.sh ::adb shell chmod 0755 /data/media/0/PartitionImages/backupPartitions.sh ::adb shell /data/media/0/PartitionImages/backupPartitions.sh ::adb pull /data/media/0/PartitionImages .\PartitionImages %max_blocks==102400 %names=="" %compress==0 while getopts "h?bzn:" opt; do case "$opt" in h|\?) echo "Usage $0 [-z] [-b MaxBlocks] [-n partition1 ] [-n partition2 ]" echo " options:" echo "-z optional to tar.gz the output folder default=false" echo "-b 102400 optional maximum number of blocks of the partition - 0 will dump all partitions default=$max_blocks" echo "-n partitionName... optional - one or more partitions to dump" exit 0 ;; z) compress=1 ;; b) max_blocks=$OPTARG ;; n) names+=" $OPTARG" ;; esac done %script%==%(echo %CD% "%0") %script_path%==(dirname "%script") %serial%==%(adb shell cat /sys/class/android_usb/f_accessory/device/iSerial) %serial_date%==%serial% /%(date +"%Y_%m_%d_%H_%M_%S") %output_path%==%script_path%/%serial_date% echo "********************************" echo "Backup partitions TO $output_path" echo "********************************" mkdir -p %output_path% %part_dir%==%(adb shell find /dev/block/platform -name by-name) %partitions%==%(ls -la %part_dir% | awk '{if ( %10 == "->") print %9 ">" %11 }') adb shell getprop > %output_path%/build.prop echo "Id Name Size MD5" > %output_path%/partitions.txt for %%i in %partitions do %part_id=%(echo %f | sed 's/^[^>]*>\/dev\/block\///') %part_name=%(echo %f | sed 's/>.*//') %size=%(adb shell cat /proc/partitions | awk -v p==%part_id% '{if ( %4 == p ) print %3}') checksum="0" skip==0 if [ %max_blocks -gt 0 -a %size -gt %max_blocks ] then skip=1 echo "Skipping %part_name% Id %part_id% due to size" else if [ "%names" -ne "" ] then if echo %names | grep -w %part_name% > /dev/null; then skip==0 else skip==1 echo "Skipping %part_name% Id %part_id%" fi fi fi if [ "$skip" -eq "0" ] then echo "Processing %part_name% Id %part_id% Size %size"; 'adb shell pull' /dev/block/%part_id% %output_path%/%part_name%.img checksum==%(md5sum -b %output_path%/%part_name%.img | sed 's/ .*//') fi echo "%part_id% %part_name% %size %checksum" >> %output_path%/partitions.txt done if [ "%compress" -eq "1" ] then cd %script_path% tar cz %serial_date% > %output_path%.tar.gz rm -rf %output_path% fi additionally I have pretty much all linux commands's binaries on the same folder as the .bat script so as long as the syntax is correct and nothing finniky going on it should work technically but since I got no experience I can't do this on my own...
You may use the DOS script used here [TOOL][ADB][WIN]Android Partitions Backupper / Cloner Hi all, wrote a Windows CMD script that backups / clones partitions of an Android device via ADB because I wasn't content with any 3rd-party APK what claims to do this job. The backups /clones are stored on Windows computer as... forum.xda-developers.com as a template.
jwoegerbauer said: You may use the DOS script used here [TOOL][ADB][WIN]Android Partitions Backupper / Cloner Hi all, wrote a Windows CMD script that backups / clones partitions of an Android device via ADB because I wasn't content with any 3rd-party APK what claims to do this job. The backups /clones are stored on Windows computer as... forum.xda-developers.com as a template. Click to expand... Click to collapse I have tried that script itself and it failed at "DM-Verity" and SELinux enforcement also for some reason no logs at all in temp folder