android 4.0 “移動網路” 選項 不存在

來源:互聯網
上載者:User

關鍵詞:android 4.0 移動網路 Mobile networks
平台資訊:
核心:linux2.6/linux3.0
系統:android/android4.0
平台:S5PV310(samsung exynos4210)

作者:xubin341719(歡迎轉載,請註明作者)

前幾天調試3G模組,最後發現我拿到的BSP,在“設定”—中沒有關於3G的選項,狀態列也沒有顯示3G狀態的表徵圖,如所示,這個可好,把3G的驅動加入,進程也起來了,就是不知道怎麼串連。最可惡的就是在網上看到一哥們也遇到相同的問題,他發貼子求協助,最後問題解決了,結貼時寫一個“問題解決,結貼”,問他怎麼搞的,他也沒回,有點不“厚道”呀,嘿嘿!還是自己找吧……

1、“Mobile networks”字串定義

我們想要的資料沒有顯示,從不顯示的字元找起,順藤摸瓜吧,這些對我們這些做驅動的有點難度。“Mobile networks”不顯示,那我們就從最開始跟下代碼吧。

4.0.3_r1/packages/apps/Settings/res/values/String.xml  <!-- Wireless controls, item title to go into the network settings -->   <string name="network_settings_title">Mobile networks</string>

2、network_settings_title引用

4.0.3_r1/packages/apps/Settings/src/com/android/settings/WirelessSettings.java中找到:"mobile_network_settings"  private static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings"; 

把 network_settings_title賦值給 KEY_MOBILE_NETWORK_SETTINGS,再跟進一下 KEY_MOBILE_NETWORK_SETTINGS這個變數吧。

在相同的檔案中我們找到:

 // Remove Mobile Network Settings if it's a wifi-only device.   if (Utils.isWifiOnly(getActivity())) {   getPreferenceScreen().removePreference(findPreference(KEY_MOBILE_NETWORK_SETTINGS));   } 

getSystemService(Context.CONNECTIVITY_SERVICE);獲得網路連接服務,然後判斷是否支援TYPE_MOBILE,現在判斷應該是不支援,也就是if判斷中:Utils.isWifiOnly(getActivity())=1

所以把“移動網路”的選項移除,現在我們就重點去分析Utils.isWifiOnly(getActivity()),找到不顯示的原因,也就是if()中的判斷條件,跟進這段代碼。

3、我們去看下ifWifiOnly()是何方神聖?

4.0.3_r1/packages/apps/Settings/src/com/android/settings/Utils.java中找到

import android.net.ConnectivityManager; public static boolean isWifiOnly(Context context) {ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);return (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false);}

Utils.isWifiOnly(getActivity())=1也就是

cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) = false,可是我們現在要的值是true,為什麼會出現false呢,我們繼續往下看cm.isNetworkSupported。

4、 再分析isNetworkSupported

android.net.ConnectivityManager;找到

4.0.3_r1/frameworks/base/core/java/android/net/ ConnectivityManager.java

isNetworkSupported的實現如下:

public boolean isNetworkSupported(int networkType) {try {return mService.isNetworkSupported(networkType);} catch (RemoteException e) {}return false;}}

繼續跟進 mService.isNetworkSupported這個函數的實現

5、 mService.isNetworkSupported的實現

4.0.3_r1/frameworks/base/services/java/com/android/server/ ConnectivityManager.java

  @Override   public boolean isNetworkSupported(int networkType) {   enforceAccessPermission(); loge("xu_bin"+"test typevalid = " + isNetworkTypeValid(networkType) + " trackers = " + (mNetTrackers[networkType] != null));   return (isNetworkTypeValid(networkType) && (mNetTrackers[networkType] != null));   }

有兩個參數: isNetworkTypeValid(networkType)、 (mNetTrackers[networkType] != null))

我們要的值是ture,可返回是false,看下這兩個值是什麼,把這連個值列印出來:

loge("xu_bin"+"test typevalid = " + isNetworkTypeValid(networkType) + " trackers = " + (mNetTrackers[networkType] != null));

列印結果為:

列印結果為:

E/ConnectivityService( 1426): xu_bin test typevalid = true trackers = false

 

也就是說:(mNetTrackers[networkType] != null)這個地方出問題;

即mNetTrackers[networkType] ==null

6、我們在看下:mNetTrackers[networkType]的由來吧

其實下面這段代碼我有點蒙,連猜帶蒙的,

4.0.3_r1/frameworks/base/services/java/com/android/server/ ConnectivityManager.java

public ConnectivityService(Context context, INetworkManagementService netd,  INetworkStatsService statsService, INetworkPolicyManager policyManager){  if (DBG) log("ConnectivityService starting up");           …………  // Load device network attributes from resources  String[] raStrings = context.getResources().getStringArray(  com.android.internal.R.array.radioAttributes);  for (String raString : raStrings) {          loge("xu_bin test raStrings" + raStrings); // 1          loge("xu_bin test raString" + raString);  RadioAttributes r = new RadioAttributes(raString);  if (r.mType > ConnectivityManager.MAX_RADIO_TYPE) {  loge("Error in radioAttributes - ignoring attempt to define type " + r.mType);  continue;  }  if (mRadioAttributes[r.mType] != null) {  loge("Error in radioAttributes - ignoring attempt to redefine type " +  r.mType);  continue;  }  mRadioAttributes[r.mType] = r;  }   String[] naStrings = context.getResources().getStringArray(  com.android.internal.R.array.networkAttributes);   for (String naString : naStrings) {          loge("xu_bin test naStrings" + naStrings);//2          loge("xu_bin test naString" + naString);  try {  NetworkConfig n = new NetworkConfig(naString);  if (n.type > ConnectivityManager.MAX_NETWORK_TYPE) {  loge("Error in networkAttributes - ignoring attempt to define type " +  n.type);  continue;  }  if (mNetConfigs[n.type] != null) {  loge("Error in networkAttributes - ignoring attempt to redefine type " +  n.type);  continue;  }  …………  /*  * Create the network state trackers for Wi-Fi and mobile  * data. Maybe this could be done with a factory class,  * but it's not clear that it's worth it, given that  * the number of different network types is not going  * to change very often.  */  for (int netType : mPriorityList) {loge("xu_bin:" + netType + " " + mNetConfigs[netType].radio + " " + ConnectivityManager.TYPE_MOBILE);loge("xu_bin test mNetConfigs[netType].radio =" + (mNetConfigs[netType].radio));//3  switch (mNetConfigs[netType].radio) {                        …………  case ConnectivityManager.TYPE_MOBILE:  mNetTrackers[netType] = new MobileDataStateTracker(netType,  mNetConfigs[netType].name);  mNetTrackers[netType].startMonitoring(context, mHandler);  break;  case ConnectivityManager.TYPE_DUMMY:  mNetTrackers[netType] = new DummyDataStateTracker(netType,  mNetConfigs[netType].name);  mNetTrackers[netType].startMonitoring(context, mHandler);  break;                      …………  case ConnectivityManager.TYPE_ETHERNET:  mNetTrackers[netType] = EthernetDataTracker.getInstance();  mNetTrackers[netType].startMonitoring(context, mHandler);  break;  default:  loge("Trying to create a DataStateTracker for an unknown radio type " +  mNetConfigs[netType].radio);  continue;  }  mCurrentLinkProperties[netType] = null;  if (mNetTrackers[netType] != null && mNetConfigs[netType].isDefault()) {  mNetTrackers[netType].reconnect();  }  }   …………  }

加入列印資訊:

(1)、

loge("xu_bin test raStrings" + raStrings);

loge("xu_bin test raString" + raString);

(2)、

loge("xu_bin test naStrings" + naStrings);

loge("xu_bin test naString" + naString);

(3)、

loge("xu_bin:" + netType + " " + mNetConfigs[netType].radio + " " + ConnectivityManager.TYPE_MOBILE);

loge("xu_bin test mNetConfigs[netType].radio =" + (mNetConfigs[netType].radio));

列印出來的值如下:E/ConnectivityService( 1426): xu_bin test raString s[Ljava.lang.String;@411cf008 E/ConnectivityService( 1426): xu_bin test raString 9,1 E/ConnectivityService( 1426): xu_bin test naString s[Ljava.lang.String;@410e30c8 E/ConnectivityService( 1426): xu_bin test naString ethernet,9,9,1,-1,true E/ConnectivityService( 1426): xu_bin:9 9 0 E/ConnectivityService( 1426): xu_bin test mNetConfigs[netType].radio =9 D/NetworkManagementService( 1426): Registering observer D/NetworkManagementService( 1426): Registering observer D/NetworkManagementService( 1426): Registering observer I/WifiService( 1426): WifiService starting up with Wi-Fi disabled E/ConnectivityService( 1426): xu_bintest typevalid = true trackers = falsecom.android.internal.R.array.networkAttributes的值在:

我們在:4.0.3_r1/frameworks/base/core/res/res/values/config.xml

<string-array translatable="false" name="networkAttributes">   <item>"wifi,1,1,1,-1,true"</item>   <item>"mobile,0,0,0,-1,true"</item>   <item>"mobile_mms,2,0,2,60000,true"</item>   <item>"mobile_supl,3,0,2,60000,true"</item>   <item>"mobile_hipri,5,0,3,60000,true"</item>   <item>"mobile_fota,10,0,2,60000,true"</item>   <item>"mobile_ims,11,0,2,60000,true"</item>   <item>"mobile_cbs,12,0,2,60000,true"</item>   <item>"wifi_p2p,13,1,0,-1,true"</item>   </string-array>

這裡面並沒有:ethernet,9,9,1,-1,true
,所以我們全域搜尋一下:

grep -r -w ethernet ./*得到下面有用資訊:

./android-samsung-dev.patch:- <item>"ethernet,9,9,2,-1,true"</item> ./android-samsung-dev.patch:+           // Following code will forcefully allow ethernet network as usable required for v310/c210. ./packages/providers/DownloadProvider/src/com/android/providers/downloads/DownloadThread.java:          // Following code will forcefully allow ethernet network as usable required for v310/c210. ./device/samsung/smdkv310/overlay/frameworks/base/core/res/res/values/config.xml: <item>"ethernet,9,9,1,-1,true"</item> 

對比代碼發現:

./packages/providers/DownloadProvider/src/com/android/providers/downloads/DownloadThread.java中刪除

   Following code will forcefully allow ethernet network as usable required for v310/c210.   if (networkUsable != DownloadInfo.NETWORK_OK) {   Log.i(Constants.TAG, " Forcing ethernet connection usable for download to work!!!");             networkUsable = DownloadInfo.NETWORK_OK;           }

4.0.3_r1/device/samsung/smdkv310/overlay/frameworks/base/core/res/res/values/config.xml中刪除:

  <!-- This string array should be overridden by the device to present a list of network   attributes. This is used by the connectivity manager to decide which networks can coexist   based on the hardware -->   <!-- An Array of "[Connection name],[ConnectivityManager connection type],   [associated radio-type],[priority],[restoral-timer(ms)],[dependencyMet] -->   <!-- the 5th element "resore-time" indicates the number of milliseconds to delay   before automatically restore the default connection. Set -1 if the connection   does not require auto-restore. -->   <!-- the 6th element indicates boot-time dependency-met value. -->   <string-array translatable="false" name="networkAttributes">   <item>"ethernet,9,9,1,-1,true"</item>   </string-array>     <!-- This string array should be overridden by the device to present a list of radio   attributes. This is used by the connectivity manager to decide which networks can coexist   based on the hardware -->   <!-- An Array of "[ConnectivityManager connectionType],   [# simultaneous connection types]" -->   <string-array translatable="false" name="radioAttributes">   <item>"9,1"</item>   </string-array>

把上面兩部分刪除就可以了。其實真正的值是在4.0.3_r1/frameworks/base/core/res/res/values/config.xml中,通過上面函數解析。

正常情況下列印值為:如:wifi mobile mobile_mms mobile_supl等都是在config.xml中配置的

D/ConnectivityService( 1397): ConnectivityService starting upE/ConnectivityService( 1397): xu_bin test restring s[Ljava.lang.String;@41240e38E/ConnectivityService( 1397): xu_bin test restring 1,1E/ConnectivityService( 1397): xu_bin test restring s[Ljava.lang.String;@41240e38E/ConnectivityService( 1397): xu_bin test restring 0,1E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880E/ConnectivityService( 1397): xu_bin test naString wifi,1,1,1,-1,trueE/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880E/ConnectivityService( 1397): xu_bin test naString mobile,0,0,0,-1,trueE/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880E/ConnectivityService( 1397): xu_bin test naString mobile_mms,2,0,2,60000,trueE/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880E/ConnectivityService( 1397): xu_bin test naString mobile_supl,3,0,2,60000,trueE/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880E/ConnectivityService( 1397): xu_bin test naString mobile_hipri,5,0,3,60000,trueE/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880E/ConnectivityService( 1397): xu_bin test naString mobile_fota,10,0,2,60000,trueE/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880E/ConnectivityService( 1397): xu_bin test naString mobile_ims,11,0,2,60000,trueE/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880E/ConnectivityService( 1397): xu_bin test naString mobile_cbs,12,0,2,60000,trueE/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880E/ConnectivityService( 1397): xu_bin test naString wifi_p2p,13,1,0,-1,true

下面就可以看到“移動網路”了:

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.