Android 13 有线网变更(用到的可以收藏)

这篇具有很好参考价值的文章主要介绍了Android 13 有线网变更(用到的可以收藏)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android 13 有线网变更

如果是Android12 的系统需要开发用到有线网络,那么本文可以让你少走一些弯路。

Android12 和13 网络部分变化是不大的,
Android11 到Android 12 网络部分无论是代码存放目录和代码逻辑都是有较多修改的。

一、从接触的Android13 (Tv版)源码和测试结果看,有线网有如下变更:


1、限制了设置有线网参数设置接口方法
2、新增有线网开启关闭接口方法
3、新增了 updateConfiguration 接口方法
4、有线网设置的静态ip和代理信息重启后无效

简单的说就是,如果app api 设置成Android13 ,应用用无法有以前的接口设置有线网信息。

二、有线网具体变更介绍

1、限制了设置有线网参数设置接口方法

有线网设置新路径:
packages\modules\Connectivity\framework-t\src\android\net\EthernetManager.java


    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    public IpConfiguration getConfiguration(String iface) {
        try {
            return mService.getConfiguration(iface);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    public void setConfiguration(@NonNull String iface, @NonNull IpConfiguration config) {
        try {
            mService.setConfiguration(iface, config);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    public String[] getAvailableInterfaces() {
        try {
            return mService.getAvailableInterfaces();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }
    }

从上面看,主要是api加了限制 :maxTargetSdk = Build.VERSION_CODES.R //Android11

maxTargetSdk 表明最大支持的SDK 版本,R 表示Android11 .
所以Android 12 或者更新的版本,在EthernetManager 是调用不到上面几个接口方法的!

有线网Android12 之前的路径:

frameworks\base\core\java\android\net\EthernetManager.java

后面开发Android12 或新版本代码,你会发现wifi 、蓝牙、热点 之前 framework 的源码都移动到了下面的package目录:


packages\modules\Connectivity\

2、新增有线网开启关闭接口方法

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();
        }
    }

这个是新增的接口方法 setEthernetEnabled ,之前是要自己实现有线网开关的的。

需要的权限上面已经说明的,基本是要系统签名的应用才能调用。

Android 9 之前开发的增加开关接口方法过程:

https://blog.csdn.net/wenzhi20102321/article/details/122243396

3、新增了 updateConfiguration 接口方法

EthernetManager.java

    @SystemApi
    @RequiresPermission(anyOf = {
            NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
            android.Manifest.permission.NETWORK_STACK,
            android.Manifest.permission.MANAGE_ETHERNET_NETWORKS})
    public void updateConfiguration(
            @NonNull String iface,
            @NonNull EthernetNetworkUpdateRequest request,
            @Nullable @CallbackExecutor Executor executor,
            @Nullable OutcomeReceiver<String, EthernetNetworkManagementException> callback) {
        Objects.requireNonNull(iface, "iface must be non-null");
        Objects.requireNonNull(request, "request must be non-null");
        final NetworkInterfaceOutcomeReceiver proxy = makeNetworkInterfaceOutcomeReceiver(
                executor, callback);
        try {
            mService.updateConfiguration(iface, request, proxy);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

String iface //节点名称:eth0 / eth1
EthernetNetworkUpdateRequest request 对象是包含静态ip和代理信息对象和特征属性对象。
后面两个是回调监听,具体使用需要自行研究,并且未要求非空,估计是可以传null 的。

其实还要另外的坑,在有线网服务,新api 才有这个限制!

具体代码情况:

packages\modules\Connectivity\service-t\src\com\android\server\ethernet\EthernetServiceImpl.java

    @Override
    public void updateConfiguration(@NonNull final String iface,
            @NonNull final EthernetNetworkUpdateRequest request,
            @Nullable final INetworkInterfaceOutcomeReceiver listener) {
        Objects.requireNonNull(iface);
        Objects.requireNonNull(request);
        throwIfEthernetNotStarted();


        // TODO: validate that iface is listed in overlay config_ethernet_interfaces
        // only automotive devices are allowed to set the NetworkCapabilities using this API
        //only automotive devices 表明,只有 车载设备支持设置该方法
+        // 非车载项目必须注释调方法:enforceAdminPermission ,否则会报错,这里是校验是否是车载项目
+        //enforceAdminPermission(iface, request.getNetworkCapabilities() != null,
+         //       "updateConfiguration() with non-null capabilities");
+        Log.i(TAG, " lwz add updateConfiguration with: iface=" + iface + ", listener=" + listener);
        maybeValidateTestCapabilities(iface, request.getNetworkCapabilities());

        mTracker.updateConfiguration(
                iface, request.getIpConfiguration(), request.getNetworkCapabilities(), listener);
    }

所以要在自己项目中调用新的api ,必须设置属性让自己的设备识别为车载项目或者把车载判断的逻辑去除即可。

TvSettings是可以设置有线网信息的,调用后就是会报异常。
即使屏蔽了 校验车载的过程,TvSettings 中设置静态ip和代理信息还是有问题的,会显示未连接!
所以TvSettings 中调用有线网的接口也是未完善的情况!

4、有线网设置的静态ip和代理信息重启后无效

查看有线网配置信息保存的类:


packages\modules\Connectivity\service-t\src\com\android\server\ethernet\EthernetConfigStore.java

    private static final String CONFIG_FILE = "ipconfig.txt";
    private static final String FILE_PATH = "/misc/ethernet/";
    private static final String LEGACY_IP_CONFIG_FILE_PATH = Environment.getDataDirectory() + FILE_PATH;
    //Android13 新增下面路径:
    private static final String APEX_IP_CONFIG_FILE_PATH = ApexEnvironment.getApexEnvironment(
            TETHERING_MODULE_NAME).getDeviceProtectedDataDir() + FILE_PATH; // TETHERING_MODULE_NAME --》com.android.tethering

可以看到之前的路径是:
/data/misc/ethernet/ipconfig.txt

最新的有线网配置文件保存目录:
/data/misc/apexdata/com.android.tethering/misc/ethernet/ipconfig.txt

但是保存有线网静态ip信息后未生成信息文件。具体原因就要进行具体分析了!!!目前正在分析。

因为未成功保存本地配置文件,所以每次开机重启后,无法读取到静态ip和代理等信息。
所以出现 有线网设置的静态ip和代理信息重启后无效 问题。

三、总结

1、有线网变化

(1) 限制了设置有线网参数设置 setConfiguration 接口方法 等方法使用
(2) 新增有线网开启关闭接口方法
(3) 新增了 updateConfiguration 接口方法
(4) 有线网设置的静态ip和代理信息重启后无效

从EthernetManager.java 源码可以看出,无法是获取配置和设置配置信息的方法都做了限制 Android11 以后不支持使用!

所以Android12 以后,系统代码看起来只能支持开关操作,不支持设置静态ip和代理设置。

但是新的api 中新增了 updateConfiguration 接口方法,可以进行设置静态ip和代理信息;
不足的是新的api接口中未发现查询 之前配置的信息情况接口方法。
还有个bug就是,如果要调用新api updateConfiguration 接口方法需要把项目属性设置成车载或者必须跳过车载校验
后面N个版本后估计Google会进行完善,毕竟还是有很多Android设备是需要用到有线网的。

尝试用一些手段后,发现Android13 也是可以正常设置静态ip和代理信息的,
只是重启后设置的有线网配置信息无效了,这个需要对有线保存配置部分的逻辑进行分析处理了,应该是可以完善的。

2、Android13 有线网适配思路


(1)使用新api接口设置静态ip和代理信息
(2)反射调用之前的接口方法
(3)去除EthernetManager 里面的限制编译新的framework jar包,这个我也不会!
(4)在 EthernetManager 新增一套接口,把限制的重新写一次,有点傻!

系统源码中这个应用是有调用 有线网新api 接口示例:

packages/services/Car/tests/RailwayReferenceApp 

但是上面的代码应用并未完善,需要自己进一步进行完善,有点坑。

并且 EthernetManager 新api中并未有查询之前配置的信息情况的接口方法,
所以需要查询要是要另辟蹊径,比如使用反射调用之前的接口方法。

使用反射的方式调用api接口:

https://blog.csdn.net/weixin_44917215/article/details/1300271321

亲测,使用反射的方法是可以调用之前所有api 接口的!

3、其他

有线网的所有接口基本都是要系统权限才能调用!

Android 普通设备一般不使用有线网,使用有线网的一般是大屏设备和盒子设备,基本是有 签名 权限的!

其他有线网相关文章:

Android9、11 有线网络开关设置:
https://blog.csdn.net/wenzhi20102321

Android adb查看网络连接情况 :
https://blog.csdn.net/wenzhi20102321

Android11 有线网Score分析流程
https://blog.csdn.net/wenzhi20102321

Android11 有线网和wifi优先级设置:
https://blog.csdn.net/wenzhi20102321

后续还会写一下新api的demo 和完整的反射调用的demo!文章来源地址https://www.toymoban.com/news/detail-525489.html

到了这里,关于Android 13 有线网变更(用到的可以收藏)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ThinkPad中有线网无法使用Access Connections创建共享热点的解决方法图解

    使用Think自带的ThinkVantage Access Connections中的mobilehotspot功能创建热点,使用无线创建热点正常,在mobilehotspot模块中可以正常点击开始进行创建,但要使用有线网络接入进行共享创建热点,发现点击mobilehotspot模块中的开始按钮,呈现灰色不可选状态,导致无法创建热点。 解决方

    2024年02月06日
    浏览(52)
  • Android 13 Ethernet变更

    Android13 有线变更 以太网相关的功能在Android12 和13 网络部分变化是不大的,Android11 到Android 12 网络部分无论是代码存放目录和代码逻辑都是有较多修改的,主要包括以下几个部分 限制了设置有线网参数设置接口方法 新增有线网开启关闭接口方法 新增了 updateConfiguration 接口方

    2024年02月02日
    浏览(77)
  • Android 13 版本变更总览

    https://developer.android.google.cn/about/versions/13?hl=zh-cn 文章基于官方资料上提取 https://developer.android.google.cn/about/versions/13/summary?hl=zh-cn https://developer.android.google.cn/about/versions/13/behavior-changes-all?hl=zh-cn 性能和电池 前台服务 (FGS) 任务管理器 (https://developer.android.google.cn/guide/components/f

    2024年02月07日
    浏览(40)
  • Android 13 变更及适配攻略

    首先将我们项目中的 targetSdkVersion 和 compileSdkVersion 升至 33。 1.通知受限 对新安装的应用的影响: 如果用户在搭载 Android 13 或更高版本的设备上安装您的应用,应用的通知默认处于关闭状态。在您请求新的权限且用户向您的应用授予该权限之前,您的应用都将无法发送通知。

    2024年02月03日
    浏览(46)
  • Node.js 开发常用到的库和插件工具,同事看到后也悄悄收藏了……

    Node.js是一个功能强大,并且非常流行的 JavaScript 运行时环境,使开发人员能够高效率的构建高性能应用程序。下面介绍了8个常见的应用程序开发中用到的库和函数,可以用于缓存数据、操作日期、处理图像、发送电子邮件、发出 HTTP 请求、记录请求和响应、压缩数据和哈希

    2024年02月09日
    浏览(45)
  • 2个或多个路由器怎么有线连接以保证可以正常上网

    某些情况下,我们会用网线将多台路由器连接在一起用,而且只用一个网络。比如不同型号的路由器不便用无线桥接、或路由器本身没有无线桥接WDS功能时。 很多同学在问在说第二台能否连上问题,实际上WDS桥接的目的就是要让第二台或者第三台甚至更多桥接上的路由器能够

    2024年02月07日
    浏览(46)
  • 【python爬虫】给你分享几个日常生活中可以用到的爬虫小程序

    在这篇文章中,我们将分享7个Python爬虫的小案例,帮助大家更好地学习和了解Python爬虫的基础知识。以下是每个案例的简介和源代码: 这个案例使用BeautifulSoup库爬取豆瓣电影Top250的电影名称、评分和评价人数等信息,并将这些信息保存到CSV文件中。 这个案例使用正则表达式

    2024年02月05日
    浏览(56)
  • 分布式微服务项目实现高并发高可用高性能可以使用到的方案

    实力有限,只能就我知道的写。总篇只写大致方案。 不同于单机环境,分布式微服务环境下最大的问题就是会出现不仅是跨线程还会有跨服务的数据一致性问题。单机环境下我们有volatile和synchronized以及JUC下的并发编程工具等工具实现并发编程。分布式跨服务环境下就得使用

    2024年02月14日
    浏览(63)
  • 【Android 10 适配】隐私权限变更

    更详细内容请参考 Android 10 中的隐私权变更 Android 10(API 级别 29)引入了多项功能和行为变更,旨在更好地保护用户的隐私。这些变更让用户更清楚地了解并更好地控制自己的数据及为应用提供的权能。 下面是 Android 10 中与 隐私权限 相关的主要变更。 默认情况下,以 Andr

    2024年01月22日
    浏览(59)
  • 【Android】RecyclerView的经常用到的属性解析与性能优化

    我们可以把创建对象从 oncreateviewholder 中提前到外面,用集合进行存储,用 的时候直接从集合中取 如果item的高度固定的话可以设置setHasFixedSize(true),这样RecyclerView在onMeasure阶段可以直接计算出高度,不需要多次计算子ItemView的高度。 setHasFixedSize(true)时如果是通过Adapter的增删

    2024年03月23日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包