在做展锐平台的系统开发,需求要求做一个以太网开关,方便使用以太网。硬件部门焊接上usb转网口后,我这边进行应用层的实现,测试发现,开启以太网时,以太网图标会出现消失的问题。最后怎么解决的呢?
android12基线版本是插入网线后,底层上报事件,然后出现以太网图标。因为设备是硬件自定义的。不能触发。我们先看开关实现
1.设置中增加switch开关(略)
2.通过adb 修改以太网开关
//echo onotg > /sys/devices/platform/soc/soc:ap-ahb/20200000.usb/mode_switch
//echo offotg > /sys/devices/platform/soc/soc:ap-ahb/20200000.usb/mode_switch
//echo onnet > /sys/devices/platform/soc/soc:ap-ahb/20200000.usb/mode_switch
//echo offnet > /sys/devices/platform/soc/soc:ap-ahb/20200000.usb/mode_switch
//mode{onotg,offotg,onnet,offnet}
private static void write(String mode){
try {
String path = "/sys/devices/platform/soc/soc:ap-ahb/20200000.usb/mode_switch";
String[] cmd = {"sh","-c", "echo " + mode + " > " + path};
Runtime runtime = Runtime.getRuntime();
java.lang.Process process = runtime.exec(cmd);
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
android.util.Log.e("ytw", "fengpj hook_status");
while (null != (line = br.readLine())) {
android.util.Log.d("ytw", "line=" + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static String read() {
try {
String path = "/sys/devices/platform/soc/soc:ap-ahb/20200000.usb/mode_switch";
Runtime runtime = Runtime.getRuntime();
java.lang.Process process = runtime.exec("cat " + path);
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while (null != (line = br.readLine())) {
return line;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
测试发现若不请求网络,以太网图标会消失。请求又出现,看log如下
M01E78D 06-17 11:44:14.626 1120 1252 D ConnectivityService: [101 ETHERNET] EVENT_NETWORK_INFO_CHANGED, going from CONNECTED to DISCONNECTED
M01F9E0 06-17 11:44:22.422 1120 1252 D ConnectivityService: [102 ETHERNET] EVENT_NETWORK_INFO_CHANGED, going from CONNECTING to CONNECTED
M023EAC 06-17 11:44:42.829 1120 1252 D ConnectivityService: [102 ETHERNET] EVENT_NETWORK_INFO_CHANGED, going from CONNECTED to DISCONNECTED
M0259C6 06-17 11:44:54.882 1120 1252 D ConnectivityService: [103 ETHERNET] EVENT_NETWORK_INFO_CHANGED, going from CONNECTING to CONNECTED
(20240617T06:52:53)
发现以太网图标消失,网络断开;以太网图标显示,网络连接。
因为android12基线版本,是直接插入usb以太网,事件由底层通知上层,图标直接显示,且稳定存在。我们的实现方式是通过通过写sys/devices/platform/soc/soc:ap-ahb/20200000.usb/mode_switch后log如下
//设置中开启ethernet,通过写sys/devices/platform/soc/soc:ap-ahb/20200000.usb/mode_switch
M01AEC6 07-03 13:52:00.358 1910 1910 D EthernetPreferenceController: handlePreferenceTreeClick: usb_ethernet
E01AEDB 07-03 13:52:00.373 1910 1910 I sysui_multi_action: [757,853,758,4,854,network.NetworkDashboardFragment/usb_ethernet,1089,1]
M01AEE0 07-03 13:52:00.376 1910 1910 D EthernetPreferenceController: changeState: currentState is = true
E01AEE6 07-03 13:52:00.376 1910 1910 I sysui_multi_action: [757,830,758,4,833,0,854,usb_ethernet,1089,0]
M01AF08 07-03 13:52:00.399 5195 5195 I sh : type=1400 audit(0.0:1557): avc: denied { open } for path="/sys/devices/platform/soc/soc:ap-ahb/20200000.usb/mode_switch" dev="sysfs" ino=42522 scontext=u:r:system_app:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1
M01AC5E 07-03 13:51:58.732 1119 3192 D ConnectivityService: requestNetwork for uid/pid:1000/1910 activeRequest: null callbackRequest: 46 [NetworkRequest [ REQUEST id=47, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VCN_MANAGED Uid: 1000 RequestorUid: 1000 RequestorPkg: com.android.settings] ]] callback flags: 0 priority: 2147483647
M01AC7A 07-03 13:51:58.777 1119 1174 D ConnectivityService: requestNetwork for uid/pid:1000/1910 activeRequest: null callbackRequest: 49 [NetworkRequest [ REQUEST id=50, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VCN_MANAGED Uid: 1000 RequestorUid: 1000 RequestorPkg: com.android.settings] ]] callback flags: 0 priority: 2147483647
M01AC8F 07-03 13:51:58.795 1119 1174 D ConnectivityService: requestNetwork for uid/pid:1000/1910 activeRequest: null callbackRequest: 52 [NetworkRequest [ REQUEST id=53, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VCN_MANAGED Uid: 1000 RequestorUid: 1000 RequestorPkg: com.android.settings] ]] callback flags: 1 priority: 2147483647
M01B0B7 07-03 13:52:01.850 1119 1174 D ConnectivityService: requestNetwork for uid/pid:1000/1910 activeRequest: null callbackRequest: 55 [NetworkRequest [ REQUEST id=56, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VCN_MANAGED Uid: 1000 RequestorUid: 1000 RequestorPkg: com.android.settings] ]] callback flags: 0 priority: 2147483647
M01B0D6 07-03 13:52:01.870 1119 1218 D ConnectivityService: requestNetwork for uid/pid:1000/1910 activeRequest: null callbackRequest: 58 [NetworkRequest [ REQUEST id=59, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VCN_MANAGED Uid: 1000 RequestorUid: 1000 RequestorPkg: com.android.settings] ]] callback flags: 1 priority: 2147483647
M01AF77 07-03 13:52:01.589 1119 1456 D EthernetNetworkFactory: updateInterfaceLinkState, iface: eth0, up: false
M01B17B 07-03 13:52:03.076 1119 1177 I EthernetTracker: interfaceLinkStateChanged, iface: eth0, up: true
M01B17D 07-03 13:52:03.077 1119 1456 D EthernetNetworkFactory: updateInterfaceLinkState, iface: eth0, up: true
M01B1DE 07-03 13:52:03.485 1119 1422 D ConnectivityService: [100 ETHERNET] EVENT_NETWORK_INFO_CHANGED, going from CONNECTING to CONNECTING
M01B1DF 07-03 13:52:03.486 1119 1422 D ConnectivityService: [100 ETHERNET] EVENT_NETWORK_INFO_CHANGED, going from CONNECTING to CONNECTED
M01B247 07-03 13:52:03.568 1119 1422 D ConnectivityService: Switching to new default network for: uid/pid:1000/1119 activeRequest: 1 callbackRequest: 1 [NetworkRequest [ REQUEST id=1, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&NOT_VCN_MANAGED RequestorUid: 1000 RequestorPkg: android] ]] callback flags: 1 priority: 2147483647 using NetworkAgentInfo{network{100} handle{432902426637} ni{Ethernet CONNECTED extra: 92:6e:87:0f:da:7a} Score(70 ; KeepConnected : 0 ; Policies : IS_UNMETERED) lp{{InterfaceName: eth0 LinkAddresses: [ fe80::dd8a:3003:a8c4:3ca6/64,192.168.1.110/24 ] DnsAddresses: [ /192.168.1.1 ] Domains: null MTU: 0 ServerAddress: /192.168.1.1 TcpBufferSizes: 524288,1048576,3145728,524288,1048576,2097152 Routes: [ fe80::/64 -> :: eth0 mtu 0,192.168.1.0/24 -> 0.0.0.0 eth0 mtu 0,0.0.0.0/0 -> 192.168.1.1 eth0 mtu 0 ]}} nc{[ Transports: ETHERNET Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED&NOT_VCN_MANAGED LinkUpBandwidth>=100000Kbps LinkDnBandwidth>=100000Kbps]}}
M01B52B 07-03 14:57:50.650 1119 5336 D ConnectivityService: requestNetwork for uid/pid:10049/5339 activeRequest: null callbackRequest: 60 [NetworkRequest [ REQUEST id=61, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VCN_MANAGED Uid: 10049 RequestorUid: 10049 RequestorPkg: com.android.statementservice] ]] callback flags: 0 priority: 2147483647
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: java.lang.Throwable
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at com.android.server.ethernet.EthernetNetworkFactory$NetworkInterfaceState.stop(EthernetNetworkFactory.java:525)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at com.android.server.ethernet.EthernetNetworkFactory.releaseNetworkFor(EthernetNetworkFactory.java:120)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.net.NetworkFactoryImpl.handleRemoveRequest(NetworkFactoryImpl.java:258)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.net.NetworkFactoryImpl.access$100(NetworkFactoryImpl.java:48)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.net.NetworkFactoryImpl$1.onNetworkUnneeded(NetworkFactoryImpl.java:122)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.net.NetworkProvider$NetworkOfferCallbackProxy.lambda$onNetworkUnneeded$1$NetworkProvider$NetworkOfferCallbackProxy(NetworkProvider.java:209)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.net.NetworkProvider$NetworkOfferCallbackProxy$$ExternalSyntheticLambda1.run(Unknown Source:4)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.os.Handler.handleCallback(Handler.java:938)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.os.Handler.dispatchMessage(Handler.java:99)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.os.Looper.loopOnce(Looper.java:201)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.os.Looper.loop(Looper.java:288)
M01B538 07-03 14:57:50.700 1119 1456 D EthernetNetworkFactory20240624: at android.os.HandlerThread.run(HandlerThread.java:67)
M01B539 07-03 14:57:50.701 1738 1772 D IpClient20240624: java.lang.Throwable
M01B539 07-03 14:57:50.701 1738 1772 D IpClient20240624: at android.net.ip.IpClient.stop(IpClient.java:944)
M01B539 07-03 14:57:50.701 1738 1772 D IpClient20240624: at android.net.ip.IpClient.shutdown(IpClient.java:914)
M01B539 07-03 14:57:50.701 1738 1772 D IpClient20240624: at android.net.ip.IpClient$IpClientConnector.shutdown(IpClient.java:770)
M01B539 07-03 14:57:50.701 1738 1772 D IpClient20240624: at android.net.ip.IIpClient$Stub.onTransact(IIpClient.java:154)
M01B539 07-03 14:57:50.701 1738 1772 D IpClient20240624: at android.os.Binder.execTransactInternal(Binder.java:1185)
M01B539 07-03 14:57:50.701 1738 1772 D IpClient20240624: at android.os.Binder.execTransact(Binder.java:1143)
M01B53A 07-03 14:57:50.702 1738 5246 D IpClient: processMessage.msg.what:2
M01B53B 07-03 14:57:50.704 1738 5246 D IpClient.eth0: CMD_STOP eth0/32 1 0 null [rcvd_in=RunningState, proc_in=RunningState]
M01B53C 07-03 14:57:50.704 1738 5246 D IpClient: RunningState.exit() run---
M01B53D 07-03 14:57:50.704 1738 5246 D DhcpClient: doQuit
M01B564 07-03 14:57:50.835 1119 1422 D ConnectivityService: [100 ETHERNET] EVENT_NETWORK_INFO_CHANGED, going from CONNECTED to DISCONNECTED
(2024-07-04T11:38:59Z)
原因:
android12基线版本是以太网的硬件插入事件是会触发上层以太网的建立,对于上层来说就会有一个networkRequest。
而现在触发以太网开关逻辑,执行的非原生逻辑,即使检测到插入了以太网也不走这个流程,系统总是缺少一个request请求,而是靠settings中开关去开启以太网,这样networkRequest就总是少一个。
以上我们知道原因,解决方案就是:那么我们在EthernetNetworkFactory中断开网络的地方,增加开关条件判断就可以了。修改如下:
diff --git a/java/com/android/server/ethernet/EthernetNetworkFactory.java b/java/com/android/server/ethernet/EthernetNetworkFactory.java
index 28b24f1..a71fe9e 100644
--- a/java/com/android/server/ethernet/EthernetNetworkFactory.java
+++ b/java/com/android/server/ethernet/EthernetNetworkFactory.java
@@ -51,6 +51,7 @@ import com.android.internal.util.IndentingPrintWriter;
import java.io.FileDescriptor;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
+import android.os.SystemProperties;
/**
* {@link NetworkFactory} that represents Ethernet networks.
@@ -108,6 +109,8 @@ public class EthernetNetworkFactory extends NetworkFactory {
}
}
+ private final static String ETHERNET_STATE_CLOSE = "0";
+
@Override
protected void releaseNetworkFor(NetworkRequest networkRequest) {
NetworkInterfaceState network = networkForRequest(networkRequest);
@@ -117,7 +120,20 @@ public class EthernetNetworkFactory extends NetworkFactory {
}
if (--network.refCount == 0) {
- network.stop();
+ //若网络连接数量==0,增加以太网开关表示判断,且关闭时,逻辑执行
+ String ethernetState=SystemProperties.get("persist.flyscale.ethernet","0");
+ Log.e(TAG, "releaseNetworkFor, current ethernetState is:" + ethernetState);
+ if (ETHERNET_STATE_CLOSE.equals(ethernetState)) {
+ Log.e(TAG, "releaseNetworkFor, current ethernetState is close ,then stop the network");
+ //以太网开关关闭
+ network.stop();
+ }else {
+ Log.e(TAG, "releaseNetworkFor, current ethernetState is open ,network is not stop");
+
+ }
+ }else {
+ Log.e(TAG, "releaseNetworkFor, network.refCount is not 0,the truth is:"+ network.refCount);
+
}
}