芯片:RK3566
Android 11.0
路径:/frameworks/base/services/core/java/com/android/server/ConnectivityService.java
下面的修改本质是让wifi请求的时候每次都刷新,跟修改评分的方式有点不同
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
old mode 100644
new mode 100755
index eb925c343b6c..42184b1d9a0d
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -251,6 +251,10 @@ import java.util.SortedSet;
import java.util.StringJoiner;
import java.util.TreeSet;
import java.util.concurrent.atomic.AtomicInteger;
+import android.net.InterfaceConfiguration;
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
/**
* @hide
@@ -265,8 +269,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
private static final String REQUEST_ARG = "requests";
private static final boolean DBG = true;
- private static final boolean DDBG = Log.isLoggable(TAG, Log.DEBUG);
- private static final boolean VDBG = Log.isLoggable(TAG, Log.VERBOSE);
+ private static final boolean DDBG = true;//Log.isLoggable(TAG, Log.DEBUG);
+ private static final boolean VDBG = true;//Log.isLoggable(TAG, Log.VERBOSE);
+ // if true:
+ // wifi and ethernet can coexist, if wifi and ethernet connect together, prefered to use ethernet
+ // if false:
+ // wifi and ethernet can't coexist, if wifi and ethernet connect together, will tear down wifi
+ // TODO: still have bug in this case to fix (like can't reconnect wifi when ethernet disconnect)
private static final boolean LOGD_BLOCKED_NETWORKINFO = true;
@@ -1233,7 +1242,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
handleAlwaysOnNetworkRequest(
mDefaultMobileDataRequest,Settings.Global.MOBILE_DATA_ALWAYS_ON, true);
handleAlwaysOnNetworkRequest(mDefaultWifiRequest, Settings.Global.WIFI_ALWAYS_REQUESTED,
- false);
+ true); //
+ //false);//+++
}
private void registerSettingsCallbacks() {
@@ -3247,6 +3257,22 @@ public class ConnectivityService extends IConnectivityManager.Stub
// 2. If the network was lingering and there are now requests, unlinger it.
// 3. If this network is unneeded (which implies it is not lingering), and there is at least
// one lingered request, start lingering.
+ /* nai.updateLingerTimer();
+ if (nai.isLingering() && nai.numForegroundNetworkRequests() > 0) {
+ if (DBG) log("Unlingering " + nai.toShortString());
+ nai.unlinger();
+ logNetworkEvent(nai, NetworkEvent.NETWORK_UNLINGER);
+ } else if (unneeded(nai, UnneededFor.LINGER) && nai.getLingerExpiry() > 0) {
+ if (DBG) {
+ final int lingerTime = (int) (nai.getLingerExpiry() - now);
+ log("Lingering " + nai.toShortString() + " for " + lingerTime + "ms");
+ }
+ nai.linger();
+ logNetworkEvent(nai, NetworkEvent.NETWORK_LINGER);
+ return true;
+ }*/
+ //+++ fjh begin 20230206
+ /* //re-disable it fjh 20230209
nai.updateLingerTimer();
if (nai.isLingering() && nai.numForegroundNetworkRequests() > 0) {
if (DBG) log("Unlingering " + nai.toShortString());
@@ -3261,6 +3287,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
logNetworkEvent(nai, NetworkEvent.NETWORK_LINGER);
return true;
}
+ */ //re-disable it end fjh 20230209
+ //+++ fjh end 20230206
return false;
}
@@ -6671,7 +6699,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
private void teardownUnneededNetwork(NetworkAgentInfo nai) {
- if (nai.numRequestNetworkRequests() != 0) {
+ /* if (nai.numRequestNetworkRequests() != 0) {
for (int i = 0; i < nai.numNetworkRequests(); i++) {
NetworkRequest nr = nai.requestAt(i);
// Ignore listening requests.
@@ -6680,7 +6708,22 @@ public class ConnectivityService extends IConnectivityManager.Stub
break;
}
}
- nai.asyncChannel.disconnect();
+ nai.asyncChannel.disconnect(); */
+ //+++ fjh begin 20230206
+/*//re-disable it fjh 20230209
+ if (nai.numRequestNetworkRequests() != 0) {
+ for (int i = 0; i < nai.numNetworkRequests(); i++) {
+ NetworkRequest nr = nai.requestAt(i);
+ // Ignore listening requests.
+ if (nr.isListen()) continue;
+ loge("Dead network still had at least " + nr);
+ break;
+ }
+ }
+ nai.asyncChannel.disconnect();
+*/
+ //+++ fjh end
+ loge("hcq skip teardownUnneededNetwork: " + nai.network());
}
private void handleLingerComplete(NetworkAgentInfo oldNetwork) {
@@ -6777,7 +6820,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
public String toString() {
return mRequest.request.requestId + " : "
+ (null != mOldNetwork ? mOldNetwork.network.netId : "null")
- + " → " + (null != mNewNetwork ? mNewNetwork.network.netId : "null");
+ + " <E2><86>?" + (null != mNewNetwork ? mNewNetwork.network.netId : "null");
}
}
@@ -7242,6 +7285,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// This has to happen after matching the requests, because callbacks are just requests.
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_PRECHECK);
} else if (state == NetworkInfo.State.DISCONNECTED) {
+
networkAgent.asyncChannel.disconnect();
if (networkAgent.isVPN()) {
updateUids(networkAgent, networkAgent.networkCapabilities, null);
@@ -7405,7 +7449,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
protected void notifyNetworkCallbacks(NetworkAgentInfo networkAgent, int notifyType, int arg1) {
- if (VDBG || DDBG) {
+ if (VDBG || DDBG) {//
String notification = ConnectivityManager.getCallbackName(notifyType);
log("notifyType " + notification + " for " + networkAgent.toShortString());
}
Android9.0
old mode 100644
new mode 100755
index 4f4988e..2353ca2
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -762,6 +762,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
mDefaultMobileDataRequest = createDefaultInternetRequestForTransport(
NetworkCapabilities.TRANSPORT_CELLULAR, NetworkRequest.Type.BACKGROUND_REQUEST);
+ // The default WiFi request is a background request so that apps using WiFi are
+ // migrated to a better network (typically ethernet) when one comes up, instead
+ // of staying on WiFi forever.
+ mDefaultWifiRequest = createDefaultInternetRequestForTransport(
+ NetworkCapabilities.TRANSPORT_WIFI, NetworkRequest.Type.BACKGROUND_REQUEST);
+
+
mHandlerThread = new HandlerThread("ConnectivityServiceThread");
mHandlerThread.start();
mHandler = new InternalHandler(mHandlerThread.getLooper());
@@ -972,8 +979,29 @@ public class ConnectivityService extends IConnectivityManager.Stub
mHandler.sendEmptyMessage(EVENT_PRIVATE_DNS_SETTINGS_CHANGED);
}
- private void handleMobileDataAlwaysOn() {
+ private void handleAlwaysOnNetworkRequest(
+ NetworkRequest networkRequest, String settingName, boolean defaultValue) {
final boolean enable = toBool(Settings.Global.getInt(
+ mContext.getContentResolver(), settingName, encodeBool(defaultValue)));
+ final boolean isEnabled = (mNetworkRequests.get(networkRequest) != null);
+ if (enable == isEnabled) {
+ return; // Nothing to do.
+ }
+
+ if (enable) {
+ handleRegisterNetworkRequest(new NetworkRequestInfo(
+ null, networkRequest, new Binder()));
+ } else {
+ handleReleaseNetworkRequest(networkRequest, Process.SYSTEM_UID);
+ }
+ }
+
+ private void handleMobileDataAlwaysOn() {
+ handleAlwaysOnNetworkRequest(
+ mDefaultMobileDataRequest,Settings.Global.MOBILE_DATA_ALWAYS_ON, true);
+ handleAlwaysOnNetworkRequest(mDefaultWifiRequest, /*Settings.Global.WIFI_ALWAYS_REQUESTED*/"wifi_always_requested",
+ true);
+ /*final boolean enable = toBool(Settings.Global.getInt(
mContext.getContentResolver(), Settings.Global.MOBILE_DATA_ALWAYS_ON, 1));
final boolean isEnabled = (mNetworkRequests.get(mDefaultMobileDataRequest) != null);
if (enable == isEnabled) {
@@ -985,7 +1013,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
null, mDefaultMobileDataRequest, new Binder()));
} else {
handleReleaseNetworkRequest(mDefaultMobileDataRequest, Process.SYSTEM_UID);
- }
+ }*/
}
private void registerSettingsCallbacks() {
@@ -4627,6 +4655,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
// priority networks like Wi-Fi are active.
private final NetworkRequest mDefaultMobileDataRequest;
+ // Request used to optionally keep wifi data active even when higher
+ // priority networks like ethernet are active.
+ private final NetworkRequest mDefaultWifiRequest;
+
+
private NetworkAgentInfo getNetworkForRequest(int requestId) {
synchronized (mNetworkForRequestId) {
return mNetworkForRequestId.get(requestId);
在ui上看到以太网跟wifi正常链接后,还可以通过命令的方式查看
命令验证
# ip rule
注意这两行
10500: from all iif lo oif eth0 uidrange 0-0 lookup eth0
10500: from all iif lo oif wlan0 uidrange 0-0 lookup wlan0
表示所有输入数据包从eth0、wlan0输出,iif 表示输入接口,oif表示输出接口
10500表示网络优先级是同样的,数字越低优先级越高
rk356x_box:/ # ip rule
0: from all lookup local
10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system
10500: from all iif lo oif dummy0 uidrange 0-0 lookup dummy0
10500: from all iif lo oif eth0 uidrange 0-0 lookup eth0
10500: from all iif lo oif wlan0 uidrange 0-0 lookup wlan0
13000: from all fwmark 0x10063/0x1ffff iif lo lookup local_network
13000: from all fwmark 0x10064/0x1ffff iif lo lookup eth0
13000: from all fwmark 0x50065/0x5ffff iif lo lookup wlan0
14000: from all iif lo oif dummy0 lookup dummy0
14000: from all iif lo oif eth0 lookup eth0
14000: from all fwmark 0x40000/0x40000 iif lo oif wlan0 lookup wlan0
15000: from all fwmark 0x0/0x10000 lookup legacy_system
16000: from all fwmark 0x0/0x10000 lookup legacy_network
17000: from all fwmark 0x0/0x10000 lookup local_network
19000: from all fwmark 0x64/0x1ffff iif lo lookup eth0
22000: from all fwmark 0x0/0xffff iif lo lookup eth0
23000: from all fwmark 0x0/0xffff uidrange 0-0 lookup main
32000: from all unreachable
rk356x_box:/ # ip route
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.69
192.168.6.0/24 dev wlan0 proto kernel scope link src 192.168.6.124
rk356x_box:/ #
rk356x_box:/ #
后续
如果后面要增加4G联网,也可以参考这种方式