希望使用命令行或在应用程序中启用和禁用(切换)ADB或USB调试

时间:2012-07-03 15:23:37

标签: android adb

我正在尝试仅在我的应用程序运行时启用ADB(USB调试),并在我的应用程序不运行时禁用它。我可以完全访问手机,它已植根,su可用,等等,但我无法找到切换方式。

到目前为止我尝试过:

Process proc = Runtime.getRuntime().exec(new String [] { "su", "-c", "setprop", "persist.service.adb.enable", "0"});
proc.waitFor();
Process proc2 = Runtime.getRuntime().exec(new String [] { "su", "-c", "stop", "adbd"});
proc2.waitFor();

然而,这会导致手机瞬间进入重启循环。

4 个答案:

答案 0 :(得分:12)

有效的代码很简单:

Settings.Secure.putInt(getContentResolver(),Settings.Secure.ADB_ENABLED, 0); // 0 to disable, 1 to enable

修改/更新: 感谢@MohanT进行以下更新:

Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable

但是,该应用程序需要是一个系统应用程序才能使用它。为了不必签名,构建一个自定义的rom等。我做了以下操作,使它成为一个系统应用程序。

首先,我使用eclipse定期安装它,然后使用adb shell:

> su
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
# cat /data/app/filename.apk > /system/app/filename.apk
# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system
# reboot

答案 1 :(得分:4)

您可以通过以下步骤来实现:

  1. 检查ADB当前是否已启用。为此,您可以使用相关的全局常量:

  2. 使用隐式IntentSettings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS操作来打开开发者选项,用户可以在其中启用或禁用ADB。

  3. 代码示例:

    <强>爪哇

    public static final int API = Build.VERSION.SDK_INT;
    public static final int ENABLED=1, DISABLED=0;
    
    public static boolean adbEnabled(Context context){
        if(API>16)
           return ENABLED == Settings.Global.getInt(context.getContentResolver(), Settings.Global.ADB_ENABLED,DISABLED);
        else 
           return ENABLED == Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ADB_ENABLED,DISABLED);
    }
    
    public void checkAdb(Context context){
        //if ADB disabled
        if(!adbEnabled(context)){
            //open developer options settings 
            Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
            context.startActivity(intent);
        }
    }
    

    <强>科特林

    val API = Build.VERSION.SDK_INT
    val ENABLED = 1
    val DISABLED = 0
    
    fun adbEnabled(context: Context): Boolean {
        return if (API > 16)
            ENABLED == Settings.Global.getInt(context.contentResolver, Settings.Global.ADB_ENABLED, DISABLED)
        else
            ENABLED == Settings.Secure.getInt(context.contentResolver, Settings.Secure.ADB_ENABLED, DISABLED)
    }
    fun checkAdb(context: Context) {
        //if ADB disabled
        if (!adbEnabled(context)) {
            //open developer options settings
            val intent = Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)
            context.startActivity(intent)
        }
    }
    
      

    仅供参考:

         

    在API 3之前(可能不再相关)使用了Settings.System.ADB_ENABLED

答案 2 :(得分:3)

Chris的答案是正确的,但Secure类中的ADB_EN​​ABLED字段已被折旧且字符串已移至Global类。所以你可以使用下面的命令 -

Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable

答案 3 :(得分:2)

根据我使用setprop的经验并不总是可靠,甚至可能与设置&gt;冲突。应用程序&gt;开发&gt; USB调试选项。除此之外,如果启用了USB调试但adb不能正常工作等,它可能会很烦人。因此,使用Settings.Secure.ADB_EN​​ABLED是首选方式...此外,您始终在状态面板中显示通知。

如果您只想尝试访问Settings.Secure.ADB_EN​​ABLED而不想在系统分区上安装应用程序时遇到麻烦,那么您可以依赖另一个已经完成此项工作的应用程序:

此应用程序称为ADB Toggle。您可以在Google Play中找到它:

https://play.google.com/store/apps/details?id=com.ramdroid.adbtoggle

可通过ADB Toggle访问USB调试设置的库:

https://github.com/ramdroid/AdbToggleAccessLib