IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 框架实现分析 - 网络 - Java层 -> 正文阅读

[移动开发]Android 框架实现分析 - 网络 - Java层

core

????????源代码位置:frameworks/base/core/java/android/net。

????????CaptivePortalTracker是一个状态机,使用HTTP请求判断是否重定向,确定网络提供商是否有用户登陆页面。

????????CaptivePortalTracker状态:

状态

enter

processMessage

Default

? NoActiveNetwork

? ActiveNetwork

??? DelayedCaptiveCheck

????????NetworkStateTracker跟踪和控制一种类型网络的状态,通知状态变化。

????????BaseNetworkStateTracker继承并简单实现NetworkStateTracker。提供一些dispatch接口发送网络状态变化。

????????BaseNetworkStateTracker派生类

说明

DummyDataStateTracker

只记录控制状态,没有实际的网络连接。

EthernetDataTracker

监听NetworkManagementService网络变化,使用DHCP配置网络。

MobileDataStateTracker

监听TelephonyIntents广播,通过TelephonyManager监听移动网络信号强度,通过PhoneService控制移动网络开关。

WifiStateTracker

通过WifiManager监听Wifi状态,控制Wifi开关。

BluetoothTetheringDataTracker

通过AsyncChannel连接监听NetworkStateTracker事件,使用DHCP配置网络。

????????SamplingDataTracker

nsd

????????源代码位置:frameworks/base/core/java/android/net/nsd。

????????NsdServiceInfo描述MDNS域名信息。

????????NsdManager管理register、discover、resolve的Listener,将其映射为ID发送给DnsService(INsdManager),在ServiceHandler.handleMessage处理DnsService返回的消息,调用Listener相应的回调。消息处理运行在“NsdManager”内部线程。

????????App加载NsdManager:

framework/base/core/java/android/app/ContextImpl.java:

-------------------------------------------------------------------------

static {

??? // ……

??? registerService(NSD_SERVICE, new ServiceFetcher() {

??????????? @Override

??????????? public Object createService(ContextImpl ctx) {

??????????????? IBinder b = ServiceManager.getService(NSD_SERVICE);

??????????????? INsdManager service = INsdManager.Stub.asInterface(b);

??????????????? return new NsdManager(ctx.getOuterContext(), service);

??????????? }});

??? // ……

}

services

????????源代码位置:frameworks/base/services/java/com/android/server。

????????NativeDaemonConnector与netd的建立套接字连接,然后循环读取返回的报文,交给外部回调接口INativeDaemonConnectorCallbacks(Unsolicited事件,在系统前台线程FgThread调用回调)或者内部ResponseQueue(命令的应答)处理。

????????应答Code分类与HTTP相似,100-199有后续应答,200-299成功,等等。特别的600-699表示服务端主动发出的事件。

network_management

????????服务名:network_management。

????????NetworkManagementService实现INetworkManagementService接口。创建NativeDaemonConnector与netd的“netd”套接字连接,在其上注册NetdCallbackReceiver回调接口。创建线程执行NativeDaemonConnector::run方法。

????????NetdCallbackReceiver通过INetworkManagementEventObserver接口发送事件给外部。使用RemoteCallbackList协助管理回调接口对象。

????????ResponseQueue协助等待应答,使用ArrayBlockingQueue实现等待。允许应答在等待前到达,允许多个应答报文。

????????服务由SystemServer启动,运行在system_server进程中。

framework/base/services/java/com/android/server/SystemServer.java:

-------------------------------------------------------------------------

public void initAndLoop() {

??? // ……

??? if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {

??????? // ……

??????? if (!disableNetwork) {

???? ???????try {

??????????????? Slog.i(TAG, "NetworkManagement Service");

??????????????? networkManagement =

??????????????? ????NetworkManagementService.create(context);

??????????????? ServiceManager.addService(

??????????????? ????Context.NETWORKMANAGEMENT_SERVICE, networkManagement);

??????????? } catch (Throwable e) {

??????????????? reportWtf("starting NetworkManagement Service", e);

??????????? }

??????? }

??????? // ……

??? }

??? // ……

}

servicediscovery

????????服务名:servicediscovery。

????????NsdService实现INsdManager接口。创建NativeDaemonConnector与netd的“mdns”套接字连接,注册NativeCallbackReceiver回调接口。创建线程执行NativeDaemonConnector::run方法。

????????NativeCallbackReceiver将接收到的事件发送给状态机NsdStateMachine处理。事件包括应答,因为应答码都在600-699范围。

????????NsdService通过ClientInfo管理客户端连接,客户端请求的ID会映射到全局ID作为到netd的MDnsSdListener的请求ID。删除请求ID取消注册。

????????NsdStateMachine状态机的状态只有Default、Enabled、Disabled三个状态。Default是父状态,处理子状态未处理的事件。真正状态只有两个。

????????客户端连接有AsyncChannel、Messager实现,AsyncChannel与NsdStateMachine的Handler绑定,客户端发送的消息由NsdStateMachine处理。

????????服务由SystemServer启动,运行在system_server进程中。

framework/base/services/java/com/android/server/SystemServer.java:

-------------------------------------------------------------------------

public void initAndLoop() {

??? // ……

??? if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {

??????? // ……

??????? if (!disableNetwork) {

??????????? // ……

??????????? try {

?????????????? Slog.i(TAG, "Network Service Discovery Service");

?????????????? serviceDiscovery = NsdService.create(context);

?????????????? ServiceManager.addService(

?????????????????? Context.NSD_SERVICE, serviceDiscovery);

??????????? } catch (Throwable e) {

??????????????? reportWtf("starting Service Discovery Service", e);

??????????? }

??????? }

??????? // ……

??? }

??? // ……

}

netstats

????????服务名:netstats。

????????源代码位置:frameworks/base/services/java/com/android/server/net。

????????NetworkStatsCollection保存NetworkStatsHistory集合。

????????NetworkStatsRecorder收集NetworkStats到NetworkStatsHistory,使用FileRotator保存到文件。

????????NetworkStatsService收集详细网络状态、统计。

????????服务由SystemServer启动,运行在system_server进程中。

framework/base/services/java/com/android/server/SystemServer.java:

-------------------------------------------------------------------------

public void initAndLoop() {

??? // ……

?? ?if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {

??????? // ……

??????? if (!disableNetwork) {

??????????? try {

??????????????? Slog.i(TAG, "NetworkStats Service");

??????????????? networkStats = new NetworkStatsService(

??????????????? ????context, networkManagement, alarm);

??????????????? ServiceManager.addService(

??????????????? ????Context.NETWORK_STATS_SERVICE, networkStats);

??????????? } catch (Throwable e) {

??????????????? reportWtf("starting NetworkStats Service", e);

??????????? }

??????????? // ……

??????? }

??????? // ……

??? }

??? // ……

}

netpolicy

????????服务名:netpolicy。

????????源代码位置:frameworks/base/services/java/com/android/server/net。

????????服务由SystemServer启动,运行在system_server进程中。

framework/base/services/java/com/android/server/SystemServer.java:

-------------------------------------------------------------------------

public void initAndLoop() {

??? // ……

??? if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {

??????? // ……

??????? if (!disableNetwork) {

??????????? try {

??????????????? Slog.i(TAG, "NetworkPolicy Service");

??????????????? networkPolicy = new NetworkPolicyManagerService(

??????????????????????? context, ActivityManagerService.self(), power,

??????????????????????? networkStats, networkManagement);

??????????????? ServiceManager.addService(

??????????????????? Context.NETWORK_POLICY_SERVICE, networkPolicy);

??????????? } catch (Throwable e) {

??????????????? reportWtf("starting NetworkPolicy Service", e);

??????????? }

??????????? // ……

??????? }

??????? // ……

??? }

??? // ……

}

connectivity

????????服务名:connectivity。

????????服务由SystemServer启动,运行在system_server进程中。

????????ConnectivityService处理网络切换、路由、VPN、Tether(手机Modem)。

????????相关服务:

服务

说明

NetworkManagementService

1、监听网络事件

2、设置路由、域名服务器、MARK、防火墙、MTU

3、用于VPN(Nat464Xlat)、Tether

NetworkPolicyManagerService

TelephonyManager

获取SIM信息

PowerManager

PARTIAL_WAKE_LOCK

AlarmManager

定期EVENT_SAMPLE_INTERVAL_ELAPSED

PacService,ProxyService

PacManager

NotificationManager

????????监听事件源:

事件

说明

PolicyManager

onUidRulesChanged

onMeteredIfacesChanged

onRestrictBackgroundChanged

mPolicyListener

Intent

ACTION_USER_STARTING

ACTION_USER_STOPPING

mUserIntentReceiver

为用户启动停止VPN

NetworkManagement

interfaceClassDataActivityChanged

mDataActivityObserver

ACTION_DATA_ACTIVITY_CHANGE

Settings.Global

HTTP_PROXY

mSettingsObserver 处理,

EVENT_APPLY_GLOBAL_HTTP_PROXY

CONNECTED_TO_PROVISIONING_NETWORK_ACTION

mProvisioningReceiver

NetworkStateTracker

EVENT_STATE_CHANGED

EVENT_CONFIGURATION_CHANGED

EVENT_NETWORK_SUBTYPE_CHANGED

mTrackerHandler

事件

说明

TelephonyManager

LISTEN_

SERVICE_STATE

SIGNAL_STRENGTHS

DATA_CONNECTION_STATE

DATA_ACTIVITY

DataConnectionStats.mPhoneStateListener

framework/base/services/java/com/android/server/SystemServer.java:

-------------------------------------------------------------------------

public void initAndLoop() {

??? // ……

??? if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {

??????? // ……

??????? if (!disableNetwork) {

??????????? // ……

??????????? try {

??????????????? Slog.i(TAG, "Connectivity Service");

??????????????? connectivity = new ConnectivityService(

??????????????????????? context, networkManagement,

??????????????????????? networkStats, networkPolicy);

??????????????? ServiceManager.addService(

??????????????????????? Context.CONNECTIVITY_SERVICE, connectivity);

??????????????? networkStats.bindConnectivityManager(connectivity);

??????????????? networkPolicy.bindConnectivityManager(connectivity);

??????????????? wifiP2p.connectivityServiceReady();

??????????????? wifi.checkAndStartWifi();

??????????? } catch (Throwable e) {

??????????????? reportWtf("starting Connectivity Service", e);

??????????? }

??????????? // ……

??????? }

??????? // ……

??? }

??? // ……

}

ntp

????????NetworkTimeUpdateService。

????????NtpTrustedTime(core/util)。

????????SntpClient(core/net)。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-28 12:30:08  更:2021-10-28 12:32:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:54:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码