Android12 WIFI 無法提供互聯網連接

平臺

RK3588 + Android 12

問題描述

ConnectivityService是Android系統中負責處理網絡連接的服務之一。它負責管理設備的網絡連接狀態,包括Wi-Fi、移動數據、藍牙等。
在Android系統中,ConnectivityService提供了一些關鍵功能,包括但不限于:

  1. 網絡狀態監測: 它監測設備的網絡狀態,包括連接到的網絡類型(如Wi-Fi、移動數據)、網絡是否可用等。
  2. 網絡類型切換: 當設備從一個網絡切換到另一個網絡時,ConnectivityService負責協調這個過程,以確保應用程序可以繼續正常工作。
  3. 網絡連接管理: 它允許應用程序查詢當前網絡連接的狀態,并可以請求建立或中斷網絡連接。
  4. 網絡通知: 它可以向應用程序發送廣播通知,以通知它們有關網絡狀態的變化。

本文主要記錄兩點:

  1. Android 12 的ConnectivityService源碼路徑和機構的一些變化
  2. Wifi連接中的"已連接到設備,但無法提供互聯網連接"問題.
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在連接到指定的WIFI熱點后, 有時候會顯示上面的提示信息, 大致的意思就是, 連上了但是上不了網

WIFI 設置

packages/apps/Settings/src/com/android/settings/network/NetworkProviderSettings.java

Can’t provide internet在哪里? 不在Settings 也不在 SettingsLib, 而是在WifiTrackerLib

frameworks/opt/net/wifi/libs/WifiTrackerLib/res/values/strings.xml

    <!-- Summary for connected wifi network without internet [CHAR LIMIT=NONE] --><string name="wifitrackerlib_wifi_connected_cannot_provide_internet">Connected to device. Can\'t provide internet.</string>

frameworks/opt/net/wifi/libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java
wifitrackerlib_wifi_connected_cannot_provide_internet

    static String getCurrentNetworkCapabilitiesInformation(Context context,NetworkCapabilities networkCapabilities) {if (context == null || networkCapabilities == null) {return "";}if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)) {return context.getString(context.getResources().getIdentifier("network_available_sign_in", "string", "android"));}if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY)) {return context.getString(R.string.wifitrackerlib_wifi_limited_connection);}if (!networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {if (networkCapabilities.isPrivateDnsBroken()) {return context.getString(R.string.wifitrackerlib_private_dns_broken);}return context.getString(R.string.wifitrackerlib_wifi_connected_cannot_provide_internet);}return "";}

ConnectivityManager.java 有幾個, 需要注意不要改錯

frameworks/layoutlib/bridge/src/android/net/ConnectivityManager.java
packages/modules/Connectivity/core/java/android/net/ConnectivityManager.java
packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java

ConnectivityService.java 同樣有多個

packages/modules/Connectivity/service/src/com/android/server/ConnectivityService.java
packages/modules/Connectivity/services/core/java/com/android/server/ConnectivityService.java

如何單編譯ConnectivityService 注意, 使用的是service.

mmm packages/modules/Connectivity/service/:service-connectivity
# 將會生成文件:
out/target/product/rk3588_s/system/apex/com.android.tethering/javalib/service-connectivity.jar

替換主板中的文件并重啟即可

# 需注意,主板中有兩個同名文件:
#	/apex/com.android.tethering/javalib/service-connectivity.jar
#	/system/apex/com.android.tethering.inprocess/javalib/service-connectivity.jar
# 不要搞錯路徑
## root 和 remount 之后
adb push service-connectivity.jar /system/apex/com.android.tethering.inprocess/javalib/

????在 Android 源代碼中,com.android.tethering 通常用于處理網絡共享(Tethering)的功能。網絡共享允許設備通過不同的網絡接口(如移動數據、Wi-Fi或藍牙)與其他設備共享其網絡連接。

具體來說,com.android.tethering 是 Android 框架的一部分,負責實現和管理網絡共享的相關功能。這包括創建和管理 Wi-Fi 熱點、USB 網絡共享以及藍牙網絡共享等。

簡單整理下Wifi列表中連接狀態的數據傳遞:

NetworkProviderSettings WifiPickerTracker BaseWifiTracker ConnectivityManager CallbackHandler ConnectivityService NetworkStateTrackerHandler packages/apps/Settings getWifiEntries frameworks/opt/net/wifi/libs/WifiTrackerLib onStart packages/modules/Connectivity/service registerNetworkCallback sendRequestForNetwork trigger maybeHandleNetworkMonitorMessage handleNetworkTested updateCapabilities notifyNetworkCallbacks callCallbackForRequest handleMessage(CALLBACK_CAP_CHANGED) onCapabilitiesChanged handleNetworkCapabilitiesChanged NetworkProviderSettings WifiPickerTracker BaseWifiTracker ConnectivityManager CallbackHandler ConnectivityService NetworkStateTrackerHandler

修改

  1. 修改認證地址
    先看一段LOG:
PROBE_DNS www.google.cn 5055ms OK 220.181.174.226
PROBE_DNS www.google.cn 5059ms OK 220.181.174.226
PROBE_HTTP http://www.google.cn/generate_204 time=126ms ret=204 request={Connection=[close], User-Agent=[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36]} headers={null=[HTTP/1.1 204 No Content], Connection=[close], Content-Length=[0], Cross-Origin-Resource-Policy=[cross-origin], Date=[Tue, 05 Dec 2023 01:21:40 GMT], X-Android-Received-Millis=[1701739300483], X-Android-Response-Source=[NETWORK 204], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1701739300402]}
PROBE_HTTPS https://www.google.cn/generate_204 time=284ms ret=204 request={Connection=[close], User-Agent=[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36]} headers={null=[HTTP/1.1 204 No Content], Alt-Svc=[h3=":443"; ma=2592000,h3-29=":443"; ma=2592000], Connection=[close], Content-Length=[0], Cross-Origin-Resource-Policy=[cross-origin], Date=[Tue, 05 Dec 2023 01:21:40 GMT], X-Android-Received-Millis=[1701739300641], X-Android-Response-Source=[NETWORK 204], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1701739300521]}
PROBE_FALLBACK http://www.google.com/gen_204 Probe failed with exception java.net.ConnectException: Failed to connect to www.google.com/4.78.139.54:80
PROBE_FALLBACK http://www.google.com/gen_204 Probe failed with exception java.net.SocketTimeoutException: failed to connect to www.google.com/31.13.94.37 (port 80) from /192.168.1.86 (port 51118) after 10000ms

packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java

    @VisibleForTestingpublic NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,IpConnectivityLog logger, SharedLog validationLogs,@NonNull NetworkStackServiceManager serviceManager, Dependencies deps,@Nullable TcpSocketTracker tst) {// Add suffix indicating which NetworkMonitor we're talking about.super(TAG + "/" + network.toString());// ...mIsCaptivePortalCheckEnabled = getIsCaptivePortalCheckEnabled();mPrivateIpNoInternetEnabled = getIsPrivateIpNoInternetEnabled();mMetricsEnabled = deps.isFeatureEnabled(context, NAMESPACE_CONNECTIVITY,NetworkStackUtils.VALIDATION_METRICS_VERSION, true /* defaultEnabled */);mUseHttps = getUseHttpsValidation();mCaptivePortalUserAgent = getCaptivePortalUserAgent();mCaptivePortalHttpsUrls = makeCaptivePortalHttpsUrls();android.util.Log.d(TAG, "mCaptivePortalHttpsUrls[0]=" + mCaptivePortalHttpsUrls[0].toString());mCaptivePortalHttpUrls = makeCaptivePortalHttpUrls();mCaptivePortalFallbackUrls = makeCaptivePortalFallbackUrls();mCaptivePortalFallbackSpecs = makeCaptivePortalFallbackProbeSpecs();//....}private URL[] makeCaptivePortalHttpsUrls() {final URL testUrl = getTestUrl(TEST_CAPTIVE_PORTAL_HTTPS_URL);if (testUrl != null) return new URL[] { testUrl };final String firstUrl = getCaptivePortalServerHttpsUrl();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(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 String getCaptivePortalServerHttpsUrl() {return getSettingFromResource(mCustomizedContext,R.string.config_captive_portal_https_url, CAPTIVE_PORTAL_HTTPS_URL,mCustomizedContext.getResources().getString(R.string.default_captive_portal_https_url));}

修改配置文件即可:

packages/modules/NetworkStack/res/values/config.xml

<!-- HTTP URL for network validation, to use for detecting captive portals. --><!-- default_captive_portal_http_url is not configured as overlayable soOEMs that wish to change captive_portal_http_url configuration mustdo so via configuring runtime resource overlay toconfig_captive_portal_http_url and *NOT* by changing or overlayingthis resource. It will break if the enforcement of overlayable starts.--><string name="default_captive_portal_http_url" translatable="false">http://connectivitycheck.gstatic.com/generate_204</string><!-- HTTPS URL for network validation, to use for confirming internet connectivity. --><!-- default_captive_portal_https_url is not configured as overlayable soOEMs that wish to change captive_portal_https_url configuration mustdo so via configuring runtime resource overlay toconfig_captive_portal_https_url and *NOT* by changing or overlayingthis resource. It will break if the enforcement of overlayable starts.--><string name="default_captive_portal_https_url" translatable="false">https://www.google.com/generate_204</string><!-- List of fallback URLs to use for detecting captive portals. --><!-- default_captive_portal_fallback_urls is not configured as overlayableso OEMs that wish to change captive_portal_fallback_urls configurationmust do so via configuring runtime resource overlay toconfig_captive_portal_fallback_urls and *NOT* by changing or overlayingthis resource. It will break if the enforcement of overlayable starts.--><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><!-- Configuration hooks for the above settings.Empty by default but may be overridden by RROs. --><integer name="config_captive_portal_dns_probe_timeout"></integer><!--suppress CheckTagEmptyBody: overlayable resource to use as configuration hook --><string name="config_captive_portal_http_url" translatable="false"></string><!--suppress CheckTagEmptyBody: overlayable resource to use as configuration hook --><string name="config_captive_portal_https_url" translatable="false"></string>

前面改了不生效, 注意:OVERLAY

device/rockchip/common/overlay/packages/modules/NetworkStack/res/values/config.xml

<string name="config_captive_portal_http_url" translatable="false">http://www.google.cn/generate_204</string>

編譯:mmm packages/modules/NetworkStack/:InProcessNetworkStack

還可以嘗試使用RRO的方式

vendor/rockchip/common/gms/RockchipNetworkStackConfigOverlay/res/values/config.xml

<string name="config_captive_portal_https_url" translatable="false">https://www.google.cn/generate_204</string>
  1. 自動確認保持連接
    通知的發出:
showNotification tag=ConnectivityNotification:100 event=NO_INTERNET transport=WLAN name=XXXX highPriority=true
 private void showNetworkNotification(NetworkAgentInfo nai, NotificationType type) {final String action;final boolean highPriority;switch (type) {case NO_INTERNET:action = ConnectivityManager.ACTION_PROMPT_UNVALIDATED;// High priority because it is only displayed for explicitly selected networks.highPriority = true;break;case PRIVATE_DNS_BROKEN:action = Settings.ACTION_WIRELESS_SETTINGS;// High priority because we should let user know why there is no internet.highPriority = true;break;case LOST_INTERNET:action = ConnectivityManager.ACTION_PROMPT_LOST_VALIDATION;// High priority because it could help the user avoid unexpected data usage.highPriority = true;break;case PARTIAL_CONNECTIVITY:action = ConnectivityManager.ACTION_PROMPT_PARTIAL_CONNECTIVITY;// Don't bother the user with a high-priority notification if the network was not// explicitly selected by the user.highPriority = nai.networkAgentConfig.explicitlySelected;break;default:Log.wtf(TAG, "Unknown notification type " + type);return;}Intent intent = new Intent(action);if (type != NotificationType.PRIVATE_DNS_BROKEN) {intent.putExtra(ConnectivityManager.EXTRA_NETWORK, nai.network);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// Some OEMs have their own Settings package. Thus, need to get the current using// Settings package name instead of just use default name "com.android.settings".final String settingsPkgName = getSettingsPackageName(mContext.getPackageManager());intent.setClassName(settingsPkgName,settingsPkgName + ".wifi.WifiNoInternetDialog");}PendingIntent pendingIntent = PendingIntent.getActivity(mContext.createContextAsUser(UserHandle.CURRENT, 0 /* flags */),0 /* requestCode */,intent,PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);mNotifier.showNotification(nai.network.getNetId(), type, nai, null, pendingIntent, highPriority);}

點擊通知后:

START u0 {act=android.net.action.PROMPT_UNVALIDATED flg=0x10000000 cmp=com.android.settings/.wifi.WifiNoInternetDialog (has extras)} from uid 1000

看Settings的清單:

packages/apps/Settings/AndroidManifest.xml

        <activity android:name=".wifi.WifiNoInternetDialog"android:clearTaskOnLaunch="true"android:excludeFromRecents="true"android:exported="true"android:permission="android.permission.NETWORK_STACK"android:theme="@*android:style/Theme.DeviceDefault.Dialog.Alert.DayNight"><!-- TODO: Consider removing below two intent filters.It seems like below two intent filters can be removed because when the notificationis clicked, this activity will be launched anyway. --><intent-filter><action android:name="android.net.action.PROMPT_UNVALIDATED" /><category android:name="android.intent.category.DEFAULT" /></intent-filter><intent-filter><action android:name="android.net.action.PROMPT_LOST_VALIDATION" /><category android:name="android.intent.category.DEFAULT" /></intent-filter><meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"android:value="true" /></activity>

packages/apps/Settings/src/com/android/settings/wifi/WifiNoInternetDialog.java

    @Overridepublic void onClick(DialogInterface dialog, int which) {if (which != BUTTON_NEGATIVE && which != BUTTON_POSITIVE) return;final boolean always = mAlwaysAllow.isChecked();final String what, action;mButtonClicked = true;if (ACTION_PROMPT_UNVALIDATED.equals(mAction)) {what = "NO_INTERNET";final boolean accept = (which == BUTTON_POSITIVE);action = (accept ? "Connect" : "Ignore");mCM.setAcceptUnvalidated(mNetwork, accept, always);} else if (ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {what = "PARTIAL_CONNECTIVITY";final boolean accept = (which == BUTTON_POSITIVE);action = (accept ? "Connect" : "Ignore");mCM.setAcceptPartialConnectivity(mNetwork, accept, always);} else {what = "LOST_INTERNET";final boolean avoid = (which == BUTTON_POSITIVE);action = (avoid ? "Switch away" : "Get stuck");if (always) {Settings.Global.putString(mAlertParams.mContext.getContentResolver(),Settings.Global.NETWORK_AVOID_BAD_WIFI, avoid ? "1" : "0");} else if (avoid) {mCM.setAvoidUnvalidated(mNetwork);}}Log.d(TAG, what + ": " + action +  " network=" + mNetwork +(always ? " and remember" : ""));}

packages/modules/Connectivity/service/src/com/android/server/ConnectivityService.java

    @Overridepublic void setAcceptUnvalidated(Network network, boolean accept, boolean always) {enforceNetworkStackSettingsOrSetup();mHandler.sendMessage(mHandler.obtainMessage(EVENT_SET_ACCEPT_UNVALIDATED,encodeBool(accept), encodeBool(always), network));}private void handleSetAcceptUnvalidated(Network network, boolean accept, boolean always) {if (DBG) log("handleSetAcceptUnvalidated network=" + network +" accept=" + accept + " always=" + always);NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);if (nai == null) {// Nothing to do.return;}if (nai.everValidated) {// The network validated while the dialog box was up. Take no action.return;}if (!nai.networkAgentConfig.explicitlySelected) {Log.wtf(TAG, "BUG: setAcceptUnvalidated non non-explicitly selected network");}if (accept != nai.networkAgentConfig.acceptUnvalidated) {nai.networkAgentConfig.acceptUnvalidated = accept;// If network becomes partial connectivity and user already accepted to use this// network, we should respect the user's option and don't need to popup the// PARTIAL_CONNECTIVITY notification to user again.nai.networkAgentConfig.acceptPartialConnectivity = accept;nai.updateScoreForNetworkAgentUpdate();rematchAllNetworksAndRequests();}if (always) {nai.onSaveAcceptUnvalidated(accept);}if (!accept) {// Tell the NetworkAgent to not automatically reconnect to the network.nai.onPreventAutomaticReconnect();// Teardown the network.teardownUnneededNetwork(nai);}}

增加屬性控制, 不發送通知, 并執行保持連接:

    private void handlePromptUnvalidated(Network network) {//Force keep-connect for networkif("1".equals(android.os.SystemProperties.get("persist.sys.keepNetworkConnect"))){handleSetAcceptUnvalidated(network, true, true);return;}}
  1. 關閉網絡測試

packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java

//    public static final String CAPTIVE_PORTAL_MODE = "captive_portal_mode";
//    public static final int CAPTIVE_PORTAL_MODE_IGNORE = 0;
//    public static final int CAPTIVE_PORTAL_MODE_PROMPT = 1;private boolean getIsCaptivePortalCheckEnabled() {String symbol = CAPTIVE_PORTAL_MODE;int defaultValue = CAPTIVE_PORTAL_MODE_PROMPT;int mode = mDependencies.getSetting(mContext, symbol, defaultValue);return mode != CAPTIVE_PORTAL_MODE_IGNORE;}public static class Dependencies {//..../*** Get the value of a global integer setting.* @param symbol Name of the setting* @param defaultValue Value to return if the setting is not defined.*/public int getSetting(Context context, String symbol, int defaultValue) {return Settings.Global.getInt(context.getContentResolver(), symbol, defaultValue);}
adb shell settings put global captive_portal_mode 0

參考

ConnectivityService處理wifi連接
android 網絡連接受限解決
android 網絡重新連接時BaseActivity處理 android網絡連接受限
android wif 去掉 雙引號 原生安卓去掉wifi叉號
AndroidQ RRO(Runtime Resource Overlay)機制(1)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209856.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot Async:從入門到精通,原理詳解與最佳實踐

Spring Boot 的異步功能&#xff08;Async&#xff09;允許我們將某些任務異步執行&#xff0c;而不會阻塞主線程。這對于處理耗時的操作非常有用&#xff0c;如發送電子郵件、生成報表、調用外部 API 等。通過異步處理&#xff0c;我們可以釋放主線程&#xff0c;讓它繼續處理…

低多邊形游戲風格3D模型紋理貼圖

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xf…

區塊鏈實驗室(29) - 關閉或刪除FISCO日志

1. FISCO日志 缺省情況下&#xff0c;FISCO啟動日志模塊&#xff0c;日志記錄的位置在節點目錄中。以FISCO自帶案例為例&#xff0c;4節點的FISCO網絡&#xff0c;24個區塊產生的日志大小&#xff0c;見下圖所示。 2.關閉日志模塊 當節點數量增大&#xff0c;區塊高度增大時&…

總結:服務器批量處理http請求的大致流程

總結&#xff1a;服務器批量處理http請求的大致流程 一客戶端發起請求&#xff1a;可以多個請求同時發送二Web服務器解析請求&#xff08;如&#xff1a;Nginx&#xff09;&#xff1a;可以多個請求同時解析三Servlet容器接收請求&#xff08;如&#xff1a;tomcat&#xff09;…

【EI會議征稿中】第三屆信號處理與通信安全國際學術會議(ICSPCS 2024)

第三屆信號處理與通信安全國際學術會議&#xff08;ICSPCS 2024&#xff09; 2024 3rd International Conference on Signal Processing and Communication Security 信號處理和通信安全是現代信息技術應用的重要領域&#xff0c;近年來這兩個領域的研究相互交叉促進&#xf…

SpringBoot集成Elasticsearch8.x(9)|(RestClient實現Elasticsearch DSL操作)

SpringBoot集成Elasticsearch8.x&#xff08;9&#xff09;|&#xff08;RestClient curl實現Elasticsearch DSL的操作&#xff09; 文章目錄 SpringBoot集成Elasticsearch8.x&#xff08;9&#xff09;|&#xff08;RestClient curl實現Elasticsearch DSL的操作&#xff09;[T…

InsCode:CSDN的創新代碼分享平臺,融合AI技術提升編程體驗

InsCode AI Chat 能夠讓你通過聊天的方式幫你優化代碼。 一&#xff1a;前言 InsCode 是csdn推出的一個代碼分享網站 二、使用 AI 輔助完成代碼 下面我們就從實踐出發&#xff0c;基于 InsCode 的 AI輔助編程&#xff0c;寫Python實現的計算器。 1.基于模板創建項目 這里我…

關于SQL注入問題及解決--小記

1.SQL注入問題 SQL 注入是一種常見的安全漏洞&#xff0c;它發生在應用程序未正確驗證和處理用戶提供的輸入數據時。攻擊者可以通過惡意構造的輸入&#xff0c;將額外的 SQL 代碼注入到應用程序的查詢語句中&#xff0c;從而執行未經授權的數據庫操作。 SQL 注入問題通常出現…

行業地位失守,業績持續失速,科沃斯的故事不好講

特勞特曾在《定位》一書中提到&#xff0c;為了在容量有限的消費者心智中占據品類&#xff0c;品牌最好的差異化就是成為第一&#xff0c;做品類領導者或開創者&#xff0c;銷量遙遙領先&#xff1b;其次分化品類&#xff0c;做到細分品類的唯一&#xff0c;即細分品類的第一。…

Elon Musk艾隆?馬斯克的聊天機器人Grok上線可以使用啦,為X Premium Plus訂閱者推出

艾隆?馬斯克旗下的 AI 初創公司X&#xff08;前身“推特”&#xff09;開發的 ChatGPT 競爭對手 Grok 已經在 X 平臺上正式推出。Grok 是一個基于生成模型 Grok-1的聊天機器人&#xff0c;它能夠回答問題并提供最新的信息。與其他聊天機器人不同&#xff0c;Grok 可以實時獲取…

Java基礎-IDEA下載、卸載、安裝、使用

目錄 1. IDEA下載2. IDEA卸載3. IDEA安裝4. 基本使用 1. IDEA下載 IDEA下載網址 2. IDEA卸載 3. IDEA安裝 更改IDEA安裝目錄 是否創建桌面圖標 下一步 success&#xff01; 4. 基本使用 新建項目 新建模塊 新建包 新建Java文件 編寫代碼 運行測試

2020藍橋杯c組紙張大小

題目名字 紙張大小 題目鏈接 題意 給一張紙&#xff0c;通過不斷折疊&#xff0c;求最終長寬&#xff0c;給十個數字&#xff0c;輸入哪個數字就求哪次折疊的長寬&#xff0c;其實就是&#xff0c;每次折疊后長度的一半變為寬度&#xff0c;原來的寬度變成長度 思路 因為數字…

python之馬爾科夫鏈(Markov Chain)

馬爾可夫鏈&#xff08;Markov Chain&#xff09;是一種隨機過程&#xff0c;具有“馬爾可夫性質”&#xff0c;即在給定當前狀態的條件下&#xff0c;未來狀態的概率分布僅依賴于當前狀態&#xff0c;而與過去狀態無關。馬爾可夫鏈在很多領域都有廣泛的應用&#xff0c;包括蒙…

【C語言】網絡字節序和主機字節序

網絡字節序和主機字節序是計算機中字節的兩種排序方式&#xff0c;它們主要用于解決不同計算機之間數據通信的問題。 一、網絡字節序 也被稱為大端字節序&#xff0c;是一種標準的字節序。在網絡通信中&#xff0c;如果兩臺主機的字節序不同&#xff0c;可能會導致數據解釋的二…

Swagger提示請確保swagger資源接口正確

問題描述 在項目開發過程中集成swagger-bootstrap-ui&#xff0c;打開swagger-ui.html頁面正常&#xff0c;但是打開doc.html頁面提示"請確保swagger資源接口正確"。 原因分析&#xff1a; 原因是JSON格式非法&#xff0c;一般出現此情況時&#xff0c;是因為后端…

shell條件測試

1.1.用途 為了能夠正確處理Shell程序運行過程中遇到的各種情況&#xff0c;Linux Shell提供了一組測試運算符. 通過這些運算符&#xff0c;shell程序能夠判斷某種或者幾個條件是否成立。 條件測試在各種流程控制語句&#xff0c;例如判斷語句和循環語句中發揮了…

數據分析實例:基于電力大數據的中小型企業運營發展分析

前不久&#xff0c;帆軟發起了【2023BI數據分析大賽】的活動&#xff0c;老李我也是這個大賽的評委。 ? 今天跟大家分享的是基于電力大數據的中小型企業運營發展分析。 當我們去解讀一份數據分析報告時&#xff0c;首先要了解這份報告的主要目的是什么&#xff0c;作者通過分…

第19關 5.2k star 開源分布式存儲服務Rancher-Longhorn在k8s上部署

------> 課程視頻同步分享在今日頭條和B站 大家好&#xff0c;我是博哥愛運維。 什么是Longhorn Longhorn是一個輕量級、可靠且易于使用的Kubernetes分布式塊存儲系統。 Longhorn 是免費的開源軟件。它最初由 Rancher Labs 開發&#xff0c;現在作為云原生計算基金會的孵…

X86匯編語言:從實模式到保護模式(代碼+注釋)--c7

X86匯編語言&#xff1a;從實模式到保護模式&#xff08;代碼注釋&#xff09;–c6 ;代碼清單7-1;文件名&#xff1a;c07_mbr.asm;文件說明&#xff1a;硬盤主引導扇區代碼;創建日期&#xff1a;2011-4-13 18:02jmp near startmessage db 123...100start:mov ax,0x7c0 …

class061 最小生成樹【算法】

class061 最小生成樹【算法】 2023-12-8 11:48:12 算法講解061【必備】最小生成樹 code1 P3366 【模板】最小生成樹 // Kruskal算法模版&#xff08;洛谷&#xff09; // 靜態空間實現 // 測試鏈接 : https://www.luogu.com.cn/problem/P3366 // 請同學們務必參考如下代碼中…