Android12展锐平台,以太网图标偶现消失问题处理

在做展锐平台的系统开发,需求要求做一个以太网开关,方便使用以太网。硬件部门焊接上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);
+
         }
     }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值