Android 希望使用命令行或应用程序内启用和禁用(切换)ADB或USB调试
我试图仅在应用程序运行时启用ADB USB调试,在应用程序未运行时禁用ADB USB调试。我可以完全访问手机,并且它是根目录的,su可用,等等,但是我找不到切换的方法 到目前为止,我所尝试的:Android 希望使用命令行或应用程序内启用和禁用(切换)ADB或USB调试,android,adb,Android,Adb,我试图仅在应用程序运行时启用ADB USB调试,在应用程序未运行时禁用ADB USB调试。我可以完全访问手机,并且它是根目录的,su可用,等等,但是我找不到切换的方法 到目前为止,我所尝试的: Process proc = Runtime.getRuntime().exec(new String [] { "su", "-c", "setprop", "persist.service.adb.enable", "0"}); proc.waitFor(); Process proc2 = Runt
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();
但是,这会导致手机立即进入重新启动循环。有效的代码很简单:
Settings.Secure.putInt(getContentResolver(),Settings.Secure.ADB_ENABLED, 0); // 0 to disable, 1 to enable
编辑/更新:
感谢@MohanT提供以下更新:
但是,应用程序必须是系统应用程序才能使用此功能。为了摆脱必须签署它,建立一个自定义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
根据我的经验,使用setprop并不总是可靠的,甚至可能与设置>应用程序>开发>USB调试选项相冲突。此外,如果启用USB调试但adb不工作等,可能会令人恼火。因此,使用Settings.Secure.adb_enabled是首选方法。。。另外,您总是在状态面板中显示通知 如果您不想在仅尝试访问Settings.Secure.ADB_ENABLED时在系统分区上安装应用程序,那么您可以依赖另一个已经在执行此操作的应用程序: 此应用程序称为ADB切换。您可以在Google Play中找到它: 此处提供了通过ADB切换访问USB调试设置的库:
Chris的回答是正确的,除了安全类中启用ADB_的字段已贬值,字符串已移动到全局类。所以你可以使用下面的命令-
Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable
您可以通过以下步骤实现: 检查当前是否启用了ADB。为此,可以使用相关的全局常量: 适用于API 17及以上。 在API 17之前。 使用implicit with action打开开发者选项,用户可以在其中启用或禁用ADB 代码示例: 爪哇 科特林 仅供参考: API 3之前可能不再适用
问题是,当设置>应用程序>开发>USB调试可用时,为什么要这样做?不要认为您可以实现这一点,因为我已经说过启用USB调试的设置选项。。。只是说,这是一个ROM功能,有人可以很容易地打开它。。。您的应用不必覆盖整个方面:我的应用程序需要打开adb才能正常工作,我只想避免adb因安全风险而全天候运行。如果用户我是唯一的用户,并且在我的应用程序不工作的其他时间,使用根目录、未锁定和su'd手机想要手动打开它,那就没关系了。有人可以使用adb在我的手机上抓取/做任何事情,绕过锁屏,等等,应用程序的目的和我正在尝试做的就是在我的应用程序需要时打开adb,然后在完成时关闭它。如果另一个应用程序或手动切换将其重新打开,则完全没有问题。另外添加:
Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable
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)
}
}