diff --git a/META-INF/com/google/android/updater-script b/META-INF/com/google/android/updater-script index 2b2d59a..0c980cc 100644 --- a/META-INF/com/google/android/updater-script +++ b/META-INF/com/google/android/updater-script @@ -1,18 +1,33 @@ -ui_print("AnyKernel Updater by Koush."); -ui_print("Extracting System Files..."); -set_progress(1.000000); -mount("MTD", "system", "/system"); -package_extract_dir("system", "/system"); +show_progress(1.34, 4); +ui_print(""); +assert(package_extract_dir("", "/tmp/anykernel")); +ui_print(file_getprop("/tmp/anykernel/anykernel.sh", "kernel.string")); +ui_print(""); +ui_print("AnyKernel Script by osm0sis @ xda-developers"); +ui_print(""); +run_program("/sbin/busybox", "mount", "/system"); +ifelse(file_getprop("/tmp/anykernel/anykernel.sh", "do.devicecheck") == 1, + (ui_print("Checking device..."); + ui_print(""); + assert(getprop("ro.product.device") == file_getprop("/tmp/anykernel/anykernel.sh", "device.name1") || getprop("ro.build.product") == file_getprop("/tmp/anykernel/anykernel.sh", "device.name1") || + getprop("ro.product.device") == file_getprop("/tmp/anykernel/anykernel.sh", "device.name2") || getprop("ro.build.product") == file_getprop("/tmp/anykernel/anykernel.sh", "device.name2") || + getprop("ro.product.device") == file_getprop("/tmp/anykernel/anykernel.sh", "device.name3") || getprop("ro.build.product") == file_getprop("/tmp/anykernel/anykernel.sh", "device.name3")); + ) +); +ifelse(file_getprop("/tmp/anykernel/anykernel.sh", "do.initd") == 1, + (ui_print("Creating init.d..."); + ui_print(""); + run_program("/sbin/sh", "-c", "mkdir /system/etc/init.d"); + set_perm_recursive(0, 0, 0755, 0755, "/system/etc/init.d"); + ) +); unmount("/system"); -ui_print("Extracting Kernel files..."); -package_extract_dir("kernel", "/tmp"); ui_print("Installing kernel..."); -set_perm(0, 0, 0777, "/tmp/dump_image"); -set_perm(0, 0, 0777, "/tmp/mkbootimg.sh"); -set_perm(0, 0, 0777, "/tmp/mkbootimg"); -set_perm(0, 0, 0777, "/tmp/unpackbootimg"); -run_program("/tmp/dump_image", "boot", "/tmp/boot.img"); -run_program("/tmp/unpackbootimg", "/tmp/boot.img", "/tmp/"); -run_program("/tmp/mkbootimg.sh"); -write_raw_image("/tmp/newboot.img", "boot"); +assert(run_program("/sbin/sh", "/tmp/anykernel/anykernel.sh")); +ifelse(file_getprop("/tmp/anykernel/anykernel.sh", "do.cleanup") == 1, + (delete_recursive("/tmp/anykernel"); + ) +); +ui_print(""); ui_print("Done!"); + diff --git a/README b/README new file mode 100644 index 0000000..edca8f8 --- /dev/null +++ b/README @@ -0,0 +1,55 @@ +AnyKernel 2.0 - CWM Zip Template for Kernel Releases with Ramdisk Modifications +by osm0sis @ xda-developers + +"AnyKernel is a template for an update.zip that can apply any kernel to any ROM, regardless of ramdisk." - Koush + +AnyKernel 2.0 pushes the format even further by allowing kernel developers to modify the underlying ramdisk for kernel feature support easily using a number of included command methods along with properties and variables. + +A working script based on DirtyV Kernel for Galaxy Nexus (tuna) is included for reference. + +// Properties / Variables + +kernel.string=KernelName by YourName @ xda-developers +do.initd=1 +do.devicecheck=1 +do.cleanup=1 +device.name1=maguro +device.name2=toro +device.name3=toroplus +block=/dev/block/platform/omap/omap_hsmmc.0/by-name/boot; + +do.initd=1 will create the init.d directory in /system/etc/init.d/ and apply 755 permissions. + +do.devicecheck=1 specified requires at least device.name1 to be present. This should match ro.product.device or ro.build.product for your device. + +do.cleanup=0 will keep the zip from removing it's working directory in /tmp/anykernel - this can be useful if trying to debug in adb shell whether the patches worked correctly. + +// Command Methods + +dump_boot +backup_file +replace_string +insert_line +replace_line +prepend_file +append_file +replace_file +write_boot + +"if search string" is the string it looks for to decide whether it needs to add the tweak or not, so generally something to indicate the tweak already exists. + +Similarly, "line before string" and "line replace string" are the search strings that locate where the modification needs to be made for those commands. + +// Instructions + +1- Place zImage in the in the root +2- Place any required ramdisk files in /ramdisk +3- Place any required patch files (partial files which go with commands) in /patch +4- Modify the anykernel.sh to add your kernel's name, boot partition location, and methods for any required ramdisk modifications. +5- zip -r9 your.zip * + +Not required, but any tweaks you can't hardcode into the source should be added with a bootscript.sh like is done in the example provided. + + +Have fun! + diff --git a/anykernel.sh b/anykernel.sh old mode 100644 new mode 100755 index a727217..d17023c --- a/anykernel.sh +++ b/anykernel.sh @@ -1,6 +1,137 @@ -#!/sbin/sh -echo \#!/sbin/sh > /tmp/createnewboot.sh -echo /tmp/mkbootimg --kernel /tmp/zImage --ramdisk /tmp/boot.img-ramdisk.gz --cmdline \"$(cat /tmp/boot.img-cmdline)\" --base $(cat /tmp/boot.img-base) --output /tmp/newboot.img >> /tmp/createnewboot.sh -chmod 777 /tmp/createnewboot.sh -/tmp/createnewboot.sh -return $? \ No newline at end of file +# AnyKernel 2.0 Ramdisk Mod Script +# osm0sis @ xda-developers + +## AnyKernel setup +# EDIFY properties +kernel.string=DirtyV by bsmitty83 @ xda-developers +do.initd=1 +do.devicecheck=1 +do.cleanup=1 +device.name1=maguro +device.name2=toro +device.name3=toroplus + +# shell variables +block=/dev/block/platform/omap/omap_hsmmc.0/by-name/boot; + +## end setup + + +## AnyKernel methods (DO NOT CHANGE) +# set up extracted files and directories +ramdisk=/tmp/anykernel/ramdisk; +bin=/tmp/anykernel/tools; +split_img=/tmp/anykernel/split_img; +patch=/tmp/anykernel/patch; + +cd $ramdisk; +chmod -R 644 $ramdisk +chmod -R 755 $bin $ramdisk/sbin; +mkdir -p $split_img; + +# dump boot and extract ramdisk +dump_boot() { + dd if=$block of=/tmp/anykernel/boot.img; + $bin/unpackbootimg -i /tmp/anykernel/boot.img -o $split_img; + gunzip -c $split_img/boot.img-ramdisk.gz | cpio -i; +} + +# repack ramdisk then build and write image +write_boot() { + find . | cpio -o -H newc | gzip > /tmp/anykernel/ramdisk-new.cpio.gz; + if [ ! -z `cat $split_img/boot.img-cmdline` ]; then + cmdline="--cmdline `cat $split_img/boot.img-cmdline`"; + fi; + $bin/mkbootimg --kernel /tmp/anykernel/zImage --ramdisk /tmp/anykernel/ramdisk-new.cpio.gz $cmdline --base 0x`cat $split_img/boot.img-base` --pagesize `printf "%d\n" 0x$(cat $split_img/boot.img-pagesize)` --output /tmp/anykernel/boot-new.img; + dd if=/tmp/anykernel/boot-new.img of=$block; +} + +# backup_file +backup_file() { cp $1 $1~; } + +# replace_string +replace_string() { + if [ -z "$(grep "$2" $1)" ]; then + sed -i "s;${3};${4};" $1; + fi; +} + +# insert_line +insert_line() { + if [ -z "$(grep "$2" $1)" ]; then + line=$((`grep -n "$3" $1 | cut -d: -f1` + 1)); + sed -i $line"s;^;${4};" $1; + fi; +} + +# replace_line +replace_line() { + if [ ! -z "$(grep "$2" $1)" ]; then + line=`grep -n "$2" $1 | cut -d: -f1`; + sed -i $line"s;.*;${3};" $1; + fi; +} + +# prepend_file +prepend_file() { + if [ -z "$(grep "$2" $1)" ]; then + echo "$(cat $patch/$3 $1)" > $1; + fi; +} + +# append_file +append_file() { + if [ -z "$(grep "$2" $1)" ]; then + echo -ne "\n" >> $1; + cat $patch/$3 >> $1; + echo -ne "\n" >> $1; + fi; +} + +# replace_file +replace_file() { + cp -fp $patch/$3 $1; + chmod $2 $1; +} + +## end methods + + +## AnyKernel install +dump_boot; + +# begin ramdisk changes + +# init.rc +backup_file init.rc; +replace_string init.rc "cpuctl cpu,timer_slack" "mount cgroup none /dev/cpuctl cpu" "mount cgroup none /dev/cpuctl cpu,timer_slack"; +append_file init.rc "run-parts" init; + +# init.tuna.rc +backup_file init.tuna.rc; +insert_line init.tuna.rc "nodiratime barrier=0" "mount_all /fstab.tuna" "\tmount ext4 /dev/block/platform/omap/omap_hsmmc.0/by-name/userdata /data remount nosuid nodev noatime nodiratime barrier=0\n"; +append_file init.tuna.rc "dvbootscript" init.tuna; + +# init.superuser.rc +if [ -f init.superuser.rc ]; then + backup_file init.superuser.rc; + replace_string init.superuser.rc "Superuser su_daemon" "# su daemon" "\n# Superuser su_daemon"; + prepend_file init.superuser.rc "SuperSU daemonsu" init.superuser; +else + replace_file init.superuser.rc 750 init.superuser.rc; + insert_line init.rc "init.superuser.rc" "on post-fs-data" " import /init.superuser.rc\n\n"; +fi; + +# fstab.tuna +backup_file fstab.tuna; +replace_line fstab.tuna "/by-name/system" "/dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 nodev,noatime,nodiratime,barrier=0,data=writeback,noauto_da_alloc,discard wait"; +replace_line fstab.tuna "/by-name/cache" "/dev/block/platform/omap/omap_hsmmc.0/by-name/cache /cache ext4 nosuid,nodev,noatime,nodiratime,errors=panic,barrier=0,nomblk_io_submit,data=writeback,noauto_da_alloc wait,check"; +replace_line fstab.tuna "/by-name/userdata" "/dev/block/platform/omap/omap_hsmmc.0/by-name/userdata /data ext4 nosuid,nodev,noatime,errors=panic,nomblk_io_submit,data=writeback,noauto_da_alloc wait,check,encryptable=/dev/block/platform/omap/omap_hsmmc.0/by-name/metadata"; +append_file fstab.tuna "usbdisk" fstab; + +# end ramdisk changes + +write_boot; + +## end install + diff --git a/patch/fstab b/patch/fstab new file mode 100644 index 0000000..d6c9449 --- /dev/null +++ b/patch/fstab @@ -0,0 +1,2 @@ +# USB storage device +/devices/platform/omap/musb-omap2430/musb-hdrc auto auto defaults voldmanaged=usbdisk:auto diff --git a/patch/init b/patch/init new file mode 100644 index 0000000..c375fef --- /dev/null +++ b/patch/init @@ -0,0 +1,4 @@ +# Execute files in /system/etc/init.d before booting +service run-parts /sbin/bb/busybox run-parts /system/etc/init.d + class main + oneshot diff --git a/patch/init.superuser b/patch/init.superuser new file mode 100644 index 0000000..1f9da98 --- /dev/null +++ b/patch/init.superuser @@ -0,0 +1,5 @@ +# SuperSU daemonsu +service daemonsu /system/xbin/daemonsu --auto-daemon + user root + group root + diff --git a/patch/init.superuser.rc b/patch/init.superuser.rc new file mode 100644 index 0000000..fc6b6a2 --- /dev/null +++ b/patch/init.superuser.rc @@ -0,0 +1,20 @@ +# SuperSU daemonsu +service daemonsu /system/xbin/daemonsu --auto-daemon + user root + group root + +# Superuser su_daemon +service su_daemon /system/xbin/su --daemon + oneshot + +on property:persist.sys.root_access=0 + stop su_daemon + +on property:persist.sys.root_access=2 + stop su_daemon + +on property:persist.sys.root_access=1 + start su_daemon + +on property:persist.sys.root_access=3 + start su_daemon diff --git a/patch/init.tuna b/patch/init.tuna new file mode 100644 index 0000000..e3853c5 --- /dev/null +++ b/patch/init.tuna @@ -0,0 +1,5 @@ +service dvbootscript /sbin/dvbootscript.sh + class main + user root + group root + oneshot diff --git a/ramdisk/sbin/bb/busybox b/ramdisk/sbin/bb/busybox new file mode 100755 index 0000000..b319cfc Binary files /dev/null and b/ramdisk/sbin/bb/busybox differ diff --git a/ramdisk/sbin/dvbootscript.sh b/ramdisk/sbin/dvbootscript.sh new file mode 100755 index 0000000..d4853be --- /dev/null +++ b/ramdisk/sbin/dvbootscript.sh @@ -0,0 +1,146 @@ +#!/system/bin/sh +# portions from franciscofranco, ak, boype & osm0sis + Franco's Dev Team + +# custom busybox installation shortcut +bb=/sbin/bb/busybox; + +# disable sysctl.conf to prevent ROM interference with tunables +$bb mount -o rw,remount /system; +$bb [ -e /system/etc/sysctl.conf ] && $bb mv -f /system/etc/sysctl.conf /system/etc/sysctl.conf.dvbak; + +# disable the PowerHAL since there is now a kernel-side touch boost implemented +$bb [ -e /system/lib/hw/power.tuna.so.dvbak ] || $bb cp /system/lib/hw/power.tuna.so /system/lib/hw/power.tuna.so.dvbak; +$bb [ -e /system/lib/hw/power.tuna.so ] && $bb rm -f /system/lib/hw/power.tuna.so; + +# backup and replace Host AP Daemon for working Wi-Fi tether on 3.4 kernel Wi-Fi drivers +$bb [ -e /system/bin/hostapd.dvbak ] || $bb cp /system/bin/hostapd /system/bin/hostapd.dvbak; +$bb cp -f /sbin/hostapd /system/bin/; +$bb chown root.shell /system/bin/hostapd; +$bb chmod 755 /system/bin/hostapd; + +# backup and replace Media Codec Profiles if on SR builds, restore if not, and push init.d script for other kernels +case `uname -r` in + *DirtyV-SR|*SmittyV) + $bb [ -e /system/etc/media_profiles.xml.dvbak ] || $bb cp /system/etc/media_profiles.xml /system/etc/media_profiles.xml.dvbak; + $bb cp -f /sbin/media_profiles.xml /system/etc/; + $bb chmod 644 /system/etc/media_profiles.xml;; + *) + $bb [ -e /system/etc/media_profiles.xml.dvbak ] && $bb mv -f /system/etc/media_profiles.xml.dvbak /system/etc/media_profiles.xml; + $bb chmod 644 /system/etc/media_profiles.xml;; +esac; +$bb cp -f /sbin/dvmediarevert /system/etc/init.d/; +$bb chmod 755 /system/etc/init.d/dvmediarevert; + +# create and set permissions for /system/etc/init.d if it doesn't already exist +if [ ! -e /system/etc/init.d ]; then + $bb mkdir /system/etc/init.d; + $bb chown -R root.root /system/etc/init.d; + $bb chmod -R 755 /system/etc/init.d; +fi; +$bb mount -o ro,remount /system; + +# fix permissions for any included governors (and older underlying ramdisks) +governor=reset; +while sleep 1; do + current=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor`; + if [ $governor != $current ]; then + governor=$current; + for i in /sys/devices/system/cpu/cpufreq/*; do + $bb chown system:system $i/*; + $bb chmod 664 $i/*; + done; + fi; +done& + +# disable debugging +echo 0 > /sys/module/wakelock/parameters/debug_mask; +echo 0 > /sys/module/userwakelock/parameters/debug_mask; +echo 0 > /sys/module/earlysuspend/parameters/debug_mask; +echo 0 > /sys/module/alarm/parameters/debug_mask; +echo 0 > /sys/module/alarm_dev/parameters/debug_mask; +echo 0 > /sys/module/binder/parameters/debug_mask; + +# suitable configuration to help reduce network latency +echo 2 > /proc/sys/net/ipv4/tcp_ecn; +echo 1 > /proc/sys/net/ipv4/tcp_sack; +echo 1 > /proc/sys/net/ipv4/tcp_dsack; +echo 1 > /proc/sys/net/ipv4/tcp_low_latency; +echo 1 > /proc/sys/net/ipv4/tcp_timestamps; + +# reduce txqueuelen to 0 to switch from a packet queue to a byte one +for i in /sys/class/net/*; do + echo 0 > $i/tx_queue_len; +done; + +# initialize timer slack +echo 100000000 > /dev/cpuctl/apps/bg_non_interactive/timer_slack.min_slack_ns; + +# decrease fs lease time +echo 10 > /proc/sys/fs/lease-break-time; + +# tweak for slightly larger kernel entropy pool +echo 128 > /proc/sys/kernel/random/read_wakeup_threshold; +echo 256 > /proc/sys/kernel/random/write_wakeup_threshold; + +# disable ASLR +echo 0 > /proc/sys/kernel/randomize_va_space; + +# double the default minfree kb +echo 2884 > /proc/sys/vm/min_free_kbytes; + +# general queue tweaks +for i in /sys/block/*/queue; do + echo 512 > $i/nr_requests; + echo 512 > $i/read_ahead_kb; + echo 2 > $i/rq_affinity; + echo 0 > $i/nomerges; + echo 0 > $i/add_random; + echo 0 > $i/rotational; +done; + +# remount sysfs+sdcard with noatime,nodiratime since that's all they accept +$bb mount -o remount,nosuid,nodev,noatime,nodiratime -t auto /; +$bb mount -o remount,nosuid,nodev,noatime,nodiratime -t auto /proc; +$bb mount -o remount,nosuid,nodev,noatime,nodiratime -t auto /sys; +$bb mount -o remount,nosuid,nodev,noatime,nodiratime -t auto /sys/kernel/debug; +$bb mount -o remount,nosuid,nodev,noatime,nodiratime -t auto /mnt/shell/emulated; +for i in /storage/emulated/*; do + $bb mount -o remount,nosuid,nodev,noatime,nodiratime -t auto $i; + $bb mount -o remount,nosuid,nodev,noatime,nodiratime -t auto $i/Android/obb; +done; + +# lmk tweaks for fewer empty background processes +minfree=6144,8192,12288,16384,24576,40960; +lmk=/sys/module/lowmemorykiller/parameters/minfree; +minboot=`cat $lmk`; +while sleep 1; do + if [ `cat $lmk` != $minboot ]; then + [ `cat $lmk` != $minfree ] && echo $minfree > $lmk || exit; + fi; +done& + +# wait for systemui and increase its priority +while sleep 1; do + if [ `$bb pidof com.android.systemui` ]; then + systemui=`$bb pidof com.android.systemui`; + $bb renice -18 $systemui; + $bb echo -17 > /proc/$systemui/oom_adj; + $bb chmod 100 /proc/$systemui/oom_adj; + exit; + fi; +done& + +# lmk whitelist for common launchers and increase launcher priority +list="com.android.launcher com.google.android.googlequicksearchbox org.adw.launcher org.adwfreak.launcher net.alamoapps.launcher com.anddoes.launcher com.android.lmt com.chrislacy.actionlauncher.pro com.cyanogenmod.trebuchet com.gau.go.launcherex com.gtp.nextlauncher com.miui.mihome2 com.mobint.hololauncher com.mobint.hololauncher.hd com.qihoo360.launcher com.teslacoilsw.launcher com.tsf.shell org.zeam"; +while sleep 60; do + for class in $list; do + if [ `$bb pgrep $class | head -n 1` ]; then + launcher=`$bb pgrep $class`; + $bb echo -17 > /proc/$launcher/oom_adj; + $bb chmod 100 /proc/$launcher/oom_adj; + $bb renice -18 $launcher; + fi; + done; + exit; +done& + diff --git a/ramdisk/sbin/dvmediarevert b/ramdisk/sbin/dvmediarevert new file mode 100755 index 0000000..2c7d4c3 --- /dev/null +++ b/ramdisk/sbin/dvmediarevert @@ -0,0 +1,17 @@ +#!/system/bin/sh +# chmod -R 755 /system/etc/init.d +# osm0sis @ xda-developers + +# restore media_profiles.xml, power.tuna.so and hostapd if switching to another kernel from DirtyV +busybox mount -o rw,remount /system; +case `uname -r` in + *DirtyV*|*SmittyV) ;; + *) [ -e /system/etc/media_profiles.xml.dvbak ] && mv /system/etc/media_profiles.xml.dvbak /system/etc/media_profiles.xml; + [ -e /system/lib/hw/power.tuna.so.dvbak ] && mv /system/lib/hw/power.tuna.so.dvbak /system/lib/hw/power.tuna.so; + [ -e /system/bin/hostapd.dvbak ] && mv /system/bin/hostapd.dvbak /system/bin/hostapd; + [ -e /system/etc/media_profiles.xml.dvbak -o -e /system/lib/hw/power.tuna.so.dvbak -o -e /system/bin/hostapd.dvbak ] || rm -f /system/etc/init.d/dvmediarevert; + chmod 644 /system/etc/media_profiles.xml /system/lib/hw/power.tuna.so; + chmod 755 /system/bin/hostapd;; +esac; +busybox mount -o ro,remount /system; + diff --git a/ramdisk/sbin/hostapd b/ramdisk/sbin/hostapd new file mode 100755 index 0000000..e7499b6 Binary files /dev/null and b/ramdisk/sbin/hostapd differ diff --git a/ramdisk/sbin/media_profiles.xml b/ramdisk/sbin/media_profiles.xml new file mode 100644 index 0000000..1bc4e35 --- /dev/null +++ b/ramdisk/sbin/media_profiles.xml @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/mkbootimg b/tools/mkbootimg index 0b4e1e9..5b90622 100755 Binary files a/tools/mkbootimg and b/tools/mkbootimg differ diff --git a/tools/unpackbootimg b/tools/unpackbootimg index f1ef552..25ac61d 100755 Binary files a/tools/unpackbootimg and b/tools/unpackbootimg differ diff --git a/zImage b/zImage index c1eb9c1..ad5057d 100644 Binary files a/zImage and b/zImage differ