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 udevd > /dev/null; then
77 # don't use /etc/init.d/udev, it remounts /dev blindly
82 if ! pidof X > /dev/null; then
83 # need to restore SGX, X and friends
84 rmmod bufferclass_ti omaplfb pvrsrvkm
85 /etc/init.d/pvr-init start
86 rmmod wl1251_sdio # hmh
87 /etc/init.d/NetworkManager start
88 /etc/init.d/slim-init start
91 if ! ps a | grep -q 'pnd_run.*run_gingerbread.sh'; then
92 # something killed pnd_run, have to clean up for it
93 cat > /tmp/clean_android.sh <<EOF
98 umount $mpoint_main # needed twice??
99 losetup -a | awk -F ':' '{ print \$1 }' | xargs losetup -d 2> /dev/null
103 chmod +x /tmp/clean_android.sh
104 /tmp/clean_android.sh &
111 # logger, binder and ashmem
113 if ! test -e /dev/log_events; then
117 if ! test -e /dev/binder; then
121 if ! test -e /dev/ashmem; then
125 if ! test -e /sys/module/lowmemorykiller; then
126 # this one is optional
127 modprobe lowmemorykiller || true
130 if test ! -e /dev/log_events -o ! -e /dev/binder -o ! -e /dev/ashmem; then
131 err "could not load required Android modules,\n\
132 perhaps you are running unsupported\nfirmware/kernel."
136 if test "x$last_pnd_version" != "x$pnd_version"; then
137 echo "version changed from $last_pnd_version to $pnd_version"
139 echo "$pnd_version" > $mpoint_main/last_pnd_version
142 if ! test -e rootfs.ext2; then
143 if ! cp -v pandora/default_rootfs.ext2 rootfs.ext2; then
144 err "file copy failed, not enough space?"
149 if ! test -e data.ext4; then
150 size=`zenity --entry --text="\
151 Android needs a partition to store it's data and installed programs.\n\
152 This will be stored in preallocated file of size that you have to select now.\n\
153 Android documentation recommends at least 150MB, going below 50MB will cause\n\
154 problems, as well as over 2GB if you are running from FAT partitioned card.\n\n\
155 Please select size of Android data partition (in megabytes):\n\
156 (creation may take several minutes after you press OK)" \
158 if test -z "$size" || ! dd if=/dev/zero of=data.ext4 bs=1M count=$size; then
159 err "failed to create file, not enough space? bad input?"
162 if ! mkfs.ext4 -O ^has_journal -m 0 -F data.ext4; then
163 err "failed to create filesystem"
168 if ! fsck.ext4 -y data.ext4 || ! fsck.ext2 -y rootfs.ext2; then
169 if [ "$?" -ge "4" ]; then
170 err "file corruption detected, try clearing appdata."
176 mount -o loop,rw,noatime rootfs.ext2 $root
177 mount --bind $mpoint_main/system/ $root/system/
178 mount -o loop,rw,noatime data.ext4 $root/data
180 mkdir -p $root/vendor/
183 mkdir -p $root/vendor/pvr
184 echo "0 0 android" > $root/vendor/pvr/egl.cfg
185 rm -f $root/vendor/pvr/gralloc.omap3.so
186 sgx_kernel_loaded=false
188 # load the right SGX driver
189 if ! grep -q '1.5.15.2766' /proc/pvr/version 2> /dev/null; then
190 echo have to change SGX kernel driver
191 /etc/init.d/pvr-init stop || true
192 if test -d $mpoint_main/pandora/pvr/$kernel_ver; then
193 # found with this android release
194 pvrbase=$mpoint_main/pandora/pvr/$kernel_ver
195 elif test -d /lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766; then
197 pvrbase=/lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766
200 if [ "x$pvrbase" != "x" ]; then
201 if insmod $pvrbase/pvrsrvkm.ko && insmod $pvrbase/omaplfb.ko; then
202 sgx_kernel_loaded=true
204 insmod $pvrbase/bufferclass_ti.ko || true
208 sgx_kernel_loaded=true
213 if $sgx_kernel_loaded; then
214 es=`cat /etc/powervr-esrev`
215 if [ "x$es" = "x" ]; then
216 err "unable to determine SGX version"
219 # for some braindead reason 103 is named 121 too
221 if [ "$es" = "es5" ]; then
224 ln -fs /system/lib/$es/libGLESv2_POWERVR_SGX530_121.so $root/vendor/pvr/
225 ln -fs /system/lib/$es/libGLESv1_CM_POWERVR_SGX530_121.so $root/vendor/pvr/
227 ln -fs /system/bin/$es/pvrsrvinit $root/vendor/pvr/
228 ln -fs /system/lib/hw/gralloc.omap3.so.1 $root/vendor/pvr/gralloc.omap3.so
229 ln -fs /system/lib/$es/libPVRScopeServices.so $root/vendor/pvr/
230 ln -fs /system/lib/$es/libglslcompiler.so $root/vendor/pvr/
231 ln -fs /system/lib/$es/libsrv_um.so $root/vendor/pvr/
232 ln -fs /system/lib/$es/libIMGegl.so $root/vendor/pvr/
234 echo "0 1 POWERVR_SGX530_$sgx_ver" >> $root/vendor/pvr/egl.cfg
239 if ! $sgx_user_ready; then
240 err "SGX driver load failed, no 3D support"
243 # stop X and interfering things, get wifi ready
245 if pidof xfce4-session > /dev/null; then
246 user=`cat /tmp/currentuser`
247 # most often doesn't work :(
248 #if ! test -z "$user"; then
249 # su -c 'xfce4-session-logout --logout' $user
252 /etc/init.d/NetworkManager stop
254 /etc/init.d/wl1251-init start
255 /etc/init.d/slim-init stop
256 sleep 1 # for wlan0, hmh..
257 chvt 2 & # may hang..
259 killall chvt 2> /dev/null || true
261 killall udevd || true
263 cp -v /lib/modules/$kernel_ver/kernel/drivers/net/wireless/wl1251/wl1251_sdio.ko $root/vendor/
264 mkdir -p $root/vendor/firmware
265 cp -v /lib/firmware/brf6300.bin $root/vendor/firmware/
268 cp -v /etc/pointercal $root/vendor/
271 rm -rf $root/acct/uid/*
275 # revive udev when /init is done with uevents,
276 # we'll need it to load firmwares and stuff
284 if nc -V 2> /dev/null | grep -q GNU; then
285 # GNU nc always fails
286 msg=`nc -l -p 36936 localhost || true`
288 msg=`nc -l localhost 36936`
290 if [ "x$msg" = "xquit" ]; then
293 echo "unknown message: $msg"
296 # real init can't be killed this way
299 # done, run exit handler indirectly