前言
由于跟源码打交道比较频繁,加之 RK 和 MTK 平台的源码都有接触,发现 RK 的系统能通过局域网无线调试 ADB
MTK 的一直没在意,今天有空尝试了发现不行一直提示 cannot connect to xxxxx:5555: 由于目标计算机积极拒绝,无法连接
在网上得到的答案大多都是 adb 调试桥挂了需重启之类的,然鹅试了没什么用,也有说需要 root 权限的。
其实我的实际情况是设备从源头上就没打开这个功能,在此记录一下修改过程。
进入正题
先来效果图
要启用无线调试 ADB 功能其实很简单,只需在 system.prop 中增加配置 service.adb.tcp.port = 5555 即可
adb 早期版本只能通过 USB 来对设备调试,从 adb v1.0.25开始,增加了对通过 tcp/ip 调试 Android 设备的功能,
所以只需我们增加端口支持就行,所以一般大多提示目标计算机积极拒绝,无法连接的情况,也有可能是系统本身没有启用
这个功能。
system.prop 文件位置一般在 device\公司名字\项目名字 路径下
项目名字 看你的out/target/product/文件夹名称
为了更方便的控制无线调试的开关,你还可以做接下来的操作
在 Settings 中的开发者选项页面增加一个 SwitchPreference 用于控制无线调试的开关
1.在资源文件中添加 string 描述
//中文 <string name="enable_wiress_adb" >"无线调试"</string> <string name="enable_wiress_adb_summary" >"连接IP后启用调试模式"</string> //英文 <string name="enable_wiress_adb" >"Wiress Debuging"</string> <string name="enable_wiress_adb_summary" >"Debug mode when IP is connected"</string>
2.添加 SwitchPreference 开关
packages/apps/Settings/res/xml/development_prefs.xml
packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java
<PreferenceCategory android:key="debug_debugging_category" android:title="@string/debug_debugging_category"> <SwitchPreference android:key="enable_adb" android:title="@string/enable_adb" android:summary="@string/enable_adb_summary"/> //add <SwitchPreference android:key="enable_wiress_adb" android:title="@string/enable_wiress_adb" android:summary="@string/enable_wiress_adb_summary"/> .... </PreferenceCategory>
private void updateAllOptions() { final Context context = getActivity(); final ContentResolver cr = context.getContentResolver(); mHaveDebugSettings = false; /// M: CR ALPS00244115. Lock and unlock screen, the "USB debugging" is unchecked. boolean isChecked = (mAdbDialog != null && mAdbDialog.isShowing()) ? true : (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) != 0); updateSwitchPreference(mEnableAdb, isChecked); //add String adbWiress = SystemProperties.get("sys.connect.adb.wiress"); updateSwitchPreference(mEnableWiressAdb, "1".equals(adbWiress)); ..... } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (Utils.isMonkeyRunning()) { return false; } if (preference == mEnableAdb) { if (mEnableAdb.isChecked()) { mDialogClicked = false; if (mAdbDialog != null) dismissDialogs(); mAdbDialog = new AlertDialog.Builder(getActivity()).setMessage( getActivity().getResources().getString(R.string.adb_warning_message)) .setTitle(R.string.adb_warning_title) .setPositiveButton(android.R.string.yes, this) .setNegativeButton(android.R.string.no, this) .show(); mAdbDialog.setOnDismissListener(this); } else { Settings.Global.putInt(getActivity().getContentResolver(), Settings.Global.ADB_ENABLED, 0); mVerifyAppsOverUsb.setEnabled(false); mVerifyAppsOverUsb.setChecked(false); /// M: ALPS01256802, The "Developer options" status is opened. onPreferenceTreeClick(null, mVerifyAppsOverUsb); updateBugreportOptions(); } //add }else if (preference == mEnableWiressAdb) { if (mEnableWiressAdb.isChecked()) { Settings.Global.putInt(getActivity().getContentResolver(), Settings.Global.ADB_ENABLED, 1); SystemProperties.set("sys.connect.adb.wiress","1"); }else{ SystemProperties.set("sys.connect.adb.wiress","0"); Settings.Global.putInt(getActivity().getContentResolver(), Settings.Global.ADB_ENABLED, 0); } //add } ... }
3.在 init.rc 中添加控制端口(service.adb.tcp.port)的代码
system\core\rootdir\init.rc
on property:sys.connect.adb.wiress=1 setprop service.adb.tcp.port 5555 stop adbd start adbd on property:sys.connect.adb.wiress=0 setprop service.adb.tcp.port 0 stop adbd start adbd
当 SwitchPreference 打开,则设置端口为 5555, 允许无线调试
当 SwitchPreference 关闭,则设置端口为 0, 禁止无线调试
4.去除允许USB调试弹框,默认授权
frameworks\base\packages\SystemUI\src\com\android\systemui\usb\UsbDebuggingActivity.java
@Override public void onCreate(Bundle icicle) { super.onCreate(icicle); ...... //屏蔽弹出授权框 //setupAlert(); //默认授权,始终允许 try { IBinder b = ServiceManager.getService(USB_SERVICE); IUsbManager service = IUsbManager.Stub.asInterface(b); service.allowUsbDebugging(true, mKey); } catch (Exception e) { Log.e(TAG, "Unable to notify Usb service", e); } //关闭授权框,不然 会显示一个系统界面的半截对话框 finish(); }
这样就大功告成了,尽情的享受无线调试的便利吧。