Android O : DNS列表获取及IPv4/IPv6优先级修改

摘要:
修改DNS列表并首先返回IPv4:frameworksasecorejavaandroidLinkProperties。java/***返回此链接上DNS服务器的{@linkInetAddress}。**@return此链接上的DNS服务器的{@linkInetAddress}的可修改{@linkList}。**@returnDNSServersonthislink*/PublicList<InetAddress>getDnsServers()的{@linkInetAddress}的可修改{@linkList}{//Sheldonaddpatchbegin//当在列表中找到IPv4 DNS而不是在第一个位置时,它将被切换到第一个位置。应用程序层获得的第一个列表是IPv4 DNS索引=0;booleanisSortDone=true;对于{booleanisIpv4=;if(index==0&&!

一、Android应用获取有线网络DNS列表

    /**
     * 获取DNS列表
     */
    private List<String> getDnsList() {
        List<String> dnsList = new ArrayList();
        if (this.mIEthernetManager == null) {
            return dnsList;
        } else {
            try {
                IpConfiguration config = this.mIEthernetManager.getConfiguration();
                Iterator i$;
                InetAddress nameserver;
                if (config.getIpAssignment() == IpConfiguration.IpAssignment.STATIC) {
                    int state = this.mIEthernetManager.getState();
                    if (state != 3) {
                        return dnsList;
                    }

                    i$ = config.getStaticIpConfiguration().dnsServers.iterator();
                    while(i$.hasNext()) {
                        nameserver = (InetAddress)i$.next();
                        dnsList.add(nameserver.getHostAddress());
                    }
                } else {
                    if (this.mIConnectivityManager == null) {
                        return dnsList;
                    }

                    LinkProperties lp = this.mIConnectivityManager.getLinkPropertiesForType(9);
                    if (lp == null) {
                        return dnsList;
                    }

                    i$ = lp.getDnsServers().iterator();

                    while(i$.hasNext()) {
                        nameserver = (InetAddress)i$.next();
                        dnsList.add(nameserver.getHostAddress());
                    }
                }
                return dnsList;
            } catch (NullPointerException | RemoteException var6) {
                var6.printStackTrace();
                return dnsList;
            }
        }
    }

二、framework层修改DNS列表IPv4/IPv6的优先级

  路由器同时支持IPv4和IPv6的情况下,Android系统会优先使用IPv6,DNS信息中可能会显示类似 "fe80:xx:xx"的格式,这就是IPv6的DNS格式。

  修改DNS列表,把IPv4放在首位返回:

  frameworksasecorejavaandroid etLinkProperties.java

    /**
     * Returns all the {@link InetAddress} for DNS servers on this link.
     *
     * @return An umodifiable {@link List} of {@link InetAddress} for DNS servers on
     *         this link.
     */
    public List<InetAddress> getDnsServers() {
        //Sheldon add patch begin
        //在列表中查找到有IPv4 DNS且不在首位时,将其交换到首位,应用层获取到的列表第一个便是IPv4的DNS
        int index = 0;
        boolean isSortDone = true;
        for (InetAddress addr : mDnses) {
            boolean isIpv4 = (addr instanceof Inet4Address);
            if(index==0 && !isIpv4){
                isSortDone = false;
            }
            //Log.v(TAG, "Get DNS : " + addr.getHostAddress() + ", isIpv4 : " + isIpv4 + ", index = " + index);

            if(!isSortDone && isIpv4){
                Collections.swap(mDnses,0,index);
                Log.d(TAG, "Put ipv4 dns first ~");
                isSortDone = true;
            }

            index++;
        }
        //Sheldon add patch end
        return Collections.unmodifiableList(mDnses);
    }

  另外,如果想默认关闭IPv6只使用IPv4可以进行如下修改:

  frameworksopt etethernetjavacomandroidserverethernetEthernetNetworkFactory.java

    public void startIpManager() {

        ......

        } else {
            provisioningConfiguration = mIpManager.buildProvisioningConfiguration()
                    .withProvisioningTimeoutMs(0)
                    .withoutIPv6() //默认配置去除IPv6
                    .build();
        }

        mIpManager.startProvisioning(provisioningConfiguration);
    }

免责声明:文章转载自《Android O : DNS列表获取及IPv4/IPv6优先级修改》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nexus 3 搭建 npm 私服 (windows)Oracle怎么更改用户名下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Processor 介绍

1.概述 Sink Group允许用户将多个Sink组合成一个实体。 Flume Sink Processor 可以通过切换组内Sink用来实现负载均衡的效果,或在一个Sink故障时切换到另一个Sink。   sinks – 用空格分隔的Sink集合 processor.type default 类型名称,必须是 default、failo...

dcos的问题汇总

. group 'docker' does not exist  需要手工创建docker组,这一步本来应该是在安装docker的时候来完成的,但是采用yum install的方式不行,需要添加一个docker的repo然后才能够安装。 2. ssh: connect to host 10.1.108.64 port 22: Operation timed...

Linux进程管理

1.介绍 1.什么是进程 比如: 开发写的代码我们称为程序,那么将开发的代码运行起来。我们称为进程。总结一句话就是: 当我们运行一个程序,那么我们将运行的程序叫进程。PS1: 当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限。PS2: 在进程运行的过程中,系统会有各种指标来表示当前运行的状态。 2.程序和进程的区别 1.程序是数据和指令...

0508操作系统

课后题:https://wenku.baidu.com/view/40a1cb3a3968011ca300919c.html 1.操作系统的定义 操作系统是运行在计算机硬件上的第一层软件,它是用户和计算机硬件系统之间的接口,用户通过os来使用计算系统,是计算机系统资源的管理者,实现了对计算机资源的抽象。计算机资源的抽象:OS在裸机上覆盖了I/O设备管理软件...

C#综合揭秘——细说多线程(上)

引言   本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发。   其中委托的BeginInvoke方法以及回调函数最为常用。   而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作。特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax...

cdn技术浅谈 大风起

CDN,即内容分发网络。cdn,一种网络缓存技术,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,解决Internet网络拥塞状况,提高用户访问网站的响应速度。就是当用户访问加入CDN服务的网站时候,域名解析请求将最终交给全局负载均衡DNS处理。解决因分布、带宽、服务器性能带来的访问延迟的问题,适用于站点加速,点播,直播等场景。比如...