本文針對安卓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);
}