轉自: http://blog.csdn.net/w6980112/article/details/45843129
第一次調試android5.1的 WIFI更改小功能
Wifi 源碼的相關路徑目錄
packages/apps/Settings/src/com/Android/settings/wifi/
frameworks/base/wifi/java/android/net/wifi/
frameworks/base/services/core/java/com/android/server/connectivity
frameworks/opt/net/wifi/service/java/com/android/server/wifi/
frameworks/base/core/
定位一方面根據屏幕的顯示信息,另一方面看logcat捕捉的信息,從中會找到有用的。Logcat會告訴你一些蛛絲馬跡。還有就是相關代碼分布目錄。會用百度谷歌搜索信息,android5.1 wifi、
wifi_no_internet、No Internet Access Detected, won\’t automatically reconnect……………
1、Framework層加打印信息首先聲明頭文件import android.util.Log;以及TAG是否有。
在加打印信息時,注意上下位置,例如不能在return XX 下面,以及注意變量的名稱會變化,對象會變。numNoInternetAccessRepor或者XXX.umNoInternetAccessReports
只能重編嗎?
2、packages/apps/Settings/res/ 下是屏幕顯示的字符串信息資源,
No Internet Access Detected, won\’t automatically reconnect. 可以在
packages/apps/Settings/src 下搜索Wifi_no_internet 字符串。在哪里打印的出 summary.append(context.getString(R.string.wifi_no_internet));
else if (mConfig != null && mConfig.hasNoInternetAccess())
再跟蹤mConfig.hasNoInternetAccess() 函數,
public boolean hasNoInternetAccess() {
Return numNoInternetAccessReports > 0 && !validatedInternetAccess;
}
再跟蹤numNoInternetAccessReports,在這點,分了多個方向,需要分析語法,最有可能走那一塊。
執行命令 grep numNoInternetAccessReports -rn ./frameworks/
目標在路徑如下所示:frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java +7648
需要研究這個函數public boolean processMessage(Message message) {}
查找這個函數 networkStatus()的調用之處。
在frameworks/base/core/java/android/net/NetworkAgent.java +194 case CMD_REPORT_NETWORK_STATUS: {
if (VDBG) {
log(“CMD_REPORT_NETWORK_STATUS(” +
(msg.arg1 == VALID_NETWORK ? “VALID)” : “INVALID)”));
}
networkStatus(msg.arg1);
接着跟蹤MD_REPORT_NETWORK_STATUS 在
frameworks/base/services/core/java/com/android/server/ConnectivityService.java +1988
接着跟蹤 case NetworkMonitor.EVENT_NETWORK_TESTED在
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java +360
查找這個類private class OfflineState extends State
private final State mOfflineState = new OfflineState()
再查找mOfflineState在
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java +487
研究transitionTo(mOfflineState) 這個函數
根本原因是由於isCaptivePortal()這個函數,定義之處路徑在
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java +635
查閱資料是去嘗試訪問android的一個網址,根據http返回來的值來判斷網絡是否連接通,其中返回為204時為正常,但由於國內屏蔽了這個網址,故在中國這個功能不適用,所以wifi信號有嘆號這個標志。
解決辦法是if (!mIsCaptivePortalCheckEnabled) return 204 讓這句成立,跟蹤代碼 調用之處在
mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1) == 1;
跟蹤Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED
路徑在
android-5.1-m200-mr1/frameworks/base/core/java/android/provider/Settings.java +6175
根據提示說明把上面的宏改成0即可關掉這個功能。我們遵循不改動android源碼的原則,不直接改動,
在/frameworks/base/packages/SettingsProvider/res/values/defaults.xml 中添加這樣一句話
1
在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +2648
添加loadIntegerSetting(stmt, Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, R.integer.def_captive_portal_detection_enabled);
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 這個文件是用來生成setting.db的。
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
一般把setting.db中各個表的出廠默認初始值放在這個文件中,在DatabaseHelper.java 中讀取。
接着在自己廠商的設備配置文件中添加device/ingenic/dorado/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
在這里面可以重新給宏初始化為0這個值,在編譯時先編譯android源碼,之后再編譯到這邊,這樣可以把之前的給覆蓋掉,以后在看代碼時能清楚地之道android默認配置是打開的為1。
0