本文针对安卓9.0源码进行修改。
本来是想在安卓9.0实现以太网的三种ip模式,纯IPv4/纯IPv6/IPv4 & IPv6兼容模式,但是只通过简单修改framework代码无法实现纯IPv6模式(改成纯IPv6模式后,以太网图标不显示,也无法联网了)。本文主要讲解以太网如何实现纯IPv4和IPv4 & IPv6兼容模式。
修改文件目录:\frameworks\opt\net\ethernet\java\com\android\server\ethernet\EthernetNetworkFactory.java
具体修改:
import android.os.SystemProperties;
//EthernetNetworkFactory 中可以禁用IPV6,具体代码如下,目前只禁用ipv6或ipv4&ipv6共存(系统默认)都没问题,想只用纯ipv6不行,切记。
private static void provisionIpClient(IpClient ipClient, IpConfiguration config,
String tcpBufferSizes) {
if (config.getProxySettings() == ProxySettings.STATIC ||
config.getProxySettings() == ProxySettings.PAC) {
ipClient.setHttpProxy(config.getHttpProxy());
}
if (!TextUtils.isEmpty(tcpBufferSizes)) {
ipClient.setTcpBufferSizes(tcpBufferSizes);
}
final ProvisioningConfiguration provisioningConfiguration;
// add by zzh, ipv6 default support but xxx device @{
// ipv6是否默认可用,定义在device\自定义目录\产品型号\system.prop
// # add by zzh for set ipv6 default is enable,这边我们定义自己的产品型号默认不
// 支持ipv6模式
// ro.enable_ipv6_default=false
boolean ipv6DefaultEnable = SystemProperties.getBoolean("ro.enable_ipv6_default", true);
// 这个系统属性可在app中设置,从而在app中控制是否支持ipv6
boolean ipv6Enable = SystemProperties.getBoolean("persist.sys.ipv6.enable", ipv6DefaultEnable);
// 这个系统属性可在app中设置,从而在app中控制是否支持ipv4
boolean ipv4Enable = SystemProperties.getBoolean("persist.sys.ipv4.enable", true);
// @}
if (config.getIpAssignment() == IpAssignment.STATIC) {
// add by zzh @{
if (ipv4Enable && !ipv6Enable){
provisioningConfiguration = IpClient.buildProvisioningConfiguration()
.withStaticConfiguration(config.getStaticIpConfiguration())
.withoutIPv6()
.build();
} else if (!ipv4Enable && ipv6Enable){
provisioningConfiguration = IpClient.buildProvisioningConfiguration()
.withStaticConfiguration(config.getStaticIpConfiguration())
.withoutIPv4()
.build();
} else {
// @}
provisioningConfiguration = IpClient.buildProvisioningConfiguration()
.withStaticConfiguration(config.getStaticIpConfiguration())
.build();
}
} else {
// add by zzh @{
if (ipv4Enable && !ipv6Enable){
provisioningConfiguration = IpClient.buildProvisioningConfiguration()
.withProvisioningTimeoutMs(0)
.withoutIPv6()
.build();
} else if (!ipv4Enable && ipv6Enable){
provisioningConfiguration = IpClient.buildProvisioningConfiguration()
.withProvisioningTimeoutMs(0)
.withoutIPv4()
.build();
} else {
// @}
provisioningConfiguration = IpClient.buildProvisioningConfiguration()
.withProvisioningTimeoutMs(0)
.build();
}
}
ipClient.startProvisioning(provisioningConfiguration);
}