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!

猜你喜欢

转载自blog.csdn.net/wenzhi20102321/article/details/130607641