diff --git a/init/init.c b/init/init.c index f76eb36b5..16a353032 100755 --- a/init/init.c +++ b/init/init.c @@ -767,21 +767,31 @@ int open_keychord() void handle_keychord(int fd) { struct service *svc; + char* debuggable; + char* adb_enabled; int ret; __u16 id; - ret = read(fd, &id, sizeof(id)); - if (ret != sizeof(id)) { - ERROR("could not read keychord id\n"); - return; - } + // only handle keychords if ro.debuggable is set or adb is enabled. + // the logic here is that bugreports should be enabled in userdebug or eng builds + // and on user builds for users that are developers. + debuggable = property_get("ro.debuggable"); + adb_enabled = property_get("init.svc.adbd"); + if ((debuggable && !strcmp(debuggable, "1")) || + (adb_enabled && !strcmp(adb_enabled, "running"))) { + ret = read(fd, &id, sizeof(id)); + if (ret != sizeof(id)) { + ERROR("could not read keychord id\n"); + return; + } - svc = service_find_by_keychord(id); - if (svc) { - INFO("starting service %s from keychord\n", svc->name); - service_start(svc, NULL); - } else { - ERROR("service for keychord %d not found\n", id); + svc = service_find_by_keychord(id); + if (svc) { + INFO("starting service %s from keychord\n", svc->name); + service_start(svc, NULL); + } else { + ERROR("service for keychord %d not found\n", id); + } } } @@ -853,10 +863,7 @@ int main(int argc, char **argv) property_init(); // only listen for keychords if ro.debuggable is true - debuggable = property_get("ro.debuggable"); - if (debuggable && !strcmp(debuggable, "1")) { - keychord_fd = open_keychord(); - } + keychord_fd = open_keychord(); if (console[0]) { snprintf(tmp, sizeof(tmp), "/dev/%s", console);