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
17 last_pnd_version=`cat $mpoint_main/last_pnd_version || true`
20 trap onexit INT QUIT TERM EXIT
25 zenity --error --text "$1"
33 list="/sbin/ueventd /system/bin/logcat /system/bin/sh /system/bin/servicemanager
34 /system/bin/vold /system/bin/netd /system/bin/rild /system/bin/installd /sbin/adbd
35 /system/bin/mediaserver /system/bin/keystore /system/bin/debuggerd
36 /system/bin/dbus-daemon"
39 p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'`
40 test -n "$p" && echo kill $p $pr && kill $p
44 p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'`
45 test -n "$p" && echo kill -9 $p $pr && kill -9 $p
47 list2=`ps ax | grep -v grep | grep -e ':.. /system/' -e ':.. /data/' -e ' android\.' | awk '{print $1}'`
48 list3=`lsof | grep '/dev/binder' | awk '{print $2}' | uniq`
49 for p in $list2 $list3; do
50 test -n "$p" && echo kill $p && kill $p
56 sdmounts=`grep -e '\.android_secure' -e 'secure/asec' -e 'mnt/sdcard' /proc/mounts`
57 if [ -n "$sdmounts" ]; then
58 echo "$sdmounts" | awk '{print $2}' | xargs umount
61 omounts=`grep "$root/" /proc/mounts | awk '{print $2}'`
62 if [ -n "$omounts" ]; then
76 if ! pidof X > /dev/null; then
77 # need to restore SGX, X and friends
78 rmmod bufferclass_ti omaplfb pvrsrvkm
79 /etc/init.d/pvr-init start
80 rmmod wl1251_sdio # hmh
81 /etc/init.d/NetworkManager start
82 /etc/init.d/slim-init start
85 if ! ps a | grep -q 'pnd_run.*run_gingerbread.sh'; then
86 # something killed pnd_run, have to clean up for it
87 cat > /tmp/clean_android.sh <<EOF
92 umount $mpoint_main # needed twice??
93 losetup -a | awk -F ':' '{ print \$1 }' | xargs losetup -d 2> /dev/null
97 chmod +x /tmp/clean_android.sh
98 /tmp/clean_android.sh &
105 # logger, binder and ashmem
107 if ! test -e /dev/log_events; then
111 if ! test -e /dev/binder; then
115 if ! test -e /dev/ashmem; then
120 if test ! -e /dev/log_events -o ! -e /dev/binder -o ! -e /dev/ashmem; then
121 err "could not load required Android modules,\n\
122 perhaps you are running unsupported\nfirmware/kernel."
126 if test "x$last_pnd_version" != "x$pnd_version"; then
127 echo "version changed from $last_pnd_version to $pnd_version"
129 echo "$pnd_version" > $mpoint_main/last_pnd_version
132 if ! test -e rootfs.ext2; then
133 if ! cp -v pandora/default_rootfs.ext2 rootfs.ext2; then
134 err "file copy failed, not enough space?"
139 if ! test -e data.ext4; then
140 size=`zenity --entry --text="\
141 Android needs a partition to store it's data and installed programs.\n\
142 This will be stored in preallocated file of size that you have to select now.\n\
143 Android documentation recommends at least 150MB, going below 50MB will cause\n\
144 problems, as well as over 2GB if you are running from FAT partitioned card.\n\n\
145 Please select size of Android data partition (in megabytes):\n\
146 (creation may take several minutes after you press OK)" \
148 if test -z "$size" || ! dd if=/dev/zero of=data.ext4 bs=1M count=$size; then
149 err "failed to create file, not enough space? bad input?"
152 if ! mkfs.ext4 -O ^has_journal -m 0 -F data.ext4; then
153 err "failed to create filesystem"
158 if ! fsck.ext4 -y data.ext4 || ! fsck.ext2 -y rootfs.ext2; then
159 if [ "$?" -ge "4" ]; then
160 err "file corruption detected, try clearing appdata."
166 mount -o loop,rw,noatime rootfs.ext2 $root
167 mount --bind $mpoint_main/system/ $root/system/
168 mount -o loop,rw,noatime data.ext4 $root/data
170 mkdir -p $root/vendor/
173 mkdir -p $root/vendor/pvr
174 echo "0 0 android" > $root/vendor/pvr/egl.cfg
176 sgx_kernel_loaded=false
177 rm -f $root/vendor/pvr/gralloc.omap3.so
179 # load the right SGX driver
180 if ! grep -q '1.5.15.2766' /proc/pvr/version 2> /dev/null; then
181 echo have to change SGX kernel driver
182 /etc/init.d/pvr-init stop || true
183 if test -d $mpoint_main/pandora/pvr/$kernel_ver; then
184 # found with this android release
185 pvrbase=$mpoint_main/pandora/pvr/$kernel_ver
186 elif test -d /lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766; then
188 pvrbase=/lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766
191 if [ "x$pvrbase" != "x" ]; then
192 if insmod $pvrbase/pvrsrvkm.ko && insmod $pvrbase/omaplfb.ko; then
193 sgx_kernel_loaded=true
195 insmod $pvrbase/bufferclass_ti.ko || true
199 sgx_kernel_loaded=true
204 if $sgx_kernel_loaded; then
205 es=`cat /etc/powervr-esrev`
206 if [ "x$es" = "x" ]; then
207 err "unable to determine SGX version"
210 # for some braindead reason 103 is named 121 too
212 if [ "$es" = "es5" ]; then
215 ln -fs /system/lib/$es/libGLESv2_POWERVR_SGX530_121.so $root/vendor/pvr/
216 ln -fs /system/lib/$es/libGLESv1_CM_POWERVR_SGX530_121.so $root/vendor/pvr/
218 ln -fs /system/bin/$es/pvrsrvinit $root/vendor/pvr/
219 ln -fs /system/lib/hw/gralloc.omap3.so.1 $root/vendor/pvr/gralloc.omap3.so
220 ln -fs /system/lib/$es/libPVRScopeServices.so $root/vendor/pvr/
221 ln -fs /system/lib/$es/libglslcompiler.so $root/vendor/pvr/
222 ln -fs /system/lib/$es/libsrv_um.so $root/vendor/pvr/
223 ln -fs /system/lib/$es/libIMGegl.so $root/vendor/pvr/
225 echo "0 1 POWERVR_SGX530_$sgx_ver" >> $root/vendor/pvr/egl.cfg
230 if ! $sgx_user_ready; then
231 err "SGX driver load failed, no 3D support"
234 # stop X and interfering things, get wifi ready
236 if pidof xfce4-session > /dev/null; then
237 user=`cat /tmp/currentuser`
238 # most often doesn't work :(
239 #if ! test -z "$user"; then
240 # su -c 'xfce4-session-logout --logout' $user
243 /etc/init.d/NetworkManager stop
245 /etc/init.d/wl1251-init start
246 /etc/init.d/slim-init stop
247 sleep 1 # for wlan0, hmh..
248 chvt 2 & # may hang..
250 killall chvt 2> /dev/null || true
254 cp -v /etc/pointercal $root/vendor/
255 cp -v /lib/modules/$kernel_ver/kernel/drivers/net/wireless/wl1251/wl1251_sdio.ko $root/vendor/
256 mkdir -p $root/vendor/firmware
257 cp -v /lib/firmware/brf6300.bin $root/vendor/firmware/
260 rm -rf $root/acct/uid/*
268 if nc -V 2> /dev/null | grep -q GNU; then
269 # GNU nc always fails
270 msg=`nc -l -p 36936 localhost || true`
272 msg=`nc -l localhost 36936`
274 if [ "x$msg" = "xquit" ]; then
277 echo "unknown message: $msg"
280 # real init can't be killed this way
283 # done, run exit handler indirectly