Android 7.1以太网/有线网Ethernet功能开发

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1. 功能介绍

以太网的功能是允许设备提供硬件接口通过插入网线的形式访问互联网的功能。接入网线之后,设备可以动态的获取IPDNSGateway等一系列网络属性,我们也可以手动配置设备的网络属性,使用静态配置参数。Google已经有一套现成的机制使用有线网,但没有涉及有线网配置的功能,本文主要介绍如何Google现有机制的基础上实现静态网络的配置。本文基于高通MSM8953 Android 7.1平台进行开发,通过配置eth0网口的IPDNSGateway三个参数,实现上网功能,若是其他平台或者非高通平台,可以当作参考。


2. 动态获取网络参数

此部分Google已经做好,当接入网线之后,在SystemBar中会出现有线网介入图标(<--->),此时设备已经接入有线网络,可以正常上网。


3. 手动配置网络参数(重点)

首先先来介绍一下相关java类:

1frameworks/base/core/java/android/net/IpConfiguration.java

IP状态配置,动态或者是静态,之后会介绍

2frameworks/base/core/java/android/net/StaticIpConfiguration.java

静态IP配置相关类,主要用于配置静态IP

3frameworks/base/core/java/android/net/EthernetManager.java

上层配置IP的管理类,可以通过context.getSystemService(Context.ETHERNET_SERVICE)获得。

4frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java

通过实现IEthernetManager.aidl接口来处理一些远程的以太网请求。

5frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java

以太网网络链接的管理类。

具体介绍之前,先来看一张简单配置UML的流程图,方便接下来的讲解.

接下来对照流程图逐步进行讲解。



3.1 输入相关配置信息

我们自己的项目中是通过配置eth0IPDNSGateway来配置静态网络参数的。可以自己开发相应界面,让用户手动输入相关信息即可。

这一步不涉及配置代码,仅仅是获取用户的想要设置的配置信息。


3.2 获取IpConfiguration配置参数

首先我们需要将相关配置信息转化为StaticIpConfiguration,转化之前,先介绍两个枚举类:


   
  1. public enum IpAssignment {
  2. /* Use statically configured IP settings. Configuration can be accessed
  3. * with staticIpConfiguration */
  4. STATIC,
  5. /* Use dynamically configured IP settigns */
  6. DHCP,
  7. /* no IP details are assigned, this is used to indicate
  8. * that any existing IP settings should be retained */
  9. UNASSIGNED
  10. }

   
  1. public enum ProxySettings {
  2. /* No proxy is to be used. Any existing proxy settings
  3. * should be cleared. */
  4. NONE,
  5. /* Use statically configured proxy. Configuration can be accessed
  6. * with httpProxy. */
  7. STATIC,
  8. /* no proxy details are assigned, this is used to indicate
  9. * that any existing proxy settings should be retained */
  10. UNASSIGNED,
  11. /* Use a Pac based proxy.
  12. */
  13. PAC
  14. }

这两个枚举类型在IpConfiguration类中,具体作用上面代码部分的注释也写明了。下面是将配置信息转化为StaticIpConfiguration的方法:


   
  1. private StaticIpConfiguration validateIpConfigFields(String ip,String dns,String gateway) {
  2. StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration();
  3. //analysis ip address
  4. Inet4Address inetAddr = getIPv4Address(ip);
  5. if (inetAddr == null || inetAddr.equals(Inet4Address.ANY)) {
  6. return - 1;
  7. }
  8. staticIpConfiguration.ipAddress = new LinkAddress(inetAddr, DEFAULT_PREFIX_LENGTH);
  9. //analysis gateway address
  10. InetAddress gatewayAddr = getIPv4Address(gateway);
  11. if (gatewayAddr == null) {
  12. return - 1;
  13. }
  14. if (gatewayAddr.isMulticastAddress()) {
  15. return - 1;
  16. }
  17. staticIpConfiguration.gateway = gatewayAddr;
  18. //analysis dns address
  19. InetAddress dnsAddr = getIPv4Address(dns);
  20. if (dnsAddr == null) {
  21. return - 1;
  22. }
  23. staticIpConfiguration.dnsServers.add(dnsAddr);
  24. return staticIpConfiguration;
  25. }


   
  1. private Inet4Address getIPv4Address(String text) {
  2. try {
  3. return (Inet4Address) NetworkUtils.numericToInetAddress(text);
  4. } catch (IllegalArgumentException | ClassCastException e) {
  5. Log.e(TAG, "getIPv4Address fail");
  6. return null;
  7. }
  8. }

其中DEFAULT_PREFIX_LENGTH默认值是24,参考来自于Wifi模块。至此,我们就将用户输入的IPDNSGateway转化为需要的StaticIpConfiguration

由于最终调用EthernetManagersetConfiguration函数时传递的参数类型是IpConfiguration,查看StaticIpConfiguration,发现StaticIpConfiguration并不是IpConfiguration的子类,所以我们需要在将StaticIpConfiguration转化为IpConfiguration,查看IpConfiguration代码,发现IpConfiguration的构造函数中含有StaticIpConfiguration参数,另外,我们可以通过setStaticIpConfiguration改变IpConfiguration。这里我们选择前者,直接使用StaticIpConfiguration传入IpConfiguration的构造函数创建IpConfiguration对象,先看一下IpConfiguration的构造函数:


   
  1. private void init(IpAssignment ipAssignment,
  2. ProxySettings proxySettings,
  3. StaticIpConfiguration staticIpConfiguration,
  4. ProxyInfo httpProxy) {
  5. this.ipAssignment = ipAssignment;
  6. this.proxySettings = proxySettings;
  7. this.staticIpConfiguration = (staticIpConfiguration == null) ?
  8. null : new StaticIpConfiguration(staticIpConfiguration);
  9. this.httpProxy = (httpProxy == null) ?
  10. null : new ProxyInfo(httpProxy);
  11. }
  12. public IpConfiguration() {
  13. init(IpAssignment.UNASSIGNED, ProxySettings.UNASSIGNED, null, null);
  14. }
  15. public IpConfiguration(IpAssignment ipAssignment,
  16. ProxySettings proxySettings,
  17. StaticIpConfiguration staticIpConfiguration,
  18. ProxyInfo httpProxy) {
  19. init(ipAssignment, proxySettings, staticIpConfiguration, httpProxy);
  20. }

可以看出,无论是有参的构造函数还是无参的构造函数,最终都会调用IpConfigurationinit函数进行初始化配置。我们使用的是IpConfiguration中有参的构造函数,其中参数IpAssignmentProxySettings是枚举类型,我们需要配置静态地址,所以应该传入IpAssignment.STATICProxySettings.STATIC,第三个参数传入StaticIpConfiguration,第四个参数ProxyInfo传入空即可,不需要设置代理。


   
  1. mIpAssignment = IpAssignment.STATIC;
  2. mProxySettings = ProxySettings.STATIC;
  3. mStaticIpConfiguration = validateIpConfigFields(ip,dns,gateway); // 注意此处的参数应正确配置
  4. IpConfiguration ipconfig = new IpConfiguration(mIpAssignment,mProxySettings,mStaticIpConfiguration, null);


3.3 通过Ethernet发出配置命令

获取IpConfiguration之后,我们就可以调用EthernetManagersetConfiguration开始进行静态网络配置:


   
  1. /**
  2. * Set Ethernet configuration.
  3. */
  4. public void setConfiguration(IpConfiguration config) {
  5. try {
  6. mService.setConfiguration(config);
  7. } catch (RemoteException e) {
  8. throw e.rethrowFromSystemServer();
  9. }
  10. }

查看设置代码,函数会调用mServicesetConfiguration并且可能会抛出RemoteException。说明这一操作应该是远程aidl的调用,跟踪代码发现mService的类型为EthernetServiceImpl,并且实现了IEthernetManager.aidl接口。


3.4 EthernetServiceImpl处理请求

查看 EthernetServiceImpl中的设置函数:


   
  1. /**
  2. * Set Ethernet configuration
  3. */
  4. @Override
  5. public void setConfiguration(IpConfiguration config) {
  6. if (!mStarted.get()) {
  7. Log.w(TAG, "System isn't ready enough to change ethernet configuration");
  8. }
  9. enforceConnectivityInternalPermission();
  10. synchronized (mIpConfiguration) {
  11. mEthernetConfigStore.writeIpAndProxyConfigurations(config);
  12. // TODO: this does not check proxy settings, gateways, etc.
  13. // Fix this by making IpConfiguration a complete representation of static configuration.
  14. if (!config.equals(mIpConfiguration)) {
  15. mIpConfiguration = new IpConfiguration(config);
  16. mTracker.stop();
  17. mTracker.start(mContext, mHandler);
  18. }
  19. }
  20. }

代码中EthernetConfigStore将会把IpConfiguration的配置信息写入配置文件。进入EthernetConfigStore发现writeIpAndProxyConfigurations最后会调用EthernetConfigStore父类writeIpAndProxyConfigurations方法将配置信息写入配置文件。

之后判断当前地址是否跟配置地址一样,若不一样,则进行新地址的配置,由于配置信息已经通过EthernetConfigStore写入配置文件,mTracker也即EthernetNetworkFactory就会重启当前网络。这部分的逻辑代码都是Google已有的代码,这里不继续跟踪。

注:有时候EthernetNetworkFactory重启网络之后发现配置信息没有生效,我遇到这种情况后,发现此时需要重启eth0网口。重启网口的功能将会在下面的文章里介绍。


4 监听网线的插拔

开发时,我们需要见监听以太网的状态变化,根据状态变化更新界面显示或者是做一些其他的操作。由于上层代码实际操作的是 EthernetManager类,所以理所应该先去EthernetManger中查看有没有类似接口,或者回调函数之类可以监听网口变化的功能,查看EthernetManager,我们发现有如下的接口:


   
  1. /**
  2. * A listener interface to receive notification on changes in Ethernet.
  3. */
  4. public interface Listener {
  5. /**
  6. * Called when Ethernet port's availability is changed.
  7. * @param isAvailable {@code true} if one or more Ethernet port exists.
  8. */
  9. public void onAvailabilityChanged(boolean isAvailable);
  10. }

解释中说此接口可以接受以太网变化的通知。在实际应用时,发现插入网线和拔出网线确实能够接受到通知,说明这个接口正是我们需要的。查看代码发现,要使用这个接口,应该先调用addListener将实现该接口的子类加入到一个ArrayList的通知列表里面,这说明我们可以在不同的地方接受以太网状态变化的通知。


   
  1. /**
  2. * Adds a listener.
  3. * @param listener A {@link Listener} to add.
  4. * @throws IllegalArgumentException If the listener is null.
  5. */
  6. public void addListener(Listener listener) {
  7. if (listener == null) {
  8. throw new IllegalArgumentException( "listener must not be null");
  9. }
  10. mListeners.add(listener);
  11. if (mListeners.size() == 1) {
  12. try {
  13. mService.addListener(mServiceListener);
  14. } catch (RemoteException e) {
  15. throw e.rethrowFromSystemServer();
  16. }
  17. }
  18. }

从上面代码可以看到,传递的参数被添加到了mListeners中,并且将mServiceListener添加到EthernetServiceImpl的远程监听接口中去。mServiceListener代码如下:


   
  1. private final IEthernetServiceListener.Stub mServiceListener =
  2. new IEthernetServiceListener.Stub() {
  3. @Override
  4. public void onAvailabilityChanged(boolean isAvailable) {
  5. mHandler.obtainMessage(
  6. MSG_AVAILABILITY_CHANGED, isAvailable ? 1 : 0, 0, null).sendToTarget();
  7. }
  8. };

若系统检测到以太网状态发生变化,则会通过调用mServiceListener来进行广播通知,接着在mHandler中会循坏便利mListeners列表中的监听对象,凡是注册了监听接口的类都会收到通知消息。



5. 网口的打开与关闭

有时候我们需要在不拔出网线的同时关闭上网的功能,这个时候解决方安就是将网口关闭,等到允许上网时再打开网口,接下来就来介绍网口的打开与关闭操作。

查看EthernetNetworkFactory的代码可以发现有这样一个函数和之前一样,我们先到EthernetManager中查看有没有已经做好的功能可以供我们调用。很遗憾的是,EthernetManager并没有实现开关网口的功能。由于EthernetManager不是最终管理以太网的管理类,只是一个提供上层接口的一个中间类,所以要想查看以太网的所以功能,我们应该去查找以太网的管理类EthernetNetworkFactory

查看EthernetNetworkFactory的代码可以发现有这样一个函数:


   
  1. /**
  2. * Updates interface state variables.
  3. * Called on link state changes or on startup.
  4. */
  5. private void updateInterfaceState(String iface, boolean up) {
  6. Log.d(TAG, "updateInterface: " + iface + " link " + (up ? "up" : "down")+ " , mIface : "+mIface);
  7. if (!mIface.equals(iface)) {
  8. return;
  9. }
  10. Log.d(TAG, "updateInterface: " + iface + " link " + (up ? "up" : "down"));
  11. synchronized( this) {
  12. mLinkUp = up;
  13. mNetworkInfo.setIsAvailable(up);
  14. if (!up) {
  15. // Tell the agent we're disconnected. It will call disconnect().
  16. mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, mHwAddr);
  17. stopIpProvisioningThreadLocked();
  18. }
  19. updateAgent();
  20. // set our score lower than any network could go
  21. // so we get dropped. TODO - just unregister the factory
  22. // when link goes down.
  23. mFactory.setScoreFilter(up ? NETWORK_SCORE : - 1);
  24. }
  25. }

这正是我们想要的功能,所以这个功能其实也是已经做好的,但是他是private类型的函数,说明Google并不想将这个功能公开出来。函数的第一个参数是想要打开或关闭的网口名称,第二个参数表明是打开还是关闭,true表示打开,false表示关闭。

既然已经有了功能,我们只需要调用即可,具体如何调用,我们可以模仿配置静态IP的方法,从EthernetManager开始,到EthernetNetworkFactory结束,将这个过程做成一个标准的功能。

首先我们在 EthernetManager中添加一个函数updateIface

   
  1. /*
  2. * up and down eth0
  3. */
  4. public void updateIface(String iface,boolean up){
  5. try {
  6. mService.updateIfaceState(iface,up);
  7. } catch (RemoteException e) {
  8. throw e.rethrowFromSystemServer();
  9. }
  10. }

此时需要在EthernetServiceImpl中添加函数updateIfaceState


   
  1. @Override
  2. public void updateIfaceState(String iface,boolean up){
  3. mTracker.changeEthernetState(iface,up);
  4. }

Override注解说明这是重写函数,EthernetServiceImpl继承自IEthernetManager.Stub,所以我们需要在对应的IEthernetManager.aidl接口文件中加入updateIfaceState声明,如下所示:


   
  1. // IethernetManager.aidl
  2. interface IEthernetManager
  3. {
  4. IpConfiguration getConfiguration();
  5. void setConfiguration(in IpConfiguration config);
  6. boolean isAvailable();
  7. void addListener(in IEthernetServiceListener listener);
  8. void removeListener(in IEthernetServiceListener listener);
  9. void updateIfaceState(String iface,boolean up);
  10. }

这里之后会调用mTracker.changeEthernetState函数在EthernetNetworkFactory创建函数changeEthernetState


   
  1. public void changeEthernetState(String iface,boolean state){
  2. Log.i(TAG, "changeEthernetState : iface : "+iface+ " , state : "+state);
  3. updateInterfaceState(iface,state);
  4. }

到此结束,从EthernetManagerEthernetNetworkFactory中关于网口开关的功能就做完了,我们只需要调用EthernetManager中的updateIface函数就能实现网口的打开与关闭功能。



6 监听网线拔出

之前在第四节中介绍过监听网线的插拔功能,第五节中介绍了在不拔网线的情况下打开与关闭网口,这个时候就会遇到一个问题,那就是我无法正确的监听到网线的拔出。实际操作中会发现,打开与关闭网口是,监听器监听同样会被调用,但是此时我并没有拔出网线。换一个说法就是,网口的打开与关闭实际上模拟的就是网线的插拔功能。

那此时我就需要正确区分开网口的关闭与网线的拔出这两种情况。

查询EthernetNetworkFactory代码可以发现有一个内部类可以监听到网线的插入与拔出:


   
  1. private class InterfaceObserver extends BaseNetworkObserver {
  2. @Override
  3. public void interfaceLinkStateChanged(String iface, boolean up) {
  4. updateInterfaceState(iface, up);
  5. }
  6. @Override
  7. public void interfaceAdded(String iface) {
  8. maybeTrackInterface(iface);
  9. }
  10. @Override
  11. public void interfaceRemoved(String iface) {
  12. stopTrackingInterface(iface);
  13. }
  14. }

其中interfaceAdded表示网线的插入,interfaceRemoved表示网线的拔出。为了配合系统的原生代码结构,我们可以在EthernetManagerListener接口中添加一个新函数声明,添加后的Listener接口如下:


   
  1. /**
  2. * A listener interface to receive notification on changes in Ethernet.
  3. */
  4. public interface Listener {
  5. /**
  6. * Called when Ethernet port's availability is changed.
  7. * @param isAvailable {@code true} if one or more Ethernet port exists.
  8. */
  9. public void onAvailabilityChanged(boolean isAvailable);
  10. /*
  11. *Called when network wire take out
  12. */
  13. public void onEthernetIfaceRemove();
  14. }

监听的注册流程重EthernetManageraddListener,到EthernetServiceImpl中的addListener时,已经将其注册到了一个RemoteCallList的列表中,在通过构造mTacker是将监听列表传给了EthernetNetworkFactory。所以我们只需要在EthernetNetworkFactory实现通知网线拔出就可以了。

具体代码如下:

   
  1. private void notifyListenersRemoved(){
  2. int n = mListeners.beginBroadcast();
  3. Log.i( "SIMCOMIP", "notifyListenersRemoved state listener size : "+n);
  4. for ( int i = 0; i < n; i++) {
  5. try {
  6. mListeners.getBroadcastItem(i).onEthernetIfaceRemove();
  7. } catch (RemoteException e) {
  8. // Do nothing here.
  9. }
  10. }
  11. mListeners.finishBroadcast();
  12. }

首先,添加一个通知所有监听者网线拔出的函数,之后我们就可以在前面提到的InterfaceObserverinterfaceRemoved函数中调用一下就可以了:


   
  1. private class InterfaceObserver extends BaseNetworkObserver {
  2. @Override
  3. public void interfaceLinkStateChanged(String iface, boolean up) {
  4. updateInterfaceState(iface, up);
  5. }
  6. @Override
  7. public void interfaceAdded(String iface) {
  8. maybeTrackInterface(iface);
  9. }
  10. @Override
  11. public void interfaceRemoved(String iface) {
  12. stopTrackingInterface(iface);
  13. notifyListenersRemoved();
  14. }
  15. }

7. SystsemUI同步更新

上层的SystemUI显示图标及更新是通过NetworkControllerImpl.java文件完成,具体可以自己查看代码,这里不做解析了。

Android 以太网服务启动流程 Android 以太网服务启动流程 一、引言 阅读本文需要对Android系统的启动流程有一定的了解。如果读者还没有这方面的知识,建议大家先了解一下这方面的知识,鄙人后面也会专门做相关系列文章。这里先大概简单阐述一下(这里我们重点关注init以上的进程服务),方便阅读本文章。Android 在kernel内核启动后会加载启动Init进程,在Init进程中启动各种服务,包括显示系统的SurfaceFlinger,音频系统AudioFlinger,网络守护进程Netd等等,其中最重要一个进程是system_se 阅读详情

相关推荐

Android以太网开关流程分析

Android以太网开关流程分析 一、引言   在Android 以太网服务启动流程中我们启动了EthernetService(ES),NetworkManagementService(NMS)等服务,其中ES作为Binder的服务端,向客户端EthernetManger提供了调用接口的引用。因此,应用可以通过EthernetManger来访问以太网的相关接口。本篇文章将从APP调用以太网的使能和关闭的接口流程作为切入点来分析以太网框架中,上层app是如何将指令传递到底层。图1-1所示为以太网使能和关闭

franc521的博客 6087

Android 以太网/有线网Ethernet功能开发

1. 功能介绍以太网功能是允许设备提供硬件接口通过插入网线的形式访问互联网的功能。接入网线之后,设备可以动态的获取IP,DNS,Gateway等一系列网络属性,我们也可以手动配置设备的网络属性,使用静态配置参数。Google已经有一套现成的机制使用有线网,但没有涉及有线网配置的功能,本文主要介绍如何Google现有机制的基础上实现静态网络的配置。本文基于高通MSM8953平台进行开发,通过配置e...

Purple7826的专栏 3万+

Android以太网架构源码

Android 以太网框架源码分析启动篇 一 引言 以太网在各类android设备形态中目前是比较成熟的技术,尤其对于android系统的电视、平板以及机顶盒等都有支持有线网口的预留。最近正好做一个关于Android以太网的需求(后面在Android 系统相关问题和需求的相关文章中会具体介绍这个需求),就顺便研究一下以太网的整体框架和流程。整体流程是很复杂,但是其中有一些细小的知识点还是需要关注的。这里主要基于Along的Android 10来分析。好嘞,话不多说,先看下Android以太网框架设计的代码目

franc521的博客 5321

Android 以太网(Ethernet) 功能及API开发

1. 功能介绍 以太网功能是允许设备提供硬件接口通过插入网线的形式访问互联网的功能。接入网线之后,设备可以动态的获取IP,DNS,Gateway等一系列网络属性,我们也可以手动配置设备的网络属性,使用静态配置参数。Google已经有一套现成的机制使用有线网,但没有涉及有线网配置的功能,本文主要介绍如何Google现有机制的基础上实现静态网络的配置。本文基于高通MSM8953 Android 7....

路文 的博客 7088

Android12 以太网功能实现

Android 12 有线网络适配

weixin_52521865的博客 4466

Android 13 Ethernet变更

(2)移除源码中限制接口的版本号 目前我采用的是二,但是如果项目需要过gms认证,则只能使用一,因为gms合入mainline,packages\modules\Connectivity生成的jar会被覆盖。以太网相关的功能Android12 和13 网络部分变化是不大的,Android11Android 12 网络部分无论是代码存放目录和代码逻辑都是有较多修改的,主要包括以下几个部分。这个是新增的接口方法 setEthernetEnabled ,之前是要自己实现有线网开关的。

androidzmm的博客 3224

Android 4.4 Kitkat 使能有线网Ethernet

背景 Android kitkat 默认已经支持 Ethernet 有线网络,只要稍微配置,便可以直接使用,测试结果,网络浏览器和下载都没有没有问题,而且系统可以做到与 wifi 共存,互相不影响功能,这里简单介绍如何使能 Ethernet,并简要分析其代码和流程。 ...

135

Android 4.4以太网功能的深度解析与实现

ethernet-service是Android系统中负责管理以太网连接的核心组件。它的主要任务是处理与以太网相关的服务请求,比如连接管理、状态报告和故障诊断。在系统启动或用户打开以太网连接时,该组件会被初始化,并且负责建立与硬件层的通信链路。初始化过程涉及到多个Android系统级别的服务,例如和,以确保ethernet-service可以与其他网络功能正常协作。初始化完成后,ethernet-service会注册必要的回调函数,以便在发生网络状态变化时能够及时响应。

weixin_30600615的博客 1074

Android以太网设置增强补丁包

为了使得应用能够有效地使用框架层提供的以太网服务,定义清晰、易用的服务接口至关重要。这些接口不仅需要提供必要的操作功能,还要确保调用过程中的安全性,防止潜在的安全漏洞和性能瓶颈。服务接口的定义通常遵循面向对象的原则,如封装、继承和多态性。对于每一个服务接口,开发者必须明确其方法签名、参数类型以及返回值类型。在Android平台上,这些接口大多通过AIDL(Android Interface Definition Language)来定义,这允许服务和客户端之间通过进程间通信(IPC)的方式进行交互。

weixin_28736145的博客 1104

Android 13.0 framework新增控制以太网开关功能实现

13.0的系统rom定制化开发中,在定制某些功能的时候,需要实现控制以太网开关的功能,接下来分析下系统中关于以太网的相关核心类然后实现控制以太网开关的功能

安卓兼职framework和app工程师的博客 8069

智能设备网络共享新方案:RK3566+Android11实现4G转有线网络自动连接

本文详细介绍了基于RK3566平台与Android 11系统,实现4G网络自动转换为有线以太网共享的智能硬件解决方案。该方案利用Android系统的以太网共享框架,通过创建后台服务与重试机制,实现了开机自动连接,解决了移动设备在无Wi-Fi环境下的稳定网络接入痛点,适用于教育平板、工业终端等多种智能设备场景。

grpc6streamer的博客 793

Android9、11 有线网络开关设置

Android9 有线网络开关设置一、定义数据1、Setting中定义数据2、定义默认值3、添加默认定义值 Android9 、11有线网络开关设置 Android系统开发中发现,Android8以后有线网络开关没有api了,需要自己进行通路建造,或者自己实现开关控制。 这部分修改在Framework 的Java层进行修改即可完成。 总体思路: 1有线网络开关控制是在EthernetService.java,但是具体实现是在EthernetServiceImpl.java和EthernetTracker

wenzhi的博客 8535

Android 13 以太网开发总结

Android13 以太网开发

qq_42457766的博客 2942

Android11 有线网开发 】网络信息获取、静态IP设置

Android11上WiFi开发前面文章已经做了介绍,本篇将记录以太网开发过程,以太网功能需求相对简单。获取网络信息、设置静态和动态IP。

Ho博客 6655

【rk3399】【安卓7.1以太网用开关来控制打开与否,且重启后能记住上一次开机时的状态

PLATFORM:RK3399 KERNEL:Linux4.4 OS:Android7.1 问题描述: 客户希望能够支持应用层打开\关闭有线网,且重启设备、插拔网线均能记住以上设置状态。 我们需要在不拔出网线的同时关闭上网的功能,这个时候解决方安就是将网口关闭,等到允许上网时再打开网口,需要我们建立一个以太网网口的开关。 问题解决: add Ethernet switch in Settings for user to enable/disable it modified dirs are as below

PixelColor的博客 1028

Android 13 有线以太网静态ip保存逻辑梳理分析

这个类主要就是用来配置静态IP的,这个类之前也是在frameworks/base/core/java/android/net/路径下,12里面也移到了packages/modules/Connectivity/framework/src/android/net/下。,所以如果之前只在11上面适配过,那么对于12来说,适配还是需要花费一点功夫,具体的差异在之后的部分会记录,但是12与13的有线网络差异就较小了,并且看起来,13的以太网接口以及逻辑比12来说更为完善。源码环境:高通Android 13。

以后会多把工作中总结的知识、问题处理思路和方法通过博客分享出来,欢迎大家关注和共同探讨! 3029

Android 14.0 framework新增控制以太网开关功能实现

​ 在14.0的系统rom定制化开发中,在定制某些功能的时候,需要实现控制以太网开关的功能,接下来分析下系统中关于以太网的相关核心类然后实现控制以太网开关的功能

安卓兼职framework和app工程师的博客 554
上一篇: Android7.1开机默认关闭DHCP
下一篇: android 6.0、7.0、8.0 新特性总结之开发应用时加以注意的变更
April小姐姐
博客等级 码龄12年 4粉丝 4原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值