2 # run/kill Android from Linux, the hackjob script
3 # (c) Grazvydas "notaz" Ignotas, 2012
6 if [ "`id -u`" != "0" ]; then
7 # gksudo causes logging not to work somehow..
8 # so use it to only ask for password, use sudo to re-run the script
9 gksudo -m "Android needs root privileges to run, please enter your password" id
18 trap onexit INT QUIT TERM EXIT
23 zenity --error --text "$1"
31 list="/sbin/ueventd /system/bin/logcat /system/bin/sh /system/bin/servicemanager
32 /system/bin/vold /system/bin/netd /system/bin/rild /system/bin/installd /sbin/adbd
33 /system/bin/mediaserver /system/bin/keystore /system/bin/debuggerd
34 /system/bin/dbus-daemon"
37 p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'`
38 test -n "$p" && echo kill $p $pr && kill $p
42 p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'`
43 test -n "$p" && echo kill -9 $p $pr && kill -9 $p
45 list2=`ps ax | grep -v grep | grep -e ':.. /system/' -e ':.. /data/' -e ' android\.' | awk '{print $1}'`
46 list3=`lsof | grep '/dev/binder' | awk '{print $2}' | uniq`
47 for p in $list2 $list3; do
48 test -n "$p" && echo kill $p && kill $p
54 sdmounts=`grep -e '\.android_secure' -e 'secure/asec' -e 'mnt/sdcard' /proc/mounts`
55 if [ -n "$sdmounts" ]; then
56 echo "$sdmounts" | awk '{print $2}' | xargs umount
59 omounts=`grep "$root/" /proc/mounts | awk '{print $2}'`
60 if [ -n "$omounts" ]; then
74 if ! pidof X > /dev/null; then
75 # need to restore SGX, X and friends
76 rmmod bufferclass_ti omaplfb pvrsrvkm
77 /etc/init.d/pvr-init start
78 rmmod wl1251_sdio # hmh
79 /etc/init.d/NetworkManager start
80 /etc/init.d/slim-init start
83 if ! ps a | grep -q 'pnd_run.*run_gingerbread.sh'; then
84 # something killed pnd_run, have to clean up for it
85 cat > /tmp/clean_android.sh <<EOF
90 umount $mpoint_main # needed twice??
91 losetup -a | awk -F ':' '{ print \$1 }' | xargs losetup -d 2> /dev/null
95 chmod +x /tmp/clean_android.sh
96 /tmp/clean_android.sh &
103 # logger, binder and ashmem
105 if ! test -e /dev/log_events; then
109 if ! test -e /dev/binder; then
113 if ! test -e /dev/ashmem; then
118 if test ! -e /dev/log_events -o ! -e /dev/binder -o ! -e /dev/ashmem; then
119 err "could not load required Android modules,\n\
120 perhaps you are running unsupported\nfirmware/kernel."
124 if ! test -e rootfs.ext2; then
125 if ! cp -v pandora/default_rootfs.ext2 rootfs.ext2; then
126 err "file copy failed, not enough space?"
131 if ! test -e data.ext4; then
132 size=`zenity --entry --text="\
133 Android needs a partition to store it's data and installed programs.\n\
134 This will be stored in preallocated file of size that you have to select now.\n\
135 Android documentation recommends at least 150MB, going below 50MB will cause\n\
136 problems, as well as over 2GB if you are running from FAT partitioned card.\n\n\
137 Please select size of Android data partition (in megabytes):\n\
138 (creation may take several minutes after you press OK)" \
140 if test -z "$size" || ! dd if=/dev/zero of=data.ext4 bs=1M count=$size; then
141 err "failed to create file, not enough space? bad input?"
144 if ! mkfs.ext4 -O ^has_journal -m 0 -F data.ext4; then
145 err "failed to create filesystem"
150 if ! fsck.ext4 -y data.ext4 || ! fsck.ext2 -y rootfs.ext2; then
151 if [ "$?" -ge "4" ]; then
152 err "file corruption detected, try clearing appdata."
158 mount -o loop,rw,noatime rootfs.ext2 $root
159 mount --bind $mpoint_main/system/ $root/system/
160 mount -o loop,rw,noatime data.ext4 $root/data
162 mkdir -p $root/vendor/
165 mkdir -p $root/vendor/pvr
166 echo "0 0 android" > $root/vendor/pvr/egl.cfg
168 # load the right SGX driver
169 sgx_kernel_loaded=false
170 if ! grep -q '1.5.15.2766' /proc/pvr/version 2> /dev/null; then
171 echo have to change SGX kernel driver
172 /etc/init.d/pvr-init stop || true
173 if test -d $mpoint_main/pandora/pvr/$kernel_ver; then
174 # found with this android release
175 pvrbase=$mpoint_main/pandora/pvr/$kernel_ver
176 elif test -d /lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766; then
178 pvrbase=/lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766
181 if [ "x$pvrbase" != "x" ]; then
182 if insmod $pvrbase/pvrsrvkm.ko && insmod $pvrbase/omaplfb.ko; then
183 sgx_kernel_loaded=true
185 insmod $pvrbase/bufferclass_ti.ko || true
189 sgx_kernel_loaded=true
194 if $sgx_kernel_loaded; then
195 es=`cat /etc/powervr-esrev`
196 if [ "x$es" = "x" ]; then
197 err "unable to determine SGX version"
200 # for some braindead reason 103 is named 121 too
202 if [ "$es" = "es5" ]; then
205 ln -fs /system/lib/$es/libGLESv2_POWERVR_SGX530_121.so $root/vendor/pvr/
206 ln -fs /system/lib/$es/libGLESv1_CM_POWERVR_SGX530_121.so $root/vendor/pvr/
208 ln -fs /system/bin/$es/pvrsrvinit $root/vendor/pvr/
209 ln -fs /system/lib/$es/libPVRScopeServices.so $root/vendor/pvr/
210 ln -fs /system/lib/$es/libglslcompiler.so $root/vendor/pvr/
211 ln -fs /system/lib/$es/libsrv_um.so $root/vendor/pvr/
212 ln -fs /system/lib/$es/libIMGegl.so $root/vendor/pvr/
214 echo "0 1 POWERVR_SGX530_$sgx_ver" >> $root/vendor/pvr/egl.cfg
219 if ! $sgx_user_ready; then
220 err "SGX driver load failed, no 3D support"
223 # stop X and interfering things, get wifi ready
225 if pidof xfce4-session > /dev/null; then
226 user=`cat /tmp/currentuser`
227 # most often doesn't work :(
228 #if ! test -z "$user"; then
229 # su -c 'xfce4-session-logout --logout' $user
232 /etc/init.d/NetworkManager stop
234 /etc/init.d/wl1251-init start
235 /etc/init.d/slim-init stop
236 sleep 1 # for wlan0, hmh..
237 chvt 2 & # may hang..
239 killall chvt 2> /dev/null || true
243 cp -v /etc/pointercal $root/vendor/
244 cp -v /lib/modules/$kernel_ver/kernel/drivers/net/wireless/wl1251/wl1251_sdio.ko $root/vendor/
245 mkdir -p $root/vendor/firmware
246 cp -v /lib/firmware/brf6300.bin $root/vendor/firmware/
249 rm -rf $root/acct/uid/*
257 if nc -V 2> /dev/null | grep -q GNU; then
258 # GNU nc always fails
259 msg=`nc -l -p 36936 localhost || true`
261 msg=`nc -l localhost 36936`
263 if [ "x$msg" = "xquit" ]; then
266 echo "unknown message: $msg"
269 # real init can't be killed this way
272 # done, run exit handler indirectly