主要问题有两个,一个是空对象导致系统崩溃,另一个是关闭以太网共享之后无法正常通过网线上网。
1、空对象问题
AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: EthernetServiceThread
AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
AndroidRuntime: at java.util.concurrent.ConcurrentHashMap.replaceNode(ConcurrentHashMap.java:1116)
AndroidRuntime: at java.util.concurrent.ConcurrentHashMap.remove(ConcurrentHashMap.java:1107)
AndroidRuntime: at com.android.server.ethernet.EthernetNetworkFactory.removeInterface(EthernetNetworkFactory.java:180)
AndroidRuntime: at com.android.server.ethernet.EthernetTracker.removeInterface(EthernetTracker.java:255)
AndroidRuntime: at com.android.server.ethernet.EthernetTracker.setDefaultInterfaceMode(EthernetTracker.java:243)
AndroidRuntime: at com.android.server.ethernet.EthernetTracker.lambda$requestTetheredInterface$1$EthernetTracker(EthernetTracker.java:205)
AndroidRuntime: at com.android.server.ethernet.-$$Lambda$EthernetTracker$KD8BAMBorDgrTMycLSi9_RuhKm8.run(Unknown Source:4)
AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:883)
AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:100)
AndroidRuntime: at android.os.Looper.loop(Looper.java:214)
AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:67)
AndroidRuntime: FATAL EXCEPTION: main
AndroidRuntime: Process: com.android.phone, PID: 1216
AndroidRuntime: DeadSystemException: The system died; earlier logs will point to the root cause
其实这个问题相对来说比较严重,首先在出异常的地方加上 try catch 捕获异常,结果定位到了
framework/base/services/core/java/com/android/server/NetworkManagementService.java
@Override
public InterfaceConfiguration getInterfaceConfig(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
...
于是在方法开始前打印了下 iface,结果发现这里传了个 null,加上判空处理就好了。
修改如下:
services/core/java/com/android/server/NetworkManagementService.java
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index ba71d73..51c62f3 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -793,8 +793,18 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override
public InterfaceConfiguration getInterfaceConfig(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
+ if (iface == null) {
+ Log.e(TAG, "flyscale iface == null, return null");
+ return null;
+ }
final InterfaceConfigurationParcel result;
try {
+ Log.e(TAG, "flyscale getInterfaceConfig " + iface);
+ if (mNetdService == null) {
+ Log.e(TAG, "flyscale mNetdService == null");
+ return null;
+ }
+ Log.e(TAG, "flyscale mNetdService" + mNetdService);
result = mNetdService.interfaceGetCfg(iface);
} catch (RemoteException | ServiceSpecificException e) {
throw new IllegalStateException(e);
@@ -828,17 +838,25 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override
public void setInterfaceDown(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
- final InterfaceConfiguration ifcg = getInterfaceConfig(iface);
- ifcg.setInterfaceDown();
- setInterfaceConfig(iface, ifcg);
+ try {
+ final InterfaceConfiguration ifcg = getInterfaceConfig(iface);
+ ifcg.setInterfaceDown();
+ setInterfaceConfig(iface, ifcg);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
@Override
public void setInterfaceUp(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
- final InterfaceConfiguration ifcg = getInterfaceConfig(iface);
- ifcg.setInterfaceUp();
- setInterfaceConfig(iface, ifcg);
+ try {
+ final InterfaceConfiguration ifcg = getInterfaceConfig(iface);
+ ifcg.setInterfaceUp();
+ setInterfaceConfig(iface, ifcg);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
@Override
2、关闭以太网共享之后无法正常通过网线上网
这个经添加日志发现,是在
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
这里定义了两个变量,一个是作为客户端,一个是作为服务端,在关闭以太网共享功能之后应该切换到client就对了,于是在更新状态的地方加了自己的判断方法。
private static final int INTERFACE_MODE_CLIENT = 1;
private static final int INTERFACE_MODE_SERVER = 2;
private void updateInterfaceState(String iface, boolean up) {
- final int mode = getInterfaceMode(iface);
+ // final int mode = getInterfaceMode(iface);
+ int mode = getInterfaceMode(iface);
+ Log.d(TAG, "flyscale update interface state " + iface);
+ if ("eth0".equals(iface)) {
+ if (SystemProperties.get("lan_network_on", "0").equals("1")) {
+ mode = INTERFACE_MODE_CLIENT;
+ } else {
+ mode = INTERFACE_MODE_SERVER;
+ }
+ }
+
final boolean factoryLinkStateUpdated = (mode == INTERFACE_MODE_CLIENT)
&& mFactory.updateInterfaceLinkState(iface, up);
@@ -326,7 +341,6 @@ final class EthernetTracker {
}
mListeners.finishBroadcast();
}
-
updateServerModeInterfaceState(iface, up, mode);