Android13版本,MTK方案
Android为了对网络状态进行检测,采用了一种叫做captive detection的方式进行网络状态检测。其实说起来很简单,每当连接到一个网络,比如移动数据网络或者WIFI的时候,Android的NetworkMonitor模块会构造一个http/https的请求,发送到指定的服务器,然后利用收到的响应进行网络状态判断。
安卓手机网络状态有如下几种状态:
1) 根本就没有返回,这种情况代表当前没有Internet访问;
2) 返回状态码204,这种情况代表具备完整的Internet访问(特定的服务器专门返回204的状态码);
3) 除204以外的其他大于200而小于400的状态码,这种状态码一般代表需要进行Web登录的网络连接,比如机场、商场提供的需要短信登录的网络。这种情况下Android会构造一个可能需要登录的状态栏通知以通知用户可能需要进行登录。
安卓类原生ROM刷机包默认的204服务器是由谷歌提供,由于谷歌在我国大陆区不可访问,wifi有叹号或打叉这都是正常的。
Android13版本修改方案:
源码位置:sys\packages\modules\NetworkStack
查找网上资料,给出的解决办法是修改config.xml资源文件
res\values\config.xml
<string name="default_captive_portal_http_url" translatable="false">http://connectivitycheck.gstatic.com/generate_204</string>
<string name="default_captive_portal_https_url" translatable="false">https://www.google.com/generate_204</string>
<string-array name="default_captive_portal_fallback_urls" translatable="false">
<item>http://www.google.com/gen_204</item>
<item>http://play.googleapis.com/generate_204</item>
</string-array>
修改为:
<string name="default_captive_portal_http_url" translatable="false">http://connect.rom.miui.com/generate_204</string>
<string name="default_captive_portal_https_url" translatable="false">https://connect.rom.miui.com/generate_204</string>
<string-array name="default_captive_portal_fallback_urls" translatable="false">
<item>http://connect.rom.miui.com/generate_204</item>
<item>http://connect.rom.miui.com/generate_204</item>
</string-array>
编译后烧录发现没有效果。查看源码后发现会先取R.array.config_captive_portal_https_urls的值
src\com\android\server\connectivity\NetworkMonitor.java
private URL[] makeCaptivePortalHttpsUrls(@NonNull Context context) {
final URL testUrl = getTestUrl(TEST_CAPTIVE_PORTAL_HTTPS_URL);
if (testUrl != null) return new URL[] { testUrl };
final String firstUrl = getCaptivePortalServerHttpsUrl(context);
try {
final URL[] settingProviderUrls =
combineCaptivePortalUrls(firstUrl, CAPTIVE_PORTAL_OTHER_HTTPS_URLS);
// firstUrl will at least be default configuration, so default value in
// getProbeUrlArrayConfig is actually never used.
return getProbeUrlArrayConfig(context, settingProviderUrls,
R.array.config_captive_portal_https_urls,
DEFAULT_CAPTIVE_PORTAL_HTTPS_URLS, this::makeURL);
} catch (Exception e) {
// Don't let a misconfiguration bootloop the system.
Log.e(TAG, "Error parsing configured https URLs", e);
// Ensure URL aligned with legacy configuration.
return new URL[]{makeURL(firstUrl)};
}
}
private <T> T[] getProbeUrlArrayConfig(@NonNull Context context, @NonNull T[] providerValue,
@ArrayRes int configResId, String[] defaultConfig,
@NonNull Function<String, T> resourceConverter) {
final Resources res = context.getResources();
String[] configValue = res.getStringArray(configResId);
Log.i(TAG, "configValue.length = " + configValue.length);
if (configValue.length == 0) {
if (providerValue.length > 0) {
return providerValue;
}
configValue = defaultConfig;
}
return convertStrings(configValue, resourceConverter, Arrays.copyOf(providerValue, 0));
}
如果R.array.config_captive_portal_https_urls是有值的,则会使用config_captive_portal_https_urls的值。
在config.xml中发现config_captive_portal_https_urls没有值
res\values\config.xml
<string-array name="config_captive_portal_https_urls" translatable="false">
</string-array>
添加打印,configValue的长度是大于0的.
最终解决方式:
修改vnd\vendor\mediatek\proprietary\packages\overlay\vendor\NetworkStackResOverlay\res\values\config.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string-array name="config_captive_portal_https_urls" translatable="false">
- <item>https://connectivitycheck.gstatic.com/generate_204</item>
- <item>https://www.google.cn/generate_204</item>
- </string-array>
+ <string-array name="config_captive_portal_https_urls" translatable="false">
+ <item>https://connect.rom.miui.com/generate_204</item>
+ <item>https://connect.rom.miui.com/generate_204</item>
+ </string-array>
</resources>
generate_204可用地址:测联通性的网址_generate_204 测速地址-CSDN博客