首先弄懂怎么设置adb wifi无线调试的功能,如下所示。

1. 手机端开启adb tcp连接端口

:/$setprop service.adb.tcp.port 5555
:/$stop adbd
:/$start adbd

其中setprop是用来设置系统属性的,这里不需要root权限,su即可。可通过adb shell设置,亦可通过手机上安装的Android terminal设置。

2. 电脑端的设置和使用

连接adb,其中phone_ipaddress和portnumber是指手机的ip和前面设置的监听端口号(如5555)

adb connect phone_ipaddress:portnumber

直接adb shell或adb -s 设备shell连接设备

如若要断开则如下:

adb disconnect phone_ipaddress:port

    

      但是每次这样的去设置很繁琐,所以直接在设置中做一个开关就把手机端的设置做好,如下所示:

一、打开开关,并连接Wifi

adb android wifi开启 adb设置wifi密码_java

二、打开开关,没有连接Wifi

adb android wifi开启 adb设置wifi密码_java_02

三、未打开开关

adb android wifi开启 adb设置wifi密码_java_03

 

这样就可以直接进行adb wifi调试了,手机端就不用每次都先用USB调试去设置修改的属性,才能激活adb wifi调试。

 

 

======================================================================================================

 

下面来具体说说实现的思路:

第一步:在【设置】-->【开发者选项】中做一个类似于【USB调试】的开关【Wifi调试】

第二步:【Wifi调试】开关打开就激活监听5555端口,用来进行adb wifi调试,【Wifi调试】开关关闭就不监听5555端口,这样就不能进行adb wifi调试

第三步:在第二步中打开关闭【Wifi调试】开关的时候,调用相应的接口进行设置

第四步:将第三步中要调用的接口写好

 

1、先在布局中加入该开关

首先找到布局文件,packages/apps/Settings/res/xml/development_prefs.xml,找到【USB调试】开关的相应代码,然后再里面加一个【Wifi调试】开关,代码如下:

 

[html] view plain copy

  1. <SwitchPreference  
  2. android:key="enable_adb"  
  3. android:title="@string/enable_adb"  
  4. android:summary="@string/enable_adb_summary"/>  
  5.   
  6. <!-- added by ouyang start -->  
  7. <SwitchPreference  
  8. android:key="enable_wifi_adb"  
  9. android:title="@string/enable_wifi_adb"  
  10. android:summary="@string/enable_wifi_adb_summary"/>  
  11. - added by ouyang end -->  

上面代码中,第一个代码是【USB调试】开关的代码,第二个是我加的【Wifi调试】开关的代码,然后为什么的字符串做相应的国际化操作,代码如下:

packages/apps/Settings/res/values-zh-rCN/strings.xml 中加入:

 

[html] view plain copy

  1. <!-- added by ouyang start 2015-12-17 -->  
  2. <string name="enable_wifi_adb">Wifi调试</string>  
  3. <string name="enable_wifi_adb_openwifi">Wifi没连接,请连接wifi</string>  
  4. <string name="enable_wifi_adb_summary">连接Wifi后启用调试模式</string>  
  5. <string name="enable_wifi_adb_connected_summary">Wifi调试已打开,在电脑端你可以输入以下命令进行调试:\n  
  6. <xliff:g id="ip_address">%1$s</xliff:g>:5555</string>  
  7. <!-- added by ouyang end 2015-12-17 -->  

packages/apps/Settings/res/values/strings.xml 中加入:

 

[html] view plain copy

  1. <!-- added by ouyang start 2015-12-17 -->  
  2. <string name="enable_wifi_adb">Wifi debugging</string>  
  3. <string name="enable_wifi_adb_openwifi">Wifi is not connected,please turn wifi on and connect it</string>  
  4. <string name="enable_wifi_adb_summary">Debug mode when Wifi is connected</string>  
  5. <string name="enable_wifi_adb_connected_summary">adb wifi is on,from your computer run:\n  
  6. <xliff:g id="ip_address">%1$s</xliff:g>:5555</string>  
  7. <!-- added by ouyang end 2015-12-17 -->  

 

 

2、在packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java文件中,对刚才加入的【Wifi调试】开关进行相关的逻辑处理。

首先先定义开关的几个变量,如下:

 

[java] view plain copy

  1. //add by ouyang 2015-12-17  start  
  2. private static final String ENABLE_WIFI_ADB = "enable_wifi_adb";  
  3. private static final String ADB_WIFI_ENABLED_KEY = "ADB_WIFI_ENABLED";  
  4. private static SwitchPreference mEnableWifiAdb;  
  5. //add by ouyang 2015-12-17  end  

然后再onCreate()方法中初始化【Wifi调试】开关,如下:

 

[java] view plain copy

  1. mEnableAdb = findAndInitSwitchPref(ENABLE_ADB);  
  2. //add by ouyang 2015-12-17    
  3. mEnableWifiAdb = findAndInitSwitchPref(ENABLE_WIFI_ADB);  

然后在onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)方法中对【Wifi调试】开关的打开和关闭操作做逻辑处理。

 

[java] view plain copy

  1. if (preference == mEnableAdb) {  
  2. if (mEnableAdb.isChecked()) {  
  3. false;  
  4. if (mAdbDialog != null) dismissDialogs();  
  5. new AlertDialog.Builder(getActivity()).setMessage(  
  6.                     getActivity().getResources().getString(R.string.adb_warning_message))  
  7.                     .setTitle(R.string.adb_warning_title)  
  8. this)  
  9. this)  
  10.                     .show();  
  11. this);  
  12. else {  
  13.             Settings.Global.putInt(getActivity().getContentResolver(),  
  14. 0);  
  15. false);  
  16. false);  
  17. /// M: ALPS01256802, The "Developer options" status is opened.  
  18. null, mVerifyAppsOverUsb);  
  19.             updateBugreportOptions();  
  20.         }  
  21.     }   
  22. //add by ouyang 2015-12-17 start  
  23. else if (preference == mEnableWifiAdb) {  
  24. if (mEnableWifiAdb.isChecked()) {  
  25. 1);  
  26. "sys.connect.adb.wifi","1");  
  27.               
  28.             WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);    
  29.             WifiInfo wifiInfo = wifiManager.getConnectionInfo();    
  30. int ipAddress = wifiInfo.getIpAddress();     
  31. 0xFF ) + "." +((ipAddress >> 8 ) & 0xFF) + "." +         
  32. 16 ) & 0xFF) + "." +( ipAddress >> 24 & 0xFF) ;  
  33. "ipAddress="+ipAddress);  
  34. "ipAddressString="+ipAddressString);  
  35. if ("0.0.0.0".equals(ipAddressString)) {  
  36.                 mEnableWifiAdb.setSummary(getResources().getString(R.string.enable_wifi_adb_openwifi));  
  37. }else{  
  38.     mEnableWifiAdb.setSummary(getResources().  
  39.             getString(R.string.enable_wifi_adb_connected_summary,ipAddressString));  
  40. }  
  41. else {  
  42. 0);  
  43. "sys.connect.adb.wifi","0");  
  44.             mEnableWifiAdb.setSummary(getResources().getString(R.string.enable_wifi_adb_summary));    
  45.         }  
  46.     }  
  47. //add by ouyang 2015-12-17 end  

上面的代码主要是,

【Wifi调试】开关打开的时候,保存一个原来表示该【Wifi调试】开关打开关闭的状态的值为1,然后调用接口android.os.SystemProperties.set("sys.connect.adb.wifi","1");如果wifi这个时候打开就显示相应的adb wifi命令,如ip地址为192.168.107.201的时候就显示,"Wifi调试已打开,在电脑端你可以输入以下命令进行调试:adb connect 192.168.107.201:5555";如果wifi为打开,就提示“Wifi没连接,请连接wifi”

【Wifi调试】开关关闭的时候,保存一个原来表示该【Wifi调试】开关打开关闭的状态的值为0,然后调用接口android.os.SystemProperties.set("sys.connect.adb.wifi","0");

 

【Wifi调试】开关,那么下次进来的时候就要显示【Wifi调试】开关是打开状态,否则是关闭状态。下面说说ADB_WIFI_ENABLED_KEY这个状态值的相关代码,如下:

在onResume()方法中,加入下面代码:

 

[java] view plain copy

  1. //add by ouyang 2015-12-17 start  
  2. new IntentFilter();  
  3. filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);  
  4. filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);  
  5. filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);  
  6. getActivity().registerReceiver(wifiBroadcastReceiver, filter);  
  7.   
  8. boolean isAdbWifiChecked = Settings.Global.getInt(getActivity().getContentResolver(),ADB_WIFI_ENABLED_KEY, 0) != 0;  
  9.    mEnableWifiAdb.setChecked(isAdbWifiChecked);  
  10. "isAdbWifiChecked:" + isAdbWifiChecked);    
  11. //add by ouyang 2015-12-17 end   

ADB_WIFI_ENABLED_KEY这个状态值来显示【Wifi调试】开关的打开关闭状态。

 

在updateAllOptions()方法中,也要去做下处理,代码如下:

 

[java] view plain copy

  1. /// M: CR ALPS00244115. Lock and unlock screen, the "USB debugging" is unchecked.  
  2. boolean isChecked = (mAdbDialog != null && mAdbDialog.isShowing()) ? true :  
  3. 0) != 0);  
  4.         updateSwitchPreference(mEnableAdb, isChecked);  
  5.          
  6. //add by ouyang 2015-12-17 start  
  7. boolean isAdbWifiChecked = Settings.Global.getInt(cr,ADB_WIFI_ENABLED_KEY, 0) != 0;  
  8.         updateSwitchPreference(mEnableWifiAdb, isAdbWifiChecked);  
  9. //add by ouyang 2015-12-17 end  
  10.           
  11. /// M: update usb preference again  
  12.         mExt.customUSBPreference(mEnableAdb);  
  13. //add by ouyang 2015-12-17  
  14.         mExt.customUSBPreference(mEnableWifiAdb);  

下面来说说上面动态注册的广播,代码如下:

 

[java] view plain copy

  1. BroadcastReceiver wifiBroadcastReceiver = new BroadcastReceiver() {  
  2. @Override  
  3. public void onReceive(Context context, Intent intent) {  
  4. "wifiBroadcastReceiver";  
  5. boolean isAdbWifiChecked = mEnableWifiAdb.isChecked();  
  6.             ConnectivityManager connectivityManager = (ConnectivityManager) context  
  7.                     .getSystemService(Context.CONNECTIVITY_SERVICE);  
  8.             NetworkInfo net = connectivityManager.getActiveNetworkInfo();  
  9. if (net == null) {  
  10. "No net type");  
  11. if (isAdbWifiChecked) {  
  12.                     mEnableWifiAdb.setSummary(getResources()  
  13.                             .getString(R.string.enable_wifi_adb_openwifi));  
  14.                 }  
  15. else {  
  16. "Net Type:" + net.getTypeName());  
  17.             }  
  18.             State wifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();  
  19. if (wifi == State.CONNECTED || wifi == State.CONNECTING) {  
  20. "wifi connected");  
  21.                 WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);  
  22.                 WifiInfo wifiInfo = wifiManager.getConnectionInfo();  
  23. int ipAddress = wifiInfo.getIpAddress();  
  24. 0xFF) + "." + ((ipAddress >> 8) & 0xFF) + "."  
  25. 16) & 0xFF) + "." + (ipAddress >> 24 & 0xFF);  
  26. if (isAdbWifiChecked) {  
  27.                     mEnableWifiAdb.setSummary(  
  28.                             getResources().getString(  
  29.                                     R.string.enable_wifi_adb_connected_summary, ipAddressString));  
  30.                 }  
  31.                 Log.i(TAG, getResources().getString(  
  32.                         R.string.enable_wifi_adb_connected_summary, ipAddressString));  
  33. else if (wifi == State.DISCONNECTED || wifi == State.DISCONNECTING) {  
  34. "wifi disconnected");  
  35. if (isAdbWifiChecked) {  
  36.                     mEnableWifiAdb.setSummary(  
  37.                             getResources().getString(R.string.enable_wifi_adb_openwifi));  
  38.                 }  
  39.                 Log.i(TAG, getResources().getString(  
  40.                         R.string.enable_wifi_adb_connected_summary));  
  41.             }  
  42.   
  43.         }  
  44.     };  

上面的代码主要是当【Wifi调试】开关打开的时候,来用动态表示Android手机的Wifi连接状态,如果wifi未连接,就提示“Wifi没连接,请连接wifi”,如果Wifi连接了,就动态的将从DHCP服务器获取的IP地址显示出来,如ip地址为192.168.107.201的时候就显示,"Wifi调试已打开,在电脑端你可以输入以下命令进行调试:adb connect 192.168.107.201:5555"

======================================================================================================

好吧,在packages/apps/Settings/,即Settings APP层面的代码写完了,下面来说说调用的两个接口怎么实现。

android.os.SystemProperties.set("sys.connect.adb.wifi", "1");

android.os.SystemProperties.set("sys.connect.adb.wifi", "0");

 

首先找到frameworks/base/core/java/android/os/SystemProperties.java文件,找到set(String key, String val)方法,代码如下,发现调用了native_set(key, val)方法。

 

[java] view plain copy

  1. /** 
  2.   * Set the value for the given key. 
  3.   * @throws IllegalArgumentException if the key exceeds 32 characters 
  4.   * @throws IllegalArgumentException if the value exceeds 92 characters 
  5.   */  
  6. public static void set(String key, String val) {  
  7. if (key.length() > PROP_NAME_MAX) {  
  8. throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);  
  9.      }  
  10. if (val != null && val.length() > PROP_VALUE_MAX) {  
  11. throw new IllegalArgumentException("val.length > " +  
  12.              PROP_VALUE_MAX);  
  13.      }  
  14.      native_set(key, val);  
  15.  }  

native_set(key, val)方法定义如下:

 

[java] view plain copy

  1. private static native void native_set(String key, String def);  

   该接口类在初始化运行环境中注册对应的cpp接口android_os_SystemProperties.cpp,实际操作通过JNI调用的是cpp文件对应的接口:

frameworks/base/core/jni/AndroidRuntime.cpp

 

[cpp] view plain copy

  1. namespace android {  
  2. extern int register_android_os_SystemProperties(JNIEnv *env);  
  3. }  


frameworks/base/core/jni/android_os_SystemProperties.cpp

 

[cpp] view plain copy

  1. static void SystemProperties_set(JNIEnv *env, jobject clazz,  
  2.                                       jstring keyJ, jstring valJ)  
  3. {  
  4. int err;  
  5. const char* key;  
  6. const char* val;  
  7.   
  8. if (keyJ == NULL) {  
  9. "key must not be null.");  
  10. return ;  
  11.     }  
  12.     key = env->GetStringUTFChars(keyJ, NULL);  
  13.   
  14. if (valJ == NULL) {  
  15. "";       /* NULL pointer not allowed here */  
  16. else {  
  17.         val = env->GetStringUTFChars(valJ, NULL);  
  18.     }  
  19.   
  20.     err = property_set(key, val);  
  21.   
  22.     env->ReleaseStringUTFChars(keyJ, key);  
  23.   
  24. if (valJ != NULL) {  
  25.         env->ReleaseStringUTFChars(valJ, val);  
  26.     }  
  27.   
  28. if (err < 0) {  
  29. "setproperty key=%s value=%s err=%d\n", key, val, err);  
  30. "java/lang/RuntimeException",  
  31. "failed to set system property");  
  32.     }  
  33. }  

好了,关于该android.os.SystemProperties.set()方法的分析,可以参考

http://www.blogjava.net/anymobile/articles/301989.html

 

下面直接写下面两个接口的实现

android.os.SystemProperties.set("sys.connect.adb.wifi", "1");

android.os.SystemProperties.set("sys.connect.adb.wifi", "0");

 

在device/lentek/lentk6735_66t_l1/E580/init.rc文件中加入下面的代码,其中E580是项目的名称。

 

[cpp] view plain copy

  1. #added by ouyang start connect adb with wifi  
  2. on property:sys.connect.adb.wifi=1  
  3.     setprop service.adb.tcp.port 5555  
  4.     stop adbd  
  5.     start adbd  
  6. on property:sys.connect.adb.wifi=0  
  7. ""  
  8.     stop adbd  
  9.     start adbd  
  10. #added by ouyang end connect adb with wifi  

上面代码就是当调用

android.os.SystemProperties.set("sys.connect.adb.wifi", "1");和sys.connect.adb.wifiandroid.os.SystemProperties.set("sys.connect.adb.wifi", "0");接口的时候的具体实现,

即"sys.connect.adb.wifi"属性设置为1的时候,监听5555端口,

   "sys.connect.adb.wifi"属性设置为0的时候,不监听任何端口

 

====================================================================================

好了,下面来再一次测一测该功能怎么样,重新打开wifi,重新打开【Wifi调试】开关,显示如下:

adb android wifi开启 adb设置wifi密码_java_04

可以看出来,此时Android手机的IP地址是192.168.107.168,因此下面在PC端测试看是否可以用adb wifi无线调试,使用命令adb connect 192.168.107.168连接,adb disconnect 192.168.107.168断开连接,如下图所示:

adb android wifi开启 adb设置wifi密码_adb android wifi开启_05

 

[html] view plain copy

1. C:\Documents and Settings\Administrator>adb connect 192.168.107.168  
2. connected to 192.168.107.168:5555  
3.   
4. C:\Documents and Settings\Administrator>adb shell  
5. shell@lentk6735_66t_l1:/ $ ll  
6. drwxr-xr-x root     root              2015-12-21 10:15 acct  
7. drwxrwx--- system   cache             2015-12-17 19:01 cache  
8. lrwxrwxrwx root     root              1970-01-01 08:00 charger -> /sbin/healthd  
9. dr-x------ root     root              2015-12-21 10:15 config  
10. drwxr-xr-x root     root              2015-12-21 10:15 custom  
11. lrwxrwxrwx root     root              2015-12-21 10:15 d -> /sys/kernel/debug  
12. drwxrwx--x system   system            2015-12-21 10:16 data  
13. -rw-r--r-- root     root          385 1970-01-01 08:00 default.prop  
14. drwxr-xr-x root     root              2015-12-21 10:15 dev  
15. -rw-r--r-- root     root          127 1970-01-01 08:00 enableswap.sh  
16. lrwxrwxrwx root     root              2015-12-21 10:15 etc -> /system/etc  
17. -rw-r--r-- root     root         1851 1970-01-01 08:00 factory_init.project.rc  
18. -rw-r--r-- root     root        18861 1970-01-01 08:00 factory_init.rc  
19. -rw-r--r-- root     root        31413 1970-01-01 08:00 file_contexts  
20. -rw-r----- root     root         1980 1970-01-01 08:00 fstab.mt6735  
21. -rwxr-x--- root     root       543928 1970-01-01 08:00 init  
22. -rwxr-x--- root     root          605 1970-01-01 08:00 init.aee.rc  
23. -rwxr-x--- root     root         2065 1970-01-01 08:00 init.c2k.rc  
24. -rwxr-x--- root     root         1071 1970-01-01 08:00 init.environ.rc  
25. -rwxr-x--- root     root         3548 1970-01-01 08:00 init.modem.rc  
26. -rwxr-x--- root     root        45152 1970-01-01 08:00 init.mt6735.rc  
27. -rwxr-x--- root     root        32013 1970-01-01 08:00 init.mt6735.usb.rc  
28. -rwxr-x--- root     root          963 1970-01-01 08:00 init.no_ssd.rc  
29. -rwxr-x--- root     root         4411 1970-01-01 08:00 init.project.rc  
30. -rwxr-x--- root     root        22787 1970-01-01 08:00 init.rc  
31. -rwxr-x--- root     root          972 1970-01-01 08:00 init.recovery.mt6735.rc  
32. -rwxr-x--- root     root         2288 1970-01-01 08:00 init.trace.rc  
33. -rwxr-x--- root     root         3885 1970-01-01 08:00 init.usb.rc  
34. -rwxr-x--- root     root          583 1970-01-01 08:00 init.xlog.rc  
35. -rwxr-x--- root     root          301 1970-01-01 08:00 init.zygote32.rc  
36. -rwxr-x--- root     root          531 1970-01-01 08:00 init.zygote64_32.rc  
37. -rw-r--r-- root     root         1004 1970-01-01 08:00 meta_init.c2k.rc  
38. -rw-r--r-- root     root         1062 1970-01-01 08:00 meta_init.modem.rc  
39. -rw-r--r-- root     root         1655 1970-01-01 08:00 meta_init.project.rc  
40. -rw-r--r-- root     root        14464 1970-01-01 08:00 meta_init.rc  
41. drwxrwxr-x root     system            2015-12-21 10:15 mnt  
42. drwxrws--- root     system            2015-12-17 18:59 nvdata  
43. drwxrwx--x system   system            2015-12-21 10:15 persist  
44. dr-xr-xr-x root     root              1970-01-01 08:00 proc  
45. -rw-r--r-- root     root         9326 1970-01-01 08:00 property_contexts  
46. drwxrwx--- system   system            2015-12-17 18:59 protect_f  
47. drwxrwx--- system   system            2015-12-17 18:59 protect_s  
48. drwx------ root     root              2015-12-05 18:05 root  
49. drwxr-x--- root     root              1970-01-01 08:00 sbin  
50. lrwxrwxrwx root     root              2015-12-21 10:15 sdcard -> /storage/sdcard0  
51. -rw-r--r-- root     root          471 1970-01-01 08:00 seapp_contexts  
52. -rw-r--r-- root     root           80 1970-01-01 08:00 selinux_version  
53. -rw-r--r-- root     root       258377 1970-01-01 08:00 sepolicy  
54. -rw-r--r-- root     root        11419 1970-01-01 08:00 service_contexts  
55. drwxr-x--x root     sdcard_r          2015-12-21 10:15 storage  
56. dr-xr-xr-x root     root              2015-12-21 10:15 sys  
57. drwxr-xr-x root     root              1970-01-01 08:00 system  
58. -rw-r--r-- root     root         8642 1970-01-01 08:00 ueventd.rc  
59. lrwxrwxrwx root     root              2015-12-21 10:15 vendor -> /system/vendor  
60. shell@lentk6735_66t_l1:/ $ exit  
61.   
62. C:\Documents and Settings\Administrator>adb disconnect 192.168.107.168

发现可以正常的进行adb wifi 无线调试了。将【Wifi调试】开关【Wifi调试】开关关闭,再去连接的话,就会无法连接了。如下所示:

adb android wifi开启 adb设置wifi密码_android_06

 

[html] view plain copy

1. C:\Documents and Settings\Administrator>adb connect 192.168.107.168  
2. unable to connect to 192.168.107.168:5555  
3.   
4. C:\Documents and Settings\Administrator>