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

news/2024/11/20 23:33:41/

Android 13 有线网变更

文章目录

  • Android 13 有线网变更
    • 一、从接触的Android13 (Tv版)源码和测试结果看,有线网有如下变更:
    • 二、有线网具体变更介绍
      • 1、限制了设置有线网参数设置接口方法
      • 2、新增有线网开启关闭接口方法
      • 3、新增了 updateConfiguration 接口方法
      • 4、有线网设置的静态ip和代理信息重启后无效
    • 三、总结
      • 1、有线网变化
      • 2、Android13 有线网适配思路
      • 3、其他

如果是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@Overridepublic 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.javaprivate 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!


http://www.ppmy.cn/news/66748.html

相关文章

怎样恢复删除的视频?这5个方法才是正确答案!

案例&#xff1a;怎样恢复删除的视频&#xff1f; 【我是个视频爱好者&#xff0c;平常会在电脑中存很多视频&#xff0c;但也经常会将很多视频误删&#xff0c;怎样恢复删除的视频呢&#xff1f;希望大家给我一些建议&#xff01;】 在摄影摄像技术较发达的今天&#xff0c;…

Python中__repr__和__str__方法的区别|留学生CS辅导帖

Python中__repr__和__str__方法的区别 你好&#xff0c;我是悦创。 问题 __repr__和__str__有什么区别&#xff1f; 解答 __repr__和__str__方法在Python中都用于为对象提供字符串表示形式&#xff0c;但它们之间存在一些区别&#xff0c;主要体现在用途和实现上&#xff…

队列、栈专题

队列、栈专题 LeetCode 20. 有效的括号解题思路代码实现 LeetCode 921. 使括号有效的最少添加解题思路代码实现 LeetCode 1541. 平衡括号字符串的最少插入次数解题思路代码实现 单调栈LeetCode 496. 下一个更大元素 I解题思路代码实现 LeetCode 739. 每日温度解题思路代码实现 …

一个网站引发的程序猿的牢骚,哈哈哈

2013年大学毕业后&#xff0c;参加工作做的第一个前端项目&#xff0c;北京服装学院&#xff0c;今天调研一个关于iframe的需求&#xff0c;突然想试试&#xff0c;以前那些做IE6兼容的项目是否还在使用&#xff0c;就默默的点开了。十年了&#xff0c;他们没有换网站&#xff…

【Pandas与SQL系列】Pandas实现分布函数percent_rank、cume_dist

目录 1&#xff0c;分布函数,1.1&#xff0c;percent_rank()1.2&#xff0c;cume_dist()1.3 SQL例子 2&#xff0c;Pandas 实现3&#xff0c;补充Pandas实现排序 1&#xff0c;分布函数, 应用场景&#xff1a;快速查看某个记录所归属的组内的比例 分布函数分类及基础语法&…

JAVA-代码块和内部类

文章目录 目录 文章目录 前言 1.代码块 1.1什么是代码块? 1.2代码块的分类及作用: 1.静态代码块 2.成员代码块(又叫做构造代码块) 3.局部代码块 2.内部类 2.1 什么是内部类? 2.2 内部类的分类 1.成员内部类 2.静态内部类 3.匿名内部类 4.局部内部类 总结 前言 作者简介:我是最…

PSP - AlphaFold2 适配不同来源搜索的 MSA 接口

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130594303 MSA (Multiple Sequence Alignment) 在 AlphaFold2 中的工作方式如下: 使用搜索工具 (hhblits/hhsearch/jackhmmer),从大型数据库中,搜索与目标…

PCL学习九:Registration-配准

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云 PCL点云库学习笔记&#xff08;文章链接汇总&#xff09; 1. 点云中的数学 函数求导 对于函数 f ( x ) x 2 f(x)x^2 f(x)x2 其一阶导数也是 x x x 的函数&#xff1a; d f d x 2 x \frac{df}{dx}2x dxdf​2x其二阶导…