Loading adb_install.cpp +23 −41 Original line number Diff line number Diff line Loading @@ -26,55 +26,23 @@ #include <sys/wait.h> #include <unistd.h> #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/properties.h> #include <android-base/unique_fd.h> #include "common.h" #include "fuse_sideload.h" #include "install.h" #include "ui.h" static void set_usb_driver(bool enabled) { // USB configfs doesn't use /s/c/a/a/enable. if (android::base::GetBoolProperty("sys.usb.configfs", false)) { return; } static constexpr const char* USB_DRIVER_CONTROL = "/sys/class/android_usb/android0/enable"; android::base::unique_fd fd(open(USB_DRIVER_CONTROL, O_WRONLY)); if (fd == -1) { PLOG(ERROR) << "Failed to open driver control"; return; } // Not using android::base::WriteStringToFile since that will open with O_CREAT and give EPERM // when USB_DRIVER_CONTROL doesn't exist. When it gives EPERM, we don't know whether that's due // to non-existent USB_DRIVER_CONTROL or indeed a permission issue. if (!android::base::WriteStringToFd(enabled ? "1" : "0", fd)) { PLOG(ERROR) << "Failed to set driver control"; } } static void stop_adbd() { ui->Print("Stopping adbd...\n"); android::base::SetProperty("ctl.stop", "adbd"); set_usb_driver(false); } static void maybe_restart_adbd() { if (is_ro_debuggable()) { ui->Print("Restarting adbd...\n"); set_usb_driver(true); android::base::SetProperty("ctl.start", "adbd"); } } int apply_from_adb(bool* wipe_cache) { modified_flash = true; stop_adbd(); set_usb_driver(true); // Save the usb state to restore after the sideload operation. std::string usb_state = android::base::GetProperty("sys.usb.state", "none"); // Clean up state and stop adbd. if (usb_state != "none" && !SetUsbConfig("none")) { LOG(ERROR) << "Failed to clear USB config"; return INSTALL_ERROR; } ui->Print( "\n\nNow send the package you want to apply\n" Loading @@ -86,6 +54,11 @@ int apply_from_adb(bool* wipe_cache) { _exit(EXIT_FAILURE); } if (!SetUsbConfig("sideload")) { LOG(ERROR) << "Failed to set usb config to sideload"; return INSTALL_ERROR; } // How long (in seconds) we wait for the host to start sending us a package, before timing out. static constexpr int ADB_INSTALL_TIMEOUT = 300; Loading Loading @@ -136,8 +109,17 @@ int apply_from_adb(bool* wipe_cache) { } } set_usb_driver(false); maybe_restart_adbd(); // Clean up before switching to the older state, for example setting the state // to none sets sys/class/android_usb/android0/enable to 0. if (!SetUsbConfig("none")) { LOG(ERROR) << "Failed to clear USB config"; } if (usb_state != "none") { if (!SetUsbConfig(usb_state)) { LOG(ERROR) << "Failed to set USB config to " << usb_state; } } return result; } common.h +1 −0 Original line number Diff line number Diff line Loading @@ -44,4 +44,5 @@ void ui_print(const char* format, ...) __printflike(1, 2); bool is_ro_debuggable(); bool SetUsbConfig(const std::string& state); #endif // RECOVERY_COMMON_H etc/init.rc +17 −4 Original line number Diff line number Diff line Loading @@ -132,11 +132,9 @@ on property:sys.usb.config=adb on property:sys.usb.config=fastboot start fastbootd on property:sys.usb.config=none stop adbd stop fastbootd on property:sys.usb.config=none && property:sys.usb.configfs=0 stop adbd stop fastboot write /sys/class/android_usb/android0/enable 0 setprop sys.usb.state ${sys.usb.config} Loading @@ -146,6 +144,12 @@ on property:sys.usb.config=adb && property:sys.usb.configfs=0 write /sys/class/android_usb/android0/enable 1 setprop sys.usb.state ${sys.usb.config} on property:sys.usb.config=sideload && property:sys.usb.configfs=0 write /sys/class/android_usb/android0/idProduct D001 write /sys/class/android_usb/android0/functions adb write /sys/class/android_usb/android0/enable 1 setprop sys.usb.state ${sys.usb.config} on property:sys.usb.config=fastboot && property:sys.usb.configfs=0 write /sys/class/android_usb/android0/idProduct 4EE0 write /sys/class/android_usb/android0/functions fastboot Loading @@ -155,10 +159,19 @@ on property:sys.usb.config=fastboot && property:sys.usb.configfs=0 # Configfs triggers on property:sys.usb.config=none && property:sys.usb.configfs=1 write /config/usb_gadget/g1/UDC "none" stop adbd stop fastbootd setprop sys.usb.ffs.ready 0 rm /config/usb_gadget/g1/configs/b.1/f1 setprop sys.usb.state ${sys.usb.config} on property:sys.usb.config=sideload && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1 write /config/usb_gadget/g1/idProduct 0xD001 write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 write /config/usb_gadget/g1/UDC ${sys.usb.controller} setprop sys.usb.state ${sys.usb.config} on property:sys.usb.config=adb && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1 write /config/usb_gadget/g1/idProduct 0xD001 write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" Loading recovery.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -286,6 +286,12 @@ static bool erase_volume(const char* volume) { return (result == 0); } // Sets the usb config to 'state' bool SetUsbConfig(const std::string& state) { android::base::SetProperty("sys.usb.config", state); return android::base::WaitForProperty("sys.usb.state", state); } // Returns the selected filename, or an empty string. static std::string browse_directory(const std::string& path, Device* device) { ensure_path_mounted(path.c_str()); Loading recovery_main.cpp +0 −5 Original line number Diff line number Diff line Loading @@ -305,11 +305,6 @@ static void redirect_stdio(const char* filename) { } } static bool SetUsbConfig(const std::string& state) { android::base::SetProperty("sys.usb.config", state); return android::base::WaitForProperty("sys.usb.state", state); } int main(int argc, char** argv) { // We don't have logcat yet under recovery; so we'll print error on screen and log to stdout // (which is redirected to recovery.log) as we used to do. Loading Loading
adb_install.cpp +23 −41 Original line number Diff line number Diff line Loading @@ -26,55 +26,23 @@ #include <sys/wait.h> #include <unistd.h> #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/properties.h> #include <android-base/unique_fd.h> #include "common.h" #include "fuse_sideload.h" #include "install.h" #include "ui.h" static void set_usb_driver(bool enabled) { // USB configfs doesn't use /s/c/a/a/enable. if (android::base::GetBoolProperty("sys.usb.configfs", false)) { return; } static constexpr const char* USB_DRIVER_CONTROL = "/sys/class/android_usb/android0/enable"; android::base::unique_fd fd(open(USB_DRIVER_CONTROL, O_WRONLY)); if (fd == -1) { PLOG(ERROR) << "Failed to open driver control"; return; } // Not using android::base::WriteStringToFile since that will open with O_CREAT and give EPERM // when USB_DRIVER_CONTROL doesn't exist. When it gives EPERM, we don't know whether that's due // to non-existent USB_DRIVER_CONTROL or indeed a permission issue. if (!android::base::WriteStringToFd(enabled ? "1" : "0", fd)) { PLOG(ERROR) << "Failed to set driver control"; } } static void stop_adbd() { ui->Print("Stopping adbd...\n"); android::base::SetProperty("ctl.stop", "adbd"); set_usb_driver(false); } static void maybe_restart_adbd() { if (is_ro_debuggable()) { ui->Print("Restarting adbd...\n"); set_usb_driver(true); android::base::SetProperty("ctl.start", "adbd"); } } int apply_from_adb(bool* wipe_cache) { modified_flash = true; stop_adbd(); set_usb_driver(true); // Save the usb state to restore after the sideload operation. std::string usb_state = android::base::GetProperty("sys.usb.state", "none"); // Clean up state and stop adbd. if (usb_state != "none" && !SetUsbConfig("none")) { LOG(ERROR) << "Failed to clear USB config"; return INSTALL_ERROR; } ui->Print( "\n\nNow send the package you want to apply\n" Loading @@ -86,6 +54,11 @@ int apply_from_adb(bool* wipe_cache) { _exit(EXIT_FAILURE); } if (!SetUsbConfig("sideload")) { LOG(ERROR) << "Failed to set usb config to sideload"; return INSTALL_ERROR; } // How long (in seconds) we wait for the host to start sending us a package, before timing out. static constexpr int ADB_INSTALL_TIMEOUT = 300; Loading Loading @@ -136,8 +109,17 @@ int apply_from_adb(bool* wipe_cache) { } } set_usb_driver(false); maybe_restart_adbd(); // Clean up before switching to the older state, for example setting the state // to none sets sys/class/android_usb/android0/enable to 0. if (!SetUsbConfig("none")) { LOG(ERROR) << "Failed to clear USB config"; } if (usb_state != "none") { if (!SetUsbConfig(usb_state)) { LOG(ERROR) << "Failed to set USB config to " << usb_state; } } return result; }
common.h +1 −0 Original line number Diff line number Diff line Loading @@ -44,4 +44,5 @@ void ui_print(const char* format, ...) __printflike(1, 2); bool is_ro_debuggable(); bool SetUsbConfig(const std::string& state); #endif // RECOVERY_COMMON_H
etc/init.rc +17 −4 Original line number Diff line number Diff line Loading @@ -132,11 +132,9 @@ on property:sys.usb.config=adb on property:sys.usb.config=fastboot start fastbootd on property:sys.usb.config=none stop adbd stop fastbootd on property:sys.usb.config=none && property:sys.usb.configfs=0 stop adbd stop fastboot write /sys/class/android_usb/android0/enable 0 setprop sys.usb.state ${sys.usb.config} Loading @@ -146,6 +144,12 @@ on property:sys.usb.config=adb && property:sys.usb.configfs=0 write /sys/class/android_usb/android0/enable 1 setprop sys.usb.state ${sys.usb.config} on property:sys.usb.config=sideload && property:sys.usb.configfs=0 write /sys/class/android_usb/android0/idProduct D001 write /sys/class/android_usb/android0/functions adb write /sys/class/android_usb/android0/enable 1 setprop sys.usb.state ${sys.usb.config} on property:sys.usb.config=fastboot && property:sys.usb.configfs=0 write /sys/class/android_usb/android0/idProduct 4EE0 write /sys/class/android_usb/android0/functions fastboot Loading @@ -155,10 +159,19 @@ on property:sys.usb.config=fastboot && property:sys.usb.configfs=0 # Configfs triggers on property:sys.usb.config=none && property:sys.usb.configfs=1 write /config/usb_gadget/g1/UDC "none" stop adbd stop fastbootd setprop sys.usb.ffs.ready 0 rm /config/usb_gadget/g1/configs/b.1/f1 setprop sys.usb.state ${sys.usb.config} on property:sys.usb.config=sideload && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1 write /config/usb_gadget/g1/idProduct 0xD001 write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 write /config/usb_gadget/g1/UDC ${sys.usb.controller} setprop sys.usb.state ${sys.usb.config} on property:sys.usb.config=adb && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1 write /config/usb_gadget/g1/idProduct 0xD001 write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" Loading
recovery.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -286,6 +286,12 @@ static bool erase_volume(const char* volume) { return (result == 0); } // Sets the usb config to 'state' bool SetUsbConfig(const std::string& state) { android::base::SetProperty("sys.usb.config", state); return android::base::WaitForProperty("sys.usb.state", state); } // Returns the selected filename, or an empty string. static std::string browse_directory(const std::string& path, Device* device) { ensure_path_mounted(path.c_str()); Loading
recovery_main.cpp +0 −5 Original line number Diff line number Diff line Loading @@ -305,11 +305,6 @@ static void redirect_stdio(const char* filename) { } } static bool SetUsbConfig(const std::string& state) { android::base::SetProperty("sys.usb.config", state); return android::base::WaitForProperty("sys.usb.state", state); } int main(int argc, char** argv) { // We don't have logcat yet under recovery; so we'll print error on screen and log to stdout // (which is redirected to recovery.log) as we used to do. Loading