Configuration des propriétés statiques du réseau filaire Android

Configuration des propriétés statiques du réseau filaire Android

Cet article concerne principalement les applications système d'Android 7 [SDK 25] et versions ultérieures, définissant l'adresse IP statique, le masque de sous-réseau, la passerelle et d'autres paramètres d'attributs du réseau câblé ;

Le réseau filaire fournit une classe de gestion EthernetManager, qui est utilisée pour obtenir l'état du commutateur, les informations sur le réseau filaire et les paramètres. Dans l' interface 动态IP 静态IP 子网掩码 网关Ipstandard , elle est masquée, elle ne peut donc être appelée que via la réflexion Java sans la libérer. , comprenons d'abord le méthodes et méthodes pertinentes .Android EthernetManagerFrameworkAPI

Remarque : La condition préalable pour refléter EthernetManager est que votre application soit une application au niveau du système. Sinon, un manque d'autorisations sera signalé lors de la réflexion. Même s'il est configuré dans la liste AndroidManifest.xml, cela n'aidera pas.

1. Introduire les classes liées à la configuration réseau de la couche cadre

package android.net;


@SystemService(Context.CONNECTIVITY_SERVICE)
public class ConnectivityManager {
    
    
    
    /**
     * Create a new EthernetManager instance.
     * Applications will almost always want to use
     * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
     * the standard {@link android.content.Context#ETHERNET_SERVICE Context.ETHERNET_SERVICE}.
     */
    public EthernetManager(Context context, IEthernetManager service) {
    
    
        mContext = context;
        mService = service;
    }
   	/*
   	 *  阅读framework源码,我们发现ConnectivityManager的构造函数,需要两个参数
   	 * 最重要一个是IEthernetManager,是一个系统服务,那么说明在Android SDK里面,肯定会有个service Tag可以直接可以获得EthernetManager
    */
    
        /**
     * Get Ethernet configuration.
     * @return the Ethernet Configuration, contained in {@link IpConfiguration}.
     */
    public IpConfiguration getConfiguration(String iface) {
    
    
        try {
    
    
            return mService.getConfiguration(iface);
        } catch (RemoteException e) {
    
    
            throw e.rethrowFromSystemServer();
        }
    }
    /*
     * 	getConfiguration 获取iface网卡的配置
    */
  	

    /**
     * Set Ethernet configuration.
     */
    public void setConfiguration(String iface, IpConfiguration config) {
    
    
        try {
    
    
            mService.setConfiguration(iface, config);
        } catch (RemoteException e) {
    
    
            throw e.rethrowFromSystemServer();
        }
    }
   	 /*
     * setConfiguration 设置iface网卡的配置
     * IpConfiguration 一个网卡配置信息的类,也是android.net这个包下面的
    */
}

Commençons par présenter android.net.IpConfigurationla signification de tous les champs de cette classe.

package android.net;

/**
 * A class representing a configured network.
 * @hide
 */
public class IpConfiguration implements Parcelable {
    
    

    public IpAssignment ipAssignment;

    public StaticIpConfiguration staticIpConfiguration;

    public ProxySettings proxySettings;

    public ProxyInfo httpProxy;
    
/*
ipAssignment:表示 IP 地址分配的方式,可能的取值包括:

IpAssignment.DHCP:通过 DHCP 自动分配 IP 地址。
IpAssignment.STATIC:使用静态 IP 地址配置。
IpAssignment.UNASSIGNED:未分配IP,可作为无效值。

proxySettings:表示代理服务器设置,可能的取值包括:

ProxySettings.NONE:不使用代理。
ProxySettings.STATIC:使用静态代理设置。
ProxySettings.PAC:根据 PAC (Proxy Auto-Config) 文件配置代理。
ProxySettings.UNASSIGNED:未分配代理设置。

*/    
}

Lorsqu'il IpAssignmentest défini sur static STATIC, vous devez utiliserStaticIpConfigurationPour définir une adresse IP statique, un masque, une passerelle et un DNS ; StaticIpConfigurationc'est également une classe sous le package Android.net

Continuons à regarder la signification de certains champs de la classe StaticIpConfiguration.

package android.net;

import android.net.LinkAddress;
import java.net.InetAddress;


/**
 * Class that describes static IP configuration.
 *
 * This class is different from LinkProperties because it represents
 * configuration intent. The general contract is that if we can represent
 * a configuration here, then we should be able to configure it on a network.
 * The intent is that it closely match the UI we have for configuring networks.
 *
 * In contrast, LinkProperties represents current state. It is much more
 * expressive. For example, it supports multiple IP addresses, multiple routes,
 * stacked interfaces, and so on. Because LinkProperties is so expressive,
 * using it to represent configuration intent as well as current state causes
 * problems. For example, we could unknowingly save a configuration that we are
 * not in fact capable of applying, or we could save a configuration that the
 * UI cannot display, which has the potential for malicious code to hide
 * hostile or unexpected configuration from the user: see, for example,
 * http://b/12663469 and http://b/16893413 .
 *
 * @hide
 */
public class StaticIpConfiguration implements Parcelable {
    
    
    
    public LinkAddress ipAddress;
    public InetAddress gateway;
    public final ArrayList<InetAddress> dnsServers;
    public String domains;
    
    
/*
ipAddress:表示静态 IP 地址。

gateway:表示静态 IP 的默认网关。

dnsServers:表示静态 IP 配置的 DNS 服务器的 IP 地址列表。

domains:表示与静态 IP 配置相关的 DNS 搜索域。

*/    
}

2. Utilisez la réflexion pour appeler les méthodes système afin de définir les propriétés du réseau

Téléchargez directement le code d'appel complet ;

/**
     * 设置静态ip、子网掩码、网关
     * @param iFace 网卡名称,如:eth0
     * @param isDhcpMode 是否是DHCP模式
     * @param ip ip 地址 //当前不支持ipv6
     * @param mask 掩码
     * @param gateway 网关
     */
    public static void setStaticIpConfiguration(String iFace,boolean isDhcpMode,String ip,String mask,String gateway){
    
    
        try {
    
    
            //1| 获得EthernetManager
            Object objEthernetManager = AppGlobal.getApplicationContext().getSystemService("ethernet");

            //2| 构造 IpConfiguration的成员 IpAssignment ProxySettings StaticIpConfiguration ProxyInfo
            Class<?> aClass = ReflectHelper.getClass("android.net.NetworkUtils");
            Method numericToInetAddress = aClass.getDeclaredMethod("numericToInetAddress", String.class);
            numericToInetAddress.setAccessible(true);
            Class<?> classStaticIpConfiguration = ReflectHelper.getClass("android.net.StaticIpConfiguration");
            Object objStaticIpConfiguration = null;
            if (!isDhcpMode){
    
    
                InetAddress ipV4InetAddress = (InetAddress) numericToInetAddress.invoke(null, ip);
                InetAddress gatewayInetAddress = (InetAddress) numericToInetAddress.invoke(null, gateway);
                objStaticIpConfiguration = classStaticIpConfiguration.newInstance();
                ReflectHelper.setField(objStaticIpConfiguration, "ipAddress", createLinkAddress(ipV4InetAddress, CommonUtils.getNetmaskLength(mask)));
                ReflectHelper.setField(objStaticIpConfiguration, "gateway", gatewayInetAddress);
                OsduiLog.mtuiHintLog(TAG, "setStaticIpConfiguration objStaticIpConfiguration: " + objStaticIpConfiguration);

            }

            Class<?> classIpConfiguration = ReflectHelper.getClass("android.net.IpConfiguration");
            Class<?> classProxyInfo = ReflectHelper.getClass("android.net.ProxyInfo");
            Class<?> ipAssignment = ReflectHelper.getClass("android.net.IpConfiguration$IpAssignment");
            Class<?> proxySettings = ReflectHelper.getClass("android.net.IpConfiguration$ProxySettings");

            Object objIpAssignment = ReflectHelper.getField(ipAssignment, null, isDhcpMode? "DHCP":"STATIC");//设置DHCP模式
            Object objProxySettings = ReflectHelper.getField(proxySettings, null, "NONE");
            //3| 构造出 IpConfiguration
            Constructor<?> declaredConstructor = classIpConfiguration.getDeclaredConstructor(ipAssignment, proxySettings, classStaticIpConfiguration, classProxyInfo);
            Object objIpConfiguration = declaredConstructor.newInstance(objIpAssignment, objProxySettings, objStaticIpConfiguration, null);
            OsduiLog.mtuiHintLog(TAG, "setStaticIpConfiguration objIpConfiguration: " + objIpConfiguration);

            //4| 调用 EthernetManager里的setConfiguration方法
            ReflectHelper.invokeMethod(objEthernetManager,"setConfiguration",
                    new Class[]{
    
    String.class,classIpConfiguration},new Object[]{
    
    iFace,objIpConfiguration});

        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

Il existe également une android.net.NetworkUtilsclasse d'outils réseau fournie directement par la couche système, qui est principalement utilisée pour convertir une Int IP en un objet java.net.InetAddress ; si vous ne souhaitez pas l'utiliser, vous pouvez la construire vous-même ;

Cela implique également une méthode de conversion d'InetAddress en LinkAddress, qui est convertie ensemble ici.

private static LinkAddress createLinkAddress(InetAddress ipAddress, int prefixLength) {
    
    
        try {
    
    
            Class<?> clazz = Class.forName("android.net.LinkAddress");
            Class<?>[] parTypes = new Class<?>[2];
            parTypes[0] = InetAddress.class;
            parTypes[1] = int.class;
            Constructor<?> constructor = clazz.getConstructor(parTypes);

            Object[] pars = new Object[2];
            pars[0] = ipAddress;
            pars[1] = prefixLength;
            return (LinkAddress) constructor.newInstance(pars);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return null;
    }

Les réseaux filaires utilisent EthernetManager pour définir les attributs de réseau statiques, tandis que les réseaux sans fil n'ont pas besoin d'être si compliqués, mais ils doivent également utiliser StaticIpConfiguration, mais ils ne seront pas étendus cette fois. Si nécessaire, veuillez aimer, mettre en favori et suivre pour obtenir de l'aide. .Nous continuerons à mettre à jour et à suivre le réseau à l'avenir.Contenu associé, développement Android ;

Ps : plus il y a de likes et de suivis, plus la mise à jour sera rapide ; si vous rencontrez des problèmes particuliers, vous pouvez envoyer un message privé ou un commentaire, nous vous répondrons à temps ~ mais vous avez besoin de vos likes et de vos collections

おすすめ

転載: blog.csdn.net/qq_41998504/article/details/132567678