Android11三網共存

一、優先級基本知識介紹

Android6.0之后系統中優先級設置都是根據Score分值來設置優先級,分值0-100,數值越高,越優先。

 
SIM卡網絡  50
wifi網絡   60
有線網絡   70

手機網絡設置都有自己的Factory設置類,都繼承自NetworkFactory.java
wifi網絡設置類:WifiNetworkFactory.java packages/modules/Wifi/service/java/com/android/server/wifi/WifiNetworkFactory.java
有線網絡設置類:EthernetNetworkFactory.java frameworks\opt\net\ethernet\java\com\android\server\ethernet\EthernetNetworkFactory.java

移動網絡設置類:TelephonyNetworkFactory.java

frameworks\opt\telephony\src\java\com\android\internal\telephony\dataconnection\TelephonyNetworkFactory.java

NetworkFactory的子類都有NETWORK_SCORE常量,表示該網絡的分值。

二、有線網絡優先級設置
1、在Android9.0設置有線網絡優先級直接修改EthernetNetworkFactory.java的 NETWORK_SCORE 值就行
private final static int NETWORK_SCORE = 55; //change score from 70

但是我Android11 的代碼修改后發現并不能生效,還是有線網優先。
研究了一下EthernetNetworkFactory.java和ConnectivityService.java發現里面的邏輯有很大的修改。

2、在Android11 修改有線網絡優先級
找到EthernetNetworkFactory.java的getNetworkScore()方法,這里面返回的score才是有線網的有效分值;

這個getNetworkScore()方法是在Android11 新增的。

在該方法返回NETWORK_SCORE值即可。里面很多判斷是沒啥用的。

如果要wifi優先級高于有線,一定要設置有線網絡的分值比wifi小,在后期測試過程中發現在某些情況,wifi的分值會變成20,把有線網絡分值設置成15才生效。

frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java

        private int getNetworkScore() {return 10;// never set the network score below 0.// if (!mLinkUp) {//     return 0;// }// int[] transportTypes = mCapabilities.getTransportTypes();// if (transportTypes.length < 1) {//     Log.w(TAG, "Network interface '" + mLinkProperties.getInterfaceName() + "' has no "//             + "transport type associated with it. Score set to zero");//     return 0;// }// TransportInfo transportInfo = sTransports.get(transportTypes[0], /* if dne */ null);// if (transportInfo != null) {//     return transportInfo.mScore;// }// return 0;}

修改共存代碼 支持三網共存

frameworks/libs/net/common/src_servicescommon/android/net/NetworkFactory.java

    private void evalRequest(NetworkRequestInfo n) {if (VDBG) {log("evalRequest");log(" n.requests = " + n.requested);log(" n.score = " + n.score);log(" mScore = " + mScore);log(" request.providerId = " + n.providerId);log(" mProvider.id = " + mProvider.getProviderId());}if (shouldNeedNetworkFor(n)) {if (VDBG) log("  needNetworkFor");needNetworkFor(n.request, n.score);n.requested = true;} else if (shouldReleaseNetworkFor(n)) {if (VDBG) log("  releaseNetworkFor");隱藏下面兩塊// releaseNetworkFor(n.request);// n.requested = false;} else {if (VDBG) log("  done");}}直接返回trueprivate boolean shouldNeedNetworkFor(NetworkRequestInfo n) {return true;// // If this request is already tracked, it doesn't qualify for need// return !n.requested//     // If the score of this request is higher or equal to that of this factory and some//     // other factory is responsible for it, then this factory should not track the request//     // because it has no hope of satisfying it.//     && (n.score < mScore || n.providerId == mProvider.getProviderId())//     // If this factory can't satisfy the capability needs of this request, then it//     // should not be tracked.//     && n.request.canBeSatisfiedBy(mCapabilityFilter)//     // Finally if the concrete implementation of the factory rejects the request, then//     // don't track it.//     && acceptRequest(n.request, n.score);}

frameworks/base/services/core/java/com/android/server/ConnectivityService.java

隱藏兩處nai.asyncChannel.disconnect();

private boolean maybeHandleAsyncChannelMessage(Message msg) {switch (msg.what) {default:return false;case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: {handleAsyncChannelHalfConnect(msg);break;}case AsyncChannel.CMD_CHANNEL_DISCONNECT: {NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);// if (nai != null) nai.asyncChannel.disconnect();break;}case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {handleAsyncChannelDisconnected(msg);break;}}return true;}private void teardownUnneededNetwork(NetworkAgentInfo nai) {if (nai.numRequestNetworkRequests() != 0) {for (int i = 0; i < nai.numNetworkRequests(); i++) {NetworkRequest nr = nai.requestAt(i);// Ignore listening requests.if (nr.isListen()) continue;loge("Dead network still had at least " + nr);break;}}// nai.asyncChannel.disconnect();}

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

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

相關文章

【散刷】二叉樹基礎OJ題(三)

&#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的基礎算法學習以及刷題記錄&#xff0c;使用語言為C。 每道題我會給出LeetCode上的題號&#xff08;如果有題號&#xff09;&#xff0c;題目&#xff0c;以及最后通過的代碼。沒有題號的題目大多來自牛客網。對于題目的…

什么是數據交換?有哪些數據交換方式?

目錄 一、數據交換是什么 二、數據交換面臨的挑戰 1. 數據格式差異 2. 數據標準不統一 3. 安全與隱私問題 4. 網絡與性能問題 三、常見的數據交換方式 1. 文件交換 2. 數據庫直連 3. 中間件交換 4. API接口交換 四、數據交換的發展趨勢 1. 實時性要求提高 2. 標準…

C#winform畫圖代碼記錄

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 坐標變換 {public partial class Fo…

python打卡day50

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt import numpy as np# 定義通道注意力 class ChannelAttention(nn.Module):def __i…

Go語言多線程問題

打印零與奇偶數&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥鎖和條件變量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…

ateⅹⅰt()的用法

在C/C++中, atexit() 函數用于注冊程序退出時需要調用的函數,即使程序通過 main() 函數返回、 exit() 函數退出或異常終止,這些注冊的函數也會被執行。以下是其詳細用法: 1. 函數原型與頭文件 #include <cstdlib> // C++中需包含此頭文件 int atexit(void (*functio…

【大模型】 使用llama.cpp 進行模型轉換和量化

目錄 1 相關知識 ■llama.cpp ■GGUF 格式 ■量化 2 詳細步驟 克隆 llama.cpp 倉庫 安裝依賴 配置 CMake 構建 構建項目 驗證安裝 轉換 safetensors 為 FP16 GGUF 量化模型 (Q4_K_M) 測試量化模型 1 相關知識 ■llama.cpp llama.cpp是一個開源的 C/C++ 庫,旨…

大數據學習(133)-Hive數據分析2

????&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4…

IDEA 連接 Docker 一鍵打鏡像

首先&#xff0c;檢查 IDEA 是否安裝了 Docker 插件&#xff1a; 版本比較新的 IDEA 默認都安裝了這個插件&#xff0c;如果沒有安裝&#xff0c;安裝一下。 確保我們虛擬機上安裝了 Docker 和 Docker-compose&#xff0c;并啟動了 Docker。 找到 IDEA 下方的 Services tab 欄…

第六講——一元函數微分學的應用之中值定理、微分等式與微分不等式

文章目錄 連續函數性質定理定理1 有界與最值定理定理2 介值定理定理3 平均值定理定理4 零點定理定理5 費馬定理導數介值定理(達布定理) 中值定理羅爾定理拉格朗日中值定理柯西中值定理泰勒公式 討論方程的根問題——微分等式證明不等式問題使用函數的性質(單調性、凹凸性、最值…

2025.06.11【Ribo-seq】|用CPAT預測sORF序列的編碼潛能

文章目錄 前言一、準備工作1. 安裝CPAT2. 下載物種特異性模型 二、準備sORF核酸序列1. 獲取sORF的拼接核酸序列示例腳本&#xff08;假設已獲得外顯子fasta&#xff09;&#xff1a; 三、運行CPAT預測編碼潛能1. 準備CPAT模型和hexamer表2. 運行CPAT 四、結果解讀五、常見問題與…

Hive面試題匯總

一、hive架構相關 遇到這類問題&#xff0c;可以靈活的去回答&#xff0c;比如可以結合平時使用hive的經驗作答&#xff0c;也可以結合下圖從數據的讀入、解析、元數據的管理&#xff0c;數據的存儲等角度回答&#xff1a; 二、hive的特點 本題主要為了考察對hive的整體使用…

樹莓派超全系列教程文檔--(57)如何設置 Apache web 服務器

如何設置 Apache web 服務器 設置 Apache web 服務器安裝 Apache測試 web 服務器更改默認網頁 為 Apache 安裝 PHP 文章來源&#xff1a; http://raspberry.dns8844.cn/documentation 原文網址 設置 Apache web 服務器 Apache 是一款流行的 web 服務器應用程序&#xff0c;您…

(九)現代循環神經網絡(RNN):從注意力增強到神經架構搜索的深度學習演進

現代循環神經網絡的內容&#xff0c;將介紹幾種先進的循環神經網絡架構&#xff0c;包括門控循環單元&#xff08;GRU&#xff09;、長短期記憶網絡&#xff08;LSTM&#xff09;的變體&#xff0c;以及注意力機制等。這些內容將幫助你更深入地理解循環神經網絡的發展和應用。 …

牛市與熊市:市場周期的雙面鏡

牛市推動資產增值與風險積累&#xff0c;熊市擠壓泡沫并孕育機會&#xff0c;兩者交替循環&#xff0c;構成市場自我調節機制。 1、概念對比&#xff1a;情緒與趨勢的博弈 牛市&#xff08;Bull Market&#xff09;&#xff1a;指資產價格持續上漲&#xff08;通常漲幅超20%&a…

web程序設計期末復習-填空題

常用標簽 塊級標記 行內標記等 一、塊級元素 特點&#xff1a; 獨占一行可以設置寬度、高度、內外邊距默認情況下會從上到下垂直排列 常見標簽&#xff1a; 標簽 含義 <div> 最常用的通用塊級容器 <p> 段落 <h1>到<h6> 標題&#xff08;一級…

go全局配置redis,全局只需要連接一次,然后全局可以引用使用

創建redis文件夾、創建dadeRedis.go package redisimport ("context""github.com/go-redis/redis/v8""log""time" )var (client *redis.Clientctx context.Background() )// 初始化Redis連接&#xff08;建議在程序啟動時調用&am…

緩沖區(C語言緩沖區+內核緩沖區)一個例子解釋他們的關系和作用!!!

首先提出問題&#xff1a; 為什么以下代碼是先sleep三秒后&#xff0c;屏幕才顯示"XXXXXXX"。 #include<stdio.h> #include<unistd.h>int main() {printf("XXXXXXX");sleep(3);return 0; } 為什么以下代碼是先顯示"XXXXXXX"&#xf…

【2025版】Java 工程師學習路線圖 —— 掌握程度描述版

?【2025版】Java 工程師學習路線圖 &#x1f4a1; 目標&#xff1a;成為合格的 Java 工程師&#xff08;前后端都要會&#xff09; &#x1f4dd; 結構清晰 | 階段明確 | 掌握程度分級 | 適合自學或轉行 &#x1f539; 階段一&#xff1a;編程基礎 計算機通識 模塊內容推薦掌…

從零實現一個紅隊智能體

從零實現一個紅隊智能體(持續更新) 2025-06-09 背景&#xff1a;最近學了基礎些東西和工具基礎使用&#xff0c;發現一套流程下來太多需要手工要做的&#xff0c;就像自己能不能結合自己的技術棧實現小工具 &#x1f947; 第一步&#xff1a;從實用性開始分析 目標場景 希望…