summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--adb/services.c6
-rw-r--r--rootdir/init.rc12
2 files changed, 14 insertions, 4 deletions
diff --git a/adb/services.c b/adb/services.c
index 6bbd6f8..6940be8 100644
--- a/adb/services.c
+++ b/adb/services.c
@@ -125,14 +125,12 @@ void restart_root_service(int fd, void *cookie)
return;
}
- property_set("service.adb.root", "1");
snprintf(buf, sizeof(buf), "restarting adbd as root\n");
writex(fd, buf, strlen(buf));
adb_close(fd);
- // quit, and init will restart us as root
- sleep(1);
- exit(1);
+ // This will cause a property trigger in init.rc to restart us
+ property_set("service.adb.root", "1");
}
}
diff --git a/rootdir/init.rc b/rootdir/init.rc
index dc209f3..c1fd077 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -375,6 +375,18 @@ service adbd /sbin/adbd
on property:ro.kernel.qemu=1
start adbd
+# This property trigger has added to imitiate the previous behavior of "adb root".
+# The adb gadget driver used to reset the USB bus when the adbd daemon exited,
+# and the host side adb relied on this behavior to force it to reconnect with the
+# new adbd instance after init relaunches it. So now we force the USB bus to reset
+# here when adbd sets the service.adb.root property to 1. We also restart adbd here
+# rather than waiting for init to notice its death and restarting it so the timing
+# of USB resetting and adb restarting more closely matches the previous behavior.
+on property:service.adb.root=1
+ write /sys/class/android_usb/android0/enable 0
+ restart adbd
+ write /sys/class/android_usb/android0/enable 1
+
service servicemanager /system/bin/servicemanager
class core
user system