移植EthernetSettings
Android 13 在Settings搜索没有发现以太网设置,应该是移除了,但是客户的设备需要,所以移植Android 11的.
以太网相关的功能在Android13中进行模块化,提取到packages/modules/Connectivity/中,
EthernetManager相关代码从framework移到packages/modules/Connectivity/下.
Android 13 internet界面有无网络,会显示不同的界面!
--- a/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java
+++ b/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java
@@ -16,11 +16,16 @@
package com.android.server.ethernet;
+import static android.net.EthernetManager.ETHERNET_STATE_DISABLED;
+import static android.net.EthernetManager.ETHERNET_STATE_ENABLED;
import static android.net.NetworkCapabilities.TRANSPORT_TEST;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
@@ -63,6 +69,14 @@ public class EthernetServiceImpl extends IEthernetManager.Stub {
mContext = context;
mHandler = handler;
mTracker = tracker;
+ //add xxx
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction("xx.action.xx.ethernet.open");
+ intentFilter.addAction("xx.action.xx.ethernet.close");
+ mEthernetSwitchBroadcast = new EthernetSwitchBroadcastReceiver();
+ context.registerReceiver(mEthernetSwitchBroadcast, intentFilter);
+ //add xxx
+
}
private void enforceAutomotiveDevice(final @NonNull String methodName) {
@@ -77,9 +91,63 @@ public class EthernetServiceImpl extends IEthernetManager.Stub {
public void start() {
Log.i(TAG, "Starting Ethernet service");
- mTracker.start();
- mStarted.set(true);
+ //add xxx
+ //mTracker.start();
+ //mStarted.set(true);
+ mEthernetState = getEthernetState();
+ boolean is_enabled = false;
+ if (mEthernetState == ETHERNET_STATE_ENABLED) {
+ is_enabled = true;
+ }
+ mTracker.start(is_enabled);
+ mStarted.set(is_enabled);
+ //add xxx
+ }
+
+ //add xxx
+ private EthernetSwitchBroadcastReceiver mEthernetSwitchBroadcast;
+ private int mState = -1;
+ private int mEthernetState; //-1 init 0 disable 1 enable
+
+ private int getEthernetState() {
+ int state = SystemProperties.getInt("xxx_ethernet_on", 0);
+ return state;
+ }
+
+ private void setEthernetState(int state) {
+ //SystemProperties.set("xxx__ethernet_on", state + "");
+ }
+
+ public synchronized void setState(int state) {
+ Log.i(TAG, "setState from mState=" + mState + " to state=" + state);
+ if (mState != state) {
+ mState = state;
+ if (state == ETHERNET_STATE_DISABLED) {
+ //setEthernetState(ETHERNET_STATE_DISABLED);
+ mTracker.setIntefaceState(false);
+ mStarted.set(false);
+ } else {
+ //setEthernetState(ETHERNET_STATE_ENABLED);
+ mTracker.setIntefaceState(true);
+ mStarted.set(true);
+ }
+ }
+ }
+
+ class EthernetSwitchBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ Log.d(TAG, "EthernetSwitchBroadcastReceiver action:" + action);
+ if (action.equals("xx.action.xx.ethernet.open")) {
+ setState(ETHERNET_STATE_ENABLED);
+ } else if (action.equals("xx.action.xx.ethernet.close")) {
+ setState(ETHERNET_STATE_DISABLED);
+ }
+
+ }
}
+ //add xxx
private void throwIfEthernetNotStarted() {
if (!mStarted.get()) {
diff --git a/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetTracker.java b/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetTracker.java
index 1c02a6625f..34c8c8dc8d 100644
--- a/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetTracker.java
+++ b/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetTracker.java
@@ -43,6 +43,7 @@ import android.os.Handler;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
+import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
@@ -173,7 +174,12 @@ public class EthernetTracker {
mConfigStore = new EthernetConfigStore();
}
+ //add xxx
void start() {
+ start(true);
+ }
+
+ void start(boolean isEnabled) {
mFactory.register();
mConfigStore.read();
@@ -191,8 +197,31 @@ public class EthernetTracker {
Log.e(TAG, "Could not register InterfaceObserver " + e);
}
- mHandler.post(this::trackAvailableInterfaces);
+ if (isEnabled) {
+ mHandler.post(this::trackAvailableInterfaces);
+ }
+ }
+
+ public synchronized void setIntefaceState(boolean isFaceUp) {
+ try {
+ String[] interfaces = getInterfaces(true);
+ for (String iface : interfaces) {
+ if (isTrackingInterface(iface)) {
+ if (isFaceUp) {
+ NetdUtils.setInterfaceUp(mNetd, iface);
+ } else {
+ NetdUtils.setInterfaceDown(mNetd, iface);
+ }
+ }
+ }
+ if (isFaceUp) {
+ mHandler.post(this::trackAvailableInterfaces);
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Error change eth isFaceUp : " + isFaceUp);
+ }
}
+ //add xxx
void updateIpConfiguration(String iface, IpConfiguration ipConfiguration) {
if (DBG) {
@@ -521,7 +550,7 @@ public class EthernetTracker {
}
final String hwAddress = config.hwAddr;
-
+ Settings.System.putString(mContext.getContentResolver(), "sys_tex_hwAddress", hwAddress);//add xx xx
NetworkCapabilities nc = mNetworkCapabilities.get(iface);
if (nc == null) {
// Try to resolve using mac address
Android13 有线网开关研究
Android13 原生以太网实现设置静态IP
Android13 MTK平台添加以太网设置静态IP菜单
问题补充:再/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/
目录下,
想利用SystemProperties.set()保存数据,但是编译报错,error: cannot find symbol
,但是我明明导入了!
为什么这么确认我导入,因为还引用了SystemProperties.getInt().然后控制变量,定位到问题是SystemProperties.set()无法再这个目录使用.
为什么会有这个问题呢?我百度大法,有了一些大致的猜想!然后去查看了它的Android.bp
packages/modules/Connectivity/service-t/Android.bp
// This builds T+ services depending on framework-connectivity-t
// hidden symbols separately from the S+ services, to ensure that S+
// services cannot accidentally depend on T+ hidden symbols from
// framework-connectivity-t.
java_library {
name: "service-connectivity-tiramisu-pre-jarjar",
sdk_version: "system_server_current",
// TODO(b/210962470): Bump this to at least S, and then T.
min_sdk_version: "30",
srcs: [
":service-connectivity-tiramisu-sources",
],
libs: [
问题可能关于sdk_version这个属性有关!
当然上面的都只是猜测,只是做个记录,为什么无法编译的bug还没解决.
然后去询问大佬,大佬提供一个思路,让我用反射去调用它,确实编译通过了,数据也能保存.
(ps:我太执着于解决那个编译报错,而忘记了自己的目的!目的是啥,是利用SystemProperties.set()保存数据,
既然(正常)固定的调用方式编译报错,然后一时半会又搞不定编译报错(难点:报错信息不够明确,无法定位).
应该先去想还有什么其它的方式可能调用SystemProperties.set(),先达成目的,然后再回来想想那个编译报错.)
+++ b/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetTracker.java
+import java.lang.reflect.Method;
@@ -551,6 +552,7 @@ public class EthernetTracker {
final String hwAddress = config.hwAddr;
+ setProperty("sys.xxx.xxx",hwAddress);
NetworkCapabilities nc = mNetworkCapabilities.get(iface);
if (nc == null) {
// Try to resolve using mac address
@@ -578,6 +580,17 @@ public class EthernetTracker {
}
}
+ //add text
+ private void setProperty(String key, String value){
+ try {
+ Class<?> c = Class.forName("android.os.SystemProperties");
+ Method method = c.getMethod("set",String.class,String.class);
+ method.invoke(c,key,value);
+ }catch (Exception e){
+ Log.d(TAG,"xxxxxxxxxx");
+ }
+ }
+ //add text
大佬的博客,感谢大佬
Android 使用反射机制获取或设置系统属性
Android高版本源码编译提示error: cannot find symbol
内置 APP 如何访问隐藏 API
Ethernet更新
新增以太网打开关闭的函数
./packages/modules/Connectivity/framework-t/src/android/net/EthernetManager.java
@RequiresPermission(anyOf = {
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
android.Manifest.permission.NETWORK_STACK,
android.Manifest.permission.NETWORK_SETTINGS})
@SystemApi(client = MODULE_LIBRARIES)
public void setEthernetEnabled(boolean enabled) {
try {
mService.setEthernetEnabled(enabled);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
//需要权限和系统应用签名(SystemApi)
标签:13,service,import,void,Connectivity,ethernet,Ethernet,EthernetSettings,android
From: https://www.cnblogs.com/kato-T/p/18351226