日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据连接相关类简介

發布時間:2024/1/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据连接相关类简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

ConnectivityManager 提供訪問ConnectivityService的接口,與ConnectivityService通過binder進行通信
ConnectivityService 管理NetworkAgent
NetworkFactory
NetworkAgent 用于DataConnection和ConnectivityService進行通信
NetworkAgentInfo
NetworkInfo
NetworkManagementService
NetworkCapabilities 用于描述一個網絡的能力,用來指定ConnectivityManager的需求以及檢查網絡。
NetworkRequest 定義一個網絡請求。
NetworkStatsService 統計網絡傳輸數據,供其他系統服務使用。
NetworkMonitor
?

TelephonyManager.java
路徑:frameworks/base/telephony/java/android/telephony/
功能:為App提供獲取Telephony信息的接口。App也可注冊監聽器來接收Telephony狀態的變化。
其中很多接口都是通過AIDL調用其他相關程序得到的,用到的AIDL接口及對應實現包括:
ITelecomService --> TelecomServiceImpl.mBinderImpl --> Telecomm Service
IPhoneSubInfo --> PhoneSubInfoController
ITelephony --> PhoneInterfaceManager --> Telephony Service
ITelephonyRegistry --> TelephonyRegistry

?

DcTracker

Platform:Android-7.1.1_r22

public class DcTracker extends Handler {

// 一直為false,DcController.DccDefaultState.onDataStateChanged()中會用到,
// onDataStateChanged()是監聽UNSOL_DATA_CALL_LIST_CHANGED的

public AtomicBoolean isCleanupRequired = new AtomicBoolean(false);

// 用于任務調度
private final AlarmManager mAlarmManager;

// 感覺沒啥用
/* Currently requested APN type (TODO: This should probably be a parameter not a member) */
private String mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT;

// 持有不同數據開/關的設置狀態
// All data enabling/disabling related settings
private final DataEnabledSettings mDataEnabledSettings = new DataEnabledSettings();

// 不能建立data的原因
public enum DataAllowFailReasonType {
NOT_ATTACHED(" - Not attached"),
RECORD_NOT_LOADED(" - SIM not loaded"),
ROAMING_DISABLED(" - Roaming and data roaming not enabled"),
INVALID_PHONE_STATE(" - PhoneState is not idle"),
CONCURRENT_VOICE_DATA_NOT_ALLOWED(" - Concurrent voice and data not allowed"),
PS_RESTRICTED(" - mIsPsRestricted= true"),
UNDESIRED_POWER_STATE(" - desiredPowerState= false"),
INTERNAL_DATA_DISABLED(" - mInternalDataEnabled= false"),
DEFAULT_DATA_UNSELECTED(" - defaultDataSelected= false"),
RADIO_DISABLED_BY_CARRIER(" - powerStateFromCarrier= false");
......
}

// 用于測試人員指定bingUp失敗的次數及原因。
/**
* A package level call that causes all DataConnection bringUp calls to fail a specific
* number of times. Here is an example that sets counter to 2 and cause to -3 for all instances:
* adb shell am broadcast -a com.android.internal.telephony.dataconnection.action_fail_bringup \
* --ei counter 2 --ei fail_cause -3
*
* Also you can add a suggested retry time if desired:
* --ei suggested_retry_time 5000
*
* The fail_cause is one of {@link DcFailCause}
*/

private DcTesterFailBringUpAll mDcTesterFailBringUpAll;

// 新建DataConnection對象時會作為參數傳入
private DcController mDcc;

// 按優先級排序的ApnContext隊列,會在DcTracker的構造函數中進行初始化。
// 初始值是從frameworks/base/core/res/res/values/config.xml中的networkAttributes讀取的,
// 一般情況下廠商會overlay。

/** kept in sync with mApnContexts
* Higher numbers are higher priority and sorted so highest priority is first */
private final PriorityQueue<ApnContext>mPrioritySortedApnContexts


// mAllApnSettings的內容是從telephony.db->carriers中讀取的。
// telephony.db->carriers則是用apns.xml和apns-conf.xml中的內容進行初始化,
// 祥見TelephonyProvider.DatabaseHelper.initDatabase()

/** allApns holds all apns */
private ArrayList<ApnSetting> mAllApnSettings = null;

// ????????
/** emergency apn Setting*/
private ApnSetting mEmergencyApn = null;

// 關于provision apn,在config.xml中的"mobile_provisioning_apn"進行了定義,但還是不知道是做啥的
// ????????
/* Set to true with CMD_ENABLE_MOBILE_PROVISIONING */
private boolean mIsProvisioning = false;

// ????????
/* The Url passed as object parameter in CMD_ENABLE_MOBILE_PROVISIONING */
private String mProvisioningUrl = null;

// ????????
/* The provision apn alarm intent used to disable the provisioning apn */
private PendingIntent mProvisioningApnAlarmIntent = null;

// ????????
/* Used to track stale provisioning apn alarms */
private int mProvisioningApnAlarmTag = (int) SystemClock.elapsedRealtime();

// ????????
private AsyncChannel mReplyAc = new AsyncChannel();

// 處理以下廣播:
// ACTION_SCREEN_ON
// ACTION_SCREEN_OFF
// INTENT_RECONNECT_ALARM
// INTENT_DATA_STALL_ALARM
// INTENT_PROVISIONING_APN_ALARM
// NETWORK_STATE_CHANGED_ACTION
// WIFI_STATE_CHANGED_ACTION

private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver () {

// 統計每個周期內上下行數據的任務,狀態欄上數據上下行圖標就是用的這個結果
private final Runnable mPollNetStat = new Runnable() {

// 監聽Subscription變化
private final OnSubscriptionsChangedListener mOnSubscriptionsChangedListener =

// 監聽以下設置的變化:
// DATA_ROAMING
// DEVICE_PROVISIONED
// DEVICE_PROVISIONING_MOBILE_DATA_ENABLED

private final SettingsObserver mSettingsObserver;

/**
* List of messages that are waiting to be posted, when data call disconnect
* is complete
*/
private ArrayList<Message> mDisconnectAllCompleteMsgList = new ArrayList<Message>();

// member variables
private final Phone mPhone;
private final UiccController mUiccController;
private final AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>();

// 以下幾個是數據上下行圖標相關的
private DctConstants.Activity mActivity = DctConstants.Activity.NONE;
private long mTxPkts;
private long mRxPkts;
private int mNetStatPollPeriod;
private boolean mNetStatPollEnabled = false;

// 以下幾個是檢測數據連接是否正常的
private TxRxSum mDataStallTxRxSum = new TxRxSum(0, 0);
// Used to track stale data stall alarms.
private int mDataStallAlarmTag = (int) SystemClock.elapsedRealtime();
// The current data stall alarm intent
private PendingIntent mDataStallAlarmIntent = null;
// Number of packets sent since the last received packet
private long mSentSinceLastRecv;
// Controls when a simple recovery attempt it to be tried
private int mNoRecvPollCount = 0;
// Reference counter for enabling fail fast
private static int sEnableFailFastRefCounter = 0;
// True if data stall detection is enabled
private volatile boolean mDataStallDetectionEnabled = true;

// Data retry時,如果此屬性為true,就會使用一個較短的間隔時間
private volatile boolean mFailFast = false;

// True when in voice call
private boolean mInVoiceCall = false;

// wifi connection status will be updated by sticky intent
private boolean mIsWifiConnected = false;

// 感覺沒啥用
// When false we will not auto attach and manually attaching is required.
private boolean mAutoAttachOnCreationConfig = false;
private AtomicBoolean mAutoAttachOnCreation = new AtomicBoolean(false);

// MVNO是虛擬運營商
// Indicates if we found mvno-specific APNs in the full APN list.
// used to determine if we can accept mno-specific APN for tethering.
private boolean mMvnoMatched = false;

// 每個DataConnection對象對應的唯一的Id號
/** Allows the generation of unique Id's for DataConnection objects */
private AtomicInteger mUniqueIdGenerator = new AtomicInteger(0);

// 跟mPrioritySortedApnContexts差不多,保存各種類型的ApnContext
/** Phone.APN_TYPE_* ===> ApnContext */
private final ConcurrentHashMap<String, ApnContext> mApnContexts =
new ConcurrentHashMap<String, ApnContext>();

// 跟mApnContexts差不多,只是key變成了整數
private final SparseArray<ApnContext> mApnContextsById = new SparseArray<ApnContext>();

// 感覺沒啥用
private boolean mReregisterOnReconnectFailure = false;

// 只要讀取preferedApn返回的Cursor對象不為null,則置為true,即使Cursor中啥都沒有。
// 所以這個值一般都為true。

private boolean mCanSetPreferApn = false;

// 是否注上PS
private AtomicBoolean mAttached = new AtomicBoolean(false);

// 監控Telephony.db->carriers的變化
/** Watches for changes to the APN db. */
private ApnChangeObserver mApnObserver;

// ?????
private final String mProvisionActionName;
private BroadcastReceiver mProvisionBroadcastReceiver;
private ProgressDialog mProvisioningSpinner;

// 似乎沒地方用啊!
public boolean mImsRegistrationState = false;


}

?

ApnContext

Platform:Android-7.1.1_r22
APN上下文,維護著apn的狀態、設置等。
每個類型的apn對應一個ApnContext。

// 來自ActivePhoneSwitch/DEFAULT_SUBSCRIPTION_CHANGED等的網絡請求
private final ArrayList<NetworkRequest> mNetworkRequests = new ArrayList<>();

// 會從frameworks/base/core/res/res/values/config.xml讀取config_cell_retries_per_error_code來初始化,
// 這個值應該會被overlay,這是一個Map列表,其中每一個Map的Key為建立Data時返回的錯誤類型,
// Value為重試次數,若重試Value次后還是不能成功建立Data連接,則在其它條件滿足時就會重啟modem。

private final SparseIntArray mRetriesLeftPerErrorCode = new SparseIntArray();

private final RetryManager mRetryManager;

?

DataConnection

Platform:Android-7.1.1_r22

是一個狀態機。
一個DataConnection維護一個數據連接。




public class DataConnection extends StateMachine {

// 從DcTracker傳過來的
// The data connection controller
private DcController mDcController;

// 從DcTracker傳過來的
// The Tester for failing all bringup's
private DcTesterFailBringUpAll mDcTesterFailBringUpAll;

// DataConnection實例的數量
private static AtomicInteger mInstanceNumber = new AtomicInteger(0);

// 用于和其它Handler進行通信
private AsyncChannel mAc;

// 新建對象時傳進來的DcTracker對象
// The DCT that's talking to us, we only support one!
private DcTracker mDct = null;

// Data建立成功后用來保存P-CSCF地址
protected String[] mPcscfAddr;

// 當前連接的apn設置
private ApnSetting mApnSetting;

// 連接參數
private ConnectionParams mConnectionParams;

//斷開參數
private DisconnectParams mDisconnectParams;

// 建立連接失敗的原因(SETUP_DATA_CALL返回錯誤)
private DcFailCause mDcFailCause;

// 描述數據連接的連接屬性
private LinkProperties mLinkProperties = new LinkProperties();

// 數據連接建立成功的時間點
private long mCreateTime;

// 上次數據連接建立失敗的時間點
private long mLastFailTime;

// 上次數據連接建立失敗的原因(尚未發起SETUP_DATA_CALL)
private DcFailCause mLastFailCause;

// 沒有用
private Object mUserData;

// 保存Data的RAT
private int mRilRat = Integer.MAX_VALUE;

// Data的注冊狀態
private int mDataRegState = Integer.MAX_VALUE;

// 描述網絡接口的狀態
private NetworkInfo mNetworkInfo;

// 一個工具類,用來和Connectivity通信的
private NetworkAgent mNetworkAgent;

// 沒大明白做啥的,應該是充當一個標識作用之類的吧
int mTag;

// 連接的id號,從modem傳上來的
public int mCid;

// 存儲連接的ApnContext與ConnectionParams的映射
public HashMap<ApnContext, ConnectionParams> mApnContexts = null;

// 沒有用
PendingIntent mReconnectIntent = null;

// 沒搞懂
/**
* Indicates if when this connection was established we had a restricted/privileged
* NetworkRequest and needed it to overcome data-enabled limitations.
*
* This gets set once per connection setup and is based on conditions at that time.
* We could theoretically have dynamic capabilities but now is not a good time to
* experiement with that.
*
* This flag overrides the APN-based restriction capability, restricting the network
* based on both having a NetworkRequest with restricted AND needing a restricted
* bit to overcome user-disabled status. This allows us to handle the common case
* of having both restricted requests and unrestricted requests for the same apn:
* if conditions require a restricted network to overcome user-disabled then it must
* be restricted, otherwise it is unrestricted (or restricted based on APN type).
*
* Because we're not supporting dynamic capabilities, if conditions change and we go from
* data-enabled to not or vice-versa we will need to tear down networks to deal with it
* at connection setup time with the new state.
*
* This supports a privileged app bringing up a network without general apps having access
* to it when the network is otherwise unavailable (hipri). The first use case is
* pre-paid SIM reprovisioning over internet, where the carrier insists on no traffic
* other than from the privileged carrier-app.
*/
private boolean mRestrictedNetworkOverride = false;

// 數據連接的六種狀態
private DcDefaultState mDefaultState = new DcDefaultState();
private DcInactiveState mInactiveState = new DcInactiveState();
private DcActivatingState mActivatingState = new DcActivatingState();
private DcActiveState mActiveState = new DcActiveState();
private DcDisconnectingState mDisconnectingState = new DcDisconnectingState();
private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection =

}

?

DcController

Platform:Android-7.1.1_r22

/**
* Data Connection Controller which is a package visible class and controls
* multiple data connections. For instance listening for unsolicited messages
* and then demultiplexing them to the appropriate DC.
*/
public class DcController extends StateMachine {

?

RetryManager

Platform:Android-7.1.1_r22

RetryManager管理著重試次數、重試間隔時間等配置。

RetryManager對象的建立是在ApnContext的構造函數的完成的。
public ApnContext(Phone phone, String apnType, String logTag, NetworkConfig config,
DcTracker tracker) {
......
mRetryManager = new RetryManager(phone, apnType);
}

而Retry所需要使用的apn及間隔時間是在DcTracker中通過trySetupData() -> ApnContext.setWaitingApns() -> RetryManager.setWaitingApns()進行設置的,且只有當ApnContext為IDLE時才會設置。
DcTracker.java
private boolean trySetupData(ApnContext apnContext, ArrayList<ApnSetting> waitingApns) {
......
if (apnContext.getState() == DctConstants.State.IDLE) {
if (waitingApns == null) {
waitingApns = buildWaitingApns(apnContext.getApnType(), radioTech);
}
if (waitingApns.isEmpty()) {
......
return false;
} else {
apnContext.setWaitingApns(waitingApns);
if (DBG) {
log ("trySetupData: Create from mAllApnSettings : "
+ apnListToString(mAllApnSettings));
}
}
}
......
}

RetryManager.java
public void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
......
mWaitingApns = waitingApns; // 保存WaitingApns,通常情況下只有一個apn

// Since we replace the entire waiting APN list, we need to re-config this retry manager.
configureRetry(); // 配置Retry的間隔時間

for (ApnSetting apn : mWaitingApns) {
apn.permanentFailed = false;
}
}

配置重試次數、重試間隔時間。
private void configureRetry() {
......
// 初始化一個WaitingApns周期內的重試間隔時間(針對WaitingApns中有多個apn的情況)
mInterApnDelay = b.getLong(
CarrierConfigManager.KEY_CARRIER_DATA_CALL_APN_DELAY_DEFAULT_LONG,
DEFAULT_INTER_APN_DELAY);
// 初始化FailFast模式下的重試間隔時間
mFailFastInterApnDelay = b.getLong(
CarrierConfigManager.KEY_CARRIER_DATA_CALL_APN_DELAY_FASTER_LONG,
DEFAULT_INTER_APN_DELAY_FOR_PROVISIONING);

// 初始化通常情況下不同APN的重試間隔時間及次數;
// 若當前APN的配置不為空,則使用當前APN的配置;
// 若當前APN的配置為空且其他APN的配置不為空,則使用其他APN的配置;
// 若當前APN和其他APN的配置都為空,則使用默認配置

// Load all retry patterns for all different APNs.
String[] allConfigStrings = b.getStringArray(
CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS);
......
// 解析配置
configure(configString);
}

這里我們就不分析configure()的代碼了,直接用CarrierConfigManager中的默認配置來說明。

sDefaults.putStringArray(KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{
"default:default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000,"
+ "320000:5000,640000:5000,1280000:5000,1800000:5000",
"mms:default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000,"
+ "320000:5000,640000:5000,1280000:5000,1800000:5000",
"others:max_retries=3, 5000, 5000, 5000"});

這個配置包含了3個字符串,分別對default_apn、mms_apn及其它apn進行配置。
每個配置的格式可表示為:
apn_type:[default_randomization=2000 | max_retries=3], 5000,10000,20000,40000,80000:5000,160000:5000

apn_type表示apn的類型;
default_randomization表示默認隨機值邊界;
max_retries表示最大重試次數,"infinite"表示無限次;
如果配置的最大重試次數小于實際配置的次數,則取實際配置的次數;
例如下面這種,雖然配置的最大重試次數為3,但后面配置了4個重試值,則實際的重試次數為4;
"others:max_retries=3, 5000, 5000, 5000, 5000"
如果配置的最大重試次數大于實際配置的次數,則后面幾次未配置的值則使用最后一個配置值;
例如下面這種,配置的重試次數為5次,但只配置了3個值,則第4次和第5次就使用最后一個配置值,即3s;
"others:max_retries=5, 1000, 2000, 3000"
80000:5000表示間隔時間為80s,隨機值邊界為5s。

配置中的隨機值,是用來加在配置的間隔時間上的,例如配置的間隔時間為"80000:5000",那么實際上的間隔時間則為80s再加上一個0~5s之間的隨機值。之所以加上一個隨機值,是為了防止基站周圍的大量設備在同一時間發起重試請求。

ConnectivityManager
Platform:Android-7.1.1_r22

ConnectivityManager提供訪問ConnectivityService的接口,與ConnectivityService通過binder進行通信

主要作用:
1.監視網絡連接(WiFi、GPRS、UMTS等)
2.當網絡連接變化時發送廣播
3.當一個連接斷開時切換到另一個連接
4.為App提供查詢可用網絡的粗略/詳細狀態的接口
5.為App提供請求及選擇一個網絡來進行數據傳輸的接口



/**
* Class that answers queries about the state of network connectivity. It also
* notifies applications when network connectivity changes. Get an instance
* of this class by calling
* {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.CONNECTIVITY_SERVICE)}.
* <p>
* The primary responsibilities of this class are to:
* <ol>
* <li>Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)</li>
* <li>Send broadcast intents when network connectivity changes</li>
* <li>Attempt to "fail over" to another network when connectivity to a network
* is lost</li>
* <li>Provide an API that allows applications to query the coarse-grained or fine-grained
* state of the available networks</li>
* <li>Provide an API that allows applications to request and select networks for their data
* traffic</li>
* </ol>
*/
?

ConnectivityService

Platform:Android-7.1.1_r22


由Zygote創建的SystemServer啟動的。
SystemServer.startOtherServices() {
......
connectivity = new ConnectivityService(
context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connectivity);
......
}

啟動ConnectivityService時會創建2個NetworkRequest對象
mDefaultRequest
類型為REQUEST,transport為空,創建好后馬上加入到mNetworkRequests。
mDefaultMobileDataRequest
BACKGROUND_REQUEST,transport為CELLULAR,創建好后先不會加入到mNetworkRequests,
handleRegisterNetworkRequest()中加入到mNetworkRequests,
handleReleaseNetworkRequest()中再從mNetworkRequests移除。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

屬性值:

protected int mLingerDelayMs;


// How long to delay to removal of a pending intent based request.
// See Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS
private final int mReleasePendingIntentDelayMs;

private Tethering mTethering;

private final PermissionMonitor mPermissionMonitor;

private KeyStore mKeyStore;

@GuardedBy("mVpns")
private final SparseArray<Vpn> mVpns = new SparseArray<Vpn>();

private boolean mLockdownEnabled;
private LockdownVpnTracker mLockdownTracker;

/** Lock around {@link #mUidRules} and {@link #mMeteredIfaces}. */
private Object mRulesLock = new Object();
/** Currently active network rules by UID. */
@GuardedBy("mRulesLock")
private SparseIntArray mUidRules = new SparseIntArray();
/** Set of ifaces that are costly. */
@GuardedBy("mRulesLock")
private ArraySet<String> mMeteredIfaces = new ArraySet<>();
/** Flag indicating if background data is restricted. */
@GuardedBy("mRulesLock")
private boolean mRestrictBackground;

final private Context mContext;
private int mNetworkPreference;
// 0 is full bad, 100 is full good
private int mDefaultInetConditionPublished = 0;

private int mNumDnsEntries;

private boolean mTestMode;
private static ConnectivityService sServiceInstance;

private INetworkManagementService mNetd;
private INetworkStatsService mStatsService;
private INetworkPolicyManager mPolicyManager;

private String mCurrentTcpBufferSizes;

private static final SparseArray<String> sMagicDecoderRing


/**
* used internally to change our mobile data enabled flag
*/
private static final int EVENT_CHANGE_MOBILE_DATA_ENABLED = 2;

/**
* used internally to clear a wakelock when transitioning
* from one net to another. Clear happens when we get a new
* network - EVENT_EXPIRE_NET_TRANSITION_WAKELOCK happens
* after a timeout if no network is found (typically 1 min).
*/
private static final int EVENT_CLEAR_NET_TRANSITION_WAKELOCK = 8;

/**
* used internally to reload global proxy settings
*/
private static final int EVENT_APPLY_GLOBAL_HTTP_PROXY = 9;

/**
* PAC manager has received new port.
*/
private static final int EVENT_PROXY_HAS_CHANGED = 16;

/**
* used internally when registering NetworkFactories
* obj = NetworkFactoryInfo
*/
private static final int EVENT_REGISTER_NETWORK_FACTORY = 17;

/**
* used internally when registering NetworkAgents
* obj = Messenger
*/
private static final int EVENT_REGISTER_NETWORK_AGENT = 18;

/**
* used to add a network request
* includes a NetworkRequestInfo
*/
private static final int EVENT_REGISTER_NETWORK_REQUEST = 19;

/**
* indicates a timeout period is over - check if we had a network yet or not
* and if not, call the timeout callback (but leave the request live until they
* cancel it.
* includes a NetworkRequestInfo
*/
private static final int EVENT_TIMEOUT_NETWORK_REQUEST = 20;

/**
* used to add a network listener - no request
* includes a NetworkRequestInfo
*/
private static final int EVENT_REGISTER_NETWORK_LISTENER = 21;

/**
* used to remove a network request, either a listener or a real request
* arg1 = UID of caller
* obj = NetworkRequest
*/
private static final int EVENT_RELEASE_NETWORK_REQUEST = 22;

/**
* used internally when registering NetworkFactories
* obj = Messenger
*/
private static final int EVENT_UNREGISTER_NETWORK_FACTORY = 23;

/**
* used internally to expire a wakelock when transitioning
* from one net to another. Expire happens when we fail to find
* a new network (typically after 1 minute) -
* EVENT_CLEAR_NET_TRANSITION_WAKELOCK happens if we had found
* a replacement network.
*/
private static final int EVENT_EXPIRE_NET_TRANSITION_WAKELOCK = 24;

/**
* Used internally to indicate the system is ready.
*/
private static final int EVENT_SYSTEM_READY = 25;

/**
* used to add a network request with a pending intent
* obj = NetworkRequestInfo
*/
private static final int EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT = 26;

/**
* used to remove a pending intent and its associated network request.
* arg1 = UID of caller
* obj = PendingIntent
*/
private static final int EVENT_RELEASE_NETWORK_REQUEST_WITH_INTENT = 27;

/**
* used to specify whether a network should be used even if unvalidated.
* arg1 = whether to accept the network if it's unvalidated (1 or 0)
* arg2 = whether to remember this choice in the future (1 or 0)
* obj = network
*/
private static final int EVENT_SET_ACCEPT_UNVALIDATED = 28;

/**
* used to specify whether a network should not be penalized when it becomes unvalidated.
*/
private static final int EVENT_SET_AVOID_UNVALIDATED = 35;

/**
* used to ask the user to confirm a connection to an unvalidated network.
* obj = network
*/
private static final int EVENT_PROMPT_UNVALIDATED = 29;

/**
* used internally to (re)configure mobile data always-on settings.
*/
private static final int EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON = 30;

/**
* used to add a network listener with a pending intent
* obj = NetworkRequestInfo
*/
private static final int EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT = 31;

/**
* Indicates a caller has requested to have its callback invoked with
* the latest LinkProperties or NetworkCapabilities.
*
* arg1 = UID of caller
* obj = NetworkRequest
*/
private static final int EVENT_REQUEST_LINKPROPERTIES = 32;
private static final int EVENT_REQUEST_NETCAPABILITIES = 33;

/** Handler thread used for both of the handlers below. */
@VisibleForTesting
protected final HandlerThread mHandlerThread;
/** Handler used for internal events. */
final private InternalHandler mHandler;
/** Handler used for incoming {@link NetworkStateTracker} events. */
final private NetworkStateTrackerHandler mTrackerHandler;

private boolean mSystemReady;
private Intent mInitialBroadcast;

private PowerManager.WakeLock mNetTransitionWakeLock;
private String mNetTransitionWakeLockCausedBy = "";
private int mNetTransitionWakeLockSerialNumber;
private int mNetTransitionWakeLockTimeout;
private final PowerManager.WakeLock mPendingIntentWakeLock;

// used in DBG mode to track inet condition reports
private static final int INET_CONDITION_LOG_MAX_SIZE = 15;
private ArrayList mInetLog;

// track the current default http proxy - tell the world if we get a new one (real change)
private volatile ProxyInfo mDefaultProxy = null;
private Object mProxyLock = new Object();
private boolean mDefaultProxyDisabled = false;

// track the global proxy.
private ProxyInfo mGlobalProxy = null;

private PacManager mPacManager = null;

final private SettingsObserver mSettingsObserver;

private UserManager mUserManager;

NetworkConfig[] mNetConfigs;
int mNetworksDefined;

// the set of network types that can only be enabled by system/sig apps
List mProtectedNetworks;

private DataConnectionStats mDataConnectionStats;

TelephonyManager mTelephonyManager;

private KeepaliveTracker mKeepaliveTracker;
private NetworkNotificationManager mNotifier;
private LingerMonitor mLingerMonitor;

// sequence number for Networks; keep in sync with system/netd/NetworkController.cpp
private final static int MIN_NET_ID = 100; // some reserved marks
private final static int MAX_NET_ID = 65535;
private int mNextNetId = MIN_NET_ID;

// sequence number of NetworkRequests
private int mNextNetworkRequestId = 1;

private final IpConnectivityLog mMetricsLog;

@VisibleForTesting
final AvoidBadWifiTracker mAvoidBadWifiTracker;


private INetworkManagementEventObserver mDataActivityObserver

private INetworkPolicyListener mPolicyListener

private final HashMap<Messenger, NetworkFactoryInfo> mNetworkFactoryInfos =

private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests =

private static final int MAX_NETWORK_REQUESTS_PER_UID = 100;
// Map from UID to number of NetworkRequests that UID has filed.
@GuardedBy("mUidToNetworkRequestCount")
private final SparseIntArray mUidToNetworkRequestCount = new SparseIntArray();

private final SparseArray<NetworkAgentInfo> mNetworkForRequestId =

private final SparseArray<NetworkAgentInfo> mNetworkForNetId =

private final SparseBooleanArray mNetIdInUse = new SparseBooleanArray();

private final HashMap<Messenger, NetworkAgentInfo> mNetworkAgentInfos =

private final HashSet<Integer> mBlockedAppUids = new HashSet();

// Note: if mDefaultRequest is changed, NetworkMonitor needs to be updated.
private final NetworkRequest mDefaultRequest;

// Request used to optionally keep mobile data active even when higher
// priority networks like Wi-Fi are active.
private final NetworkRequest mDefaultMobileDataRequest;




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

構造方法:

protected ConnectivityService(Context context, INetworkManagementService netManager,
INetworkStatsService statsService, INetworkPolicyManager policyManager,
IpConnectivityLog logger) {
if (DBG) log("ConnectivityService starting up");

mMetricsLog = logger;
mDefaultRequest = createInternetRequestForTransport(-1, NetworkRequest.Type.REQUEST);
NetworkRequestInfo defaultNRI = new NetworkRequestInfo(null, mDefaultRequest, new Binder());
mNetworkRequests.put(mDefaultRequest, defaultNRI);
mNetworkRequestInfoLogs.log("REGISTER " + defaultNRI);

mDefaultMobileDataRequest = createInternetRequestForTransport(
NetworkCapabilities.TRANSPORT_CELLULAR, NetworkRequest.Type.BACKGROUND_REQUEST);

mHandlerThread = createHandlerThread();
mHandlerThread.start();
mHandler = new InternalHandler(mHandlerThread.getLooper());
mTrackerHandler = new NetworkStateTrackerHandler(mHandlerThread.getLooper());

// setup our unique device name
if (TextUtils.isEmpty(SystemProperties.get("net.hostname"))) {
String id = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.ANDROID_ID);
if (id != null && id.length() > 0) {
String name = new String("android-").concat(id);
SystemProperties.set("net.hostname", name);
}
}

mReleasePendingIntentDelayMs = Settings.Secure.getInt(context.getContentResolver(),
Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS, 5_000);

mLingerDelayMs = SystemProperties.getInt(LINGER_DELAY_PROPERTY, DEFAULT_LINGER_DELAY_MS);

mContext = checkNotNull(context, "missing Context");
mNetd = checkNotNull(netManager, "missing INetworkManagementService");
mStatsService = checkNotNull(statsService, "missing INetworkStatsService");
mPolicyManager = checkNotNull(policyManager, "missing INetworkPolicyManager");
mKeyStore = KeyStore.getInstance();
mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);

try {
mPolicyManager.setConnectivityListener(mPolicyListener);
mRestrictBackground = mPolicyManager.getRestrictBackground();
} catch (RemoteException e) {
// ouch, no rules updates means some processes may never get network
loge("unable to register INetworkPolicyListener" + e);
}

final PowerManager powerManager = (PowerManager) context.getSystemService(
Context.POWER_SERVICE);
mNetTransitionWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mNetTransitionWakeLockTimeout = mContext.getResources().getInteger(
com.android.internal.R.integer.config_networkTransitionTimeout);
mPendingIntentWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);

mNetConfigs = new NetworkConfig[ConnectivityManager.MAX_NETWORK_TYPE+1];

// TODO: What is the "correct" way to do determine if this is a wifi only device?
boolean wifiOnly = SystemProperties.getBoolean("ro.radio.noril", false);
log("wifiOnly=" + wifiOnly);
String[] naStrings = context.getResources().getStringArray(
com.android.internal.R.array.networkAttributes);
for (String naString : naStrings) {
try {
NetworkConfig n = new NetworkConfig(naString);
if (VDBG) log("naString=" + naString + " config=" + n);
if (n.type > ConnectivityManager.MAX_NETWORK_TYPE) {
loge("Error in networkAttributes - ignoring attempt to define type " +
n.type);
continue;
}
if (wifiOnly && ConnectivityManager.isNetworkTypeMobile(n.type)) {
log("networkAttributes - ignoring mobile as this dev is wifiOnly " +
n.type);
continue;
}
if (mNetConfigs[n.type] != null) {
loge("Error in networkAttributes - ignoring attempt to redefine type " +
n.type);
continue;
}
mLegacyTypeTracker.addSupportedType(n.type);

mNetConfigs[n.type] = n;
mNetworksDefined++;
} catch(Exception e) {
// ignore it - leave the entry null
}
}

// Forcibly add TYPE_VPN as a supported type, if it has not already been added via config.
if (mNetConfigs[TYPE_VPN] == null) {
// mNetConfigs is used only for "restore time", which isn't applicable to VPNs, so we
// don't need to add TYPE_VPN to mNetConfigs.
mLegacyTypeTracker.addSupportedType(TYPE_VPN);
mNetworksDefined++; // used only in the log() statement below.
}

if (VDBG) log("mNetworksDefined=" + mNetworksDefined);

mProtectedNetworks = new ArrayList<Integer>();
int[] protectedNetworks = context.getResources().getIntArray(
com.android.internal.R.array.config_protectedNetworks);
for (int p : protectedNetworks) {
if ((mNetConfigs[p] != null) && (mProtectedNetworks.contains(p) == false)) {
mProtectedNetworks.add(p);
} else {
if (DBG) loge("Ignoring protectedNetwork " + p);
}
}

mTestMode = SystemProperties.get("cm.test.mode").equals("true")
&& SystemProperties.get("ro.build.type").equals("eng");

mTethering = new Tethering(mContext, mNetd, statsService, mPolicyManager);

mPermissionMonitor = new PermissionMonitor(mContext, mNetd);

//set up the listener for user state for creating user VPNs
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_USER_STARTED);
intentFilter.addAction(Intent.ACTION_USER_STOPPED);
intentFilter.addAction(Intent.ACTION_USER_ADDED);
intentFilter.addAction(Intent.ACTION_USER_REMOVED);
intentFilter.addAction(Intent.ACTION_USER_UNLOCKED);
mContext.registerReceiverAsUser(
mUserIntentReceiver, UserHandle.ALL, intentFilter, null, null);

try {
mNetd.registerObserver(mTethering);
mNetd.registerObserver(mDataActivityObserver);
} catch (RemoteException e) {
loge("Error registering observer :" + e);
}

if (DBG) {
mInetLog = new ArrayList();
}

mSettingsObserver = new SettingsObserver(mContext, mHandler);
registerSettingsCallbacks();

mDataConnectionStats = new DataConnectionStats(mContext);
mDataConnectionStats.startMonitoring();

mPacManager = new PacManager(mContext, mHandler, EVENT_PROXY_HAS_CHANGED);

mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);

mKeepaliveTracker = new KeepaliveTracker(mHandler);
mNotifier = new NetworkNotificationManager(mContext, mTelephonyManager,
mContext.getSystemService(NotificationManager.class));

final int dailyLimit = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.NETWORK_SWITCH_NOTIFICATION_DAILY_LIMIT,
LingerMonitor.DEFAULT_NOTIFICATION_DAILY_LIMIT);
final long rateLimit = Settings.Global.getLong(mContext.getContentResolver(),
Settings.Global.NETWORK_SWITCH_NOTIFICATION_RATE_LIMIT_MILLIS,
LingerMonitor.DEFAULT_NOTIFICATION_RATE_LIMIT_MILLIS);
mLingerMonitor = new LingerMonitor(mContext, mNotifier, dailyLimit, rateLimit);

mAvoidBadWifiTracker = createAvoidBadWifiTracker(
mContext, mHandler, () -> rematchForAvoidBadWifiUpdate());
}


frameworks/base/core/res/res/values/config.xml
<string-array translatable="false" name="networkAttributes">
name type radio priority restoreTime dependencyMet
<item>"wifi, 1, 1, 1, -1, true"</item>
<item>"mobile, 0, 0, 0, -1, true"</item>
<item>"mobile_mms, 2, 0, 4, 60000, true"</item>
<item>"mobile_supl, 3, 0, 2, 60000, true"</item>
<item>"mobile_dun, 4, 0, 2, 60000, true"</item>
<item>"mobile_hipri, 5, 0, 3, 60000, true"</item>
<item>"mobile_fota, 10, 0, 2, 60000, true"</item>
<item>"mobile_ims, 11, 0, 2, 60000, true"</item>
<item>"mobile_cbs, 12, 0, 2, 60000, true"</item>
<item>"bluetooth, 7, 7, 2, -1, true"</item>
<item>"mobile_emergency, 15, 0, 5, -1, true"</item>
</string-array>


NetworkAgent
用于特定承載代碼和ConnectivityService通信的工具類。
如:DataConnection.java、Vpn.java、WifiStateMachine.java等與ConnectivityService通信


NetworkCapabilities
用于描述一個網絡的能力,用來指定ConnectivityManager的需求以及檢查網絡。

/**
* This class represents the capabilities of a network. This is used both to specify
* needs to {@link ConnectivityManager} and when inspecting a network.
*
* Note that this replaces the old {@link ConnectivityManager#TYPE_MOBILE} method
* of network selection. Rather than indicate a need for Wi-Fi because an application
* needs high bandwidth and risk obsolescence when a new, fast network appears (like LTE),
* the application should specify it needs high bandwidth. Similarly if an application
* needs an unmetered network for a bulk transfer it can specify that rather than assuming
* all cellular based connections are metered and all Wi-Fi based connections are not.
*/


NetworkRequest

Platform:Android-7.1.1_r22


定義一個網絡請求。
通過ConnectivityManager#requestNetwork請求一個網絡;
通過ConnectivityManager#registerNetworkCallback監聽網絡變化。


/**
* Defines a request for a network, made through {@link NetworkRequest.Builder} and used
* to request a network via {@link ConnectivityManager#requestNetwork} or listen for changes
* via {@link ConnectivityManager#registerNetworkCallback}.
*/
public class NetworkRequest implements Parcelable {

public final NetworkCapabilities networkCapabilities;

// 請求id,ConnectivityService.mNextNetworkRequestId維護
/**
* Identifies the request. NetworkRequests should only be constructed by
* the Framework and given out to applications as tokens to be used to identify
* the request.
* @hide
*/
public final int requestId;

/**
* Set for legacy requests and the default. Set to TYPE_NONE for none.
* Causes CONNECTIVITY_ACTION broadcasts to be sent.
* @hide
*/
public final int legacyType;

/**
* A NetworkRequest as used by the system can be one of the following types:
*
* - LISTEN, for which the framework will issue callbacks about any
* and all networks that match the specified NetworkCapabilities,
*
* - REQUEST, capable of causing a specific network to be created
* first (e.g. a telephony DUN request), the framework will issue
* callbacks about the single, highest scoring current network
* (if any) that matches the specified NetworkCapabilities, or
*
* - TRACK_DEFAULT, a hybrid of the two designed such that the
* framework will issue callbacks for the single, highest scoring
* current network (if any) that matches the capabilities of the
* default Internet request (mDefaultRequest), but which cannot cause
* the framework to either create or retain the existence of any
* specific network. Note that from the point of view of the request
* matching code, TRACK_DEFAULT is identical to REQUEST: its special
* behaviour is not due to different semantics, but to the fact that
* the system will only ever create a TRACK_DEFAULT with capabilities
* that are identical to the default request's capabilities, thus
* causing it to share fate in every way with the default request.
*
* - BACKGROUND_REQUEST, like REQUEST but does not cause any networks
* to retain the NET_CAPABILITY_FOREGROUND capability. A network with
* no foreground requests is in the background. A network that has
* one or more background requests and loses its last foreground
* request to a higher-scoring network will not go into the
* background immediately, but will linger and go into the background
* after the linger timeout.
*
* - The value NONE is used only by applications. When an application
* creates a NetworkRequest, it does not have a type; the type is set
* by the system depending on the method used to file the request
* (requestNetwork, registerNetworkCallback, etc.).
*
* @hide
*/
public static enum Type {
NONE,
LISTEN,
TRACK_DEFAULT,
REQUEST,
BACKGROUND_REQUEST,
};

/**
* The type of the request. This is only used by the system and is always NONE elsewhere.
*
* @hide
*/
public final Type type;
?

NetworkStatsService

Platform:Android-7.1.1_r22

統計網絡傳輸數據,供其他系統服務使用。


/**
* Collect and persist detailed network statistics, and provide this data to
* other system services.
*/

?

?

?

?

轉載于:https://my.oschina.net/igiantpanda/blog/2222667

總結

以上是生活随笔為你收集整理的数据连接相关类简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日韩av资源在线观看 | 国产日本亚洲高清 | 中文资源在线官网 | 亚州精品在线视频 | aaawww| 中文字幕免费播放 | 久久国产免费看 | 国内精品久久久久久 | 中文一区在线观看 | 水蜜桃亚洲一二三四在线 | 国产精品一区二区av日韩在线 | 国产婷婷久久 | 在线国产小视频 | 国产一在线精品一区在线观看 | 国产精品亚州 | 国产一级片毛片 | 国产你懂的在线 | 69av视频在线观看 | 奇米先锋| 久青草视频 | 91免费高清观看 | 久久久久久久久久久国产精品 | 久久国产精品久久w女人spa | 婷婷亚洲综合 | 在线国产日本 | 成人黄色电影在线播放 | 精品亚洲一区二区三区 | 亚洲jizzjizz日本少妇 | 天天干天天干天天干天天干天天干天天干 | 国产一区二区在线视频观看 | 香蕉视频免费看 | 精品久久一区二区三区 | 亚洲一级电影视频 | 超级碰碰免费视频 | 午夜美女视频 | av片子在线观看 | 99re在线视频观看 | 日韩欧美在线视频一区二区三区 | 国产精品一区在线 | 国产精品久久久久久超碰 | 国产成人一区二区三区免费看 | 中文字幕在线观看视频一区二区三区 | 欧洲精品码一区二区三区免费看 | 免费观看xxxx9999片 | 亚洲免费av网站 | 911在线| 日韩在线中文字幕视频 | a√天堂中文在线 | 国产91对白在线播 | 麻豆视频成人 | 天天操天天射天天插 | 久久精品视频在线 | 婷婷深爱 | 丁香婷婷激情五月 | 一区二区电影在线观看 | 中文字幕免费看 | 激情久久伊人 | 夜夜操天天操 | 91麻豆国产福利在线观看 | 久久99久| 麻花豆传媒mv在线观看网站 | 亚洲电影av在线 | 欧美一级大片在线观看 | www.夜夜操 | 五月天六月婷婷 | 国产精品对白一区二区三区 | av福利在线导航 | 精品国产理论 | 国产理论影院 | 国产日韩欧美在线看 | 中文字幕一区二区三区四区久久 | 日韩精品不卡在线观看 | 在线观看视频国产一区 | 91精品国产自产在线观看永久 | 97视频久久久 | 99久久超碰中文字幕伊人 | 国产精品视频永久免费播放 | 午夜国产福利视频 | 国产成人一区二区三区 | 久久久久久久国产精品影院 | 色婷婷av一区二 | 91精品国产99久久久久久红楼 | 亚洲国产精品视频 | 国产小视频免费观看 | 亚洲黄色片一级 | 日韩一二三 | 91天天操 | 狠狠色丁香久久婷婷综 | 福利网在线 | 成片免费观看视频999 | 久久精品牌麻豆国产大山 | 成人久久久久久久久久 | 丝袜美女视频网站 | 国产偷国产偷亚洲清高 | 午夜私人影院 | 久久精品男人的天堂 | 亚洲欧美激情精品一区二区 | 日韩在线视频网 | 久久精品国产v日韩v亚洲 | 在线免费高清 | 手机看片1042| 天堂在线一区二区三区 | 久久九九国产视频 | 99这里只有久久精品视频 | 国产专区在线视频 | 在线观看成年人 | 美女国产在线 | 免费在线播放av电影 | 91av视频在线播放 | 在线免费黄色av | 成人a毛片 | 视频福利在线观看 | 美女国产免费 | 成人亚洲精品国产www | 狠狠操在线| 欧美精品一区二区三区四区在线 | 久在线观看视频 | 国产 在线观看 | 国产a免费| 人人cao| 99精品视频在线看 | 天天干干| 91亚洲精品久久久久图片蜜桃 | 久久精品视频在线免费观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 六月丁香在线视频 | 亚洲欧美日本一区二区三区 | 日韩一区二区三区高清在线观看 | 久久久免费 | 日日麻批40分钟视频免费观看 | 成人三级av | 日韩欧美综合精品 | 波多野结衣视频一区 | 人人草天天草 | 久久国产免 | 久久伊人色综合 | 中文av网 | 免费成人在线电影 | 亚洲国产欧美在线人成大黄瓜 | 国产精品久久一区二区无卡 | 福利电影一区二区 | 精品中文字幕在线观看 | 97在线精品国自产拍中文 | 狠狠躁日日躁狂躁夜夜躁 | 中文字幕资源在线 | www.亚洲激情.com | 欧美激情xxxx | 亚洲精品视| 国产视频精品免费 | 黄色网址a| 日韩免费高清在线 | 国产精品观看在线亚洲人成网 | 久久亚洲在线 | 在线观看免费国产小视频 | 亚洲精品综合一二三区在线观看 | 亚洲成人资源在线观看 | 国产一区成人 | 狠狠狠色丁香综合久久天下网 | 久久久婷| 伊人久久五月天 | 日日麻批40分钟视频免费观看 | 九色精品免费永久在线 | 亚洲综合在线视频 | 免费在线观看国产黄 | 成人一级片视频 | 玖玖999 | 亚洲视频中文 | 免费看高清毛片 | 精品乱码一区二区三四区 | 日韩超碰| 激情视频免费在线 | 日韩高清一区二区 | 久久伊人精品一区二区三区 | 黄色国产精品 | 综合在线观看 | 91黄色影视 | 日韩欧美在线视频一区二区 | 久久成人在线视频 | 国产日产高清dvd碟片 | 久久区二区 | 精品国产一区二区三区久久久蜜臀 | 日韩网站在线播放 | 天天摸天天舔天天操 | 亚洲精品黄色片 | 亚洲黄色在线播放 | 一区二区精品国产 | 精品久久久久久久久久久久久久久久久久 | www.亚洲黄 | 97国产精品一区二区 | 国产特级毛片 | 日韩r级电影在线观看 | 免费无遮挡动漫网站 | 亚洲国内精品在线 | 国产精品孕妇 | 国产一区在线免费观看视频 | 精品一区二区在线观看 | 国产手机在线播放 | 91看成人| www日日 | 国产精品久久久久久一区二区 | 精品视频免费 | 色婷婷视频网 | 欧美ⅹxxxxxx| 91九色在线观看视频 | 国产高清视频免费 | 欧美99热 | 一区二区三区手机在线观看 | 狠狠亚洲 | 91在线看| 一区在线播放 | 久久精品国产精品亚洲精品 | 久久av网| 激情综合色图 | 国产综合福利在线 | 日韩字幕在线 | 婷婷香蕉| 亚洲最新视频在线播放 | 成人小视频在线观看免费 | 国产中的精品av小宝探花 | 免费成人看片 | 欧美日韩性视频在线 | 久久精品国产一区二区电影 | 欧美日韩视频在线一区 | 亚洲 成人 一区 | 成人午夜电影网 | 婷婷激情五月 | 99久久999久久久精玫瑰 | 丁香伊人网 | 五月开心六月伊人色婷婷 | 中文字幕日韩一区二区三区不卡 | 日韩精品一区电影 | 国产精品自产拍在线观看中文 | 亚洲婷婷在线 | 色婷婷免费视频 | 99人成在线观看视频 | 国产午夜精品一区二区三区四区 | 欧美精品一区二区在线播放 | 免费网址在线播放 | 中文字幕在线有码 | 丁香六月婷婷开心 | 五月婷婷综合在线 | 国产免费精彩视频 | 日韩中文字幕电影 | 久久免费国产精品 | 深夜激情影院 | 人人爽人人澡人人添人人人人 | 全黄色一级片 | 天天综合网 天天综合色 | 91成人精品一区在线播放69 | www.69xx| 国产精品自产拍在线观看网站 | 天天爱天天 | 色永久免费视频 | 中文字幕色站 | 中文字幕丝袜 | 国产天天爽| 免费福利在线 | 国产黄色资源 | 亚洲最新av网址 | bbbbb女女女女女bbbbb国产 | 欧美亚洲精品一区 | 日韩精品视频免费专区在线播放 | 欧美另类网站 | 久久天天操 | 日本不卡一区二区 | 国产亚洲精品久久19p | 亚洲日本va午夜在线影院 | 丝袜美腿亚洲 | 美女视频免费精品 | 在线va网站 | 亚洲老妇xxxxxx| 欧美福利片在线观看 | 亚洲一区二区精品 | 欧美亚洲精品在线观看 | 久久久精品福利视频 | 免费av的网站 | 成人黄色av免费在线观看 | 麻豆视频免费在线播放 | 午夜久草| 天无日天天操天天干 | 美女黄濒| 亚洲高清久久久 | 免费成人在线电影 | 天天插伊人 | 成人午夜免费剧场 | 国产小视频在线观看 | wwwwww色| 精品国内自产拍在线观看视频 | 黄色大全在线观看 | 日韩最新在线 | 亚洲国产精品传媒在线观看 | 久久久av电影 | 99这里只有精品视频 | av色图天堂网 | 521色香蕉网站在线观看 | 在线观看亚洲电影 | 日韩网站一区 | 国产成人一区二区精品非洲 | 免费观看xxxx9999片 | 久久精品com | 天堂在线一区二区三区 | 91精品视频在线免费观看 | 日韩免费中文字幕 | 亚洲欧美视频网站 | 久久婷婷国产 | 久久99久久99精品中文字幕 | 国产三级午夜理伦三级 | 色婷婷导航 | 亚洲午夜久久久综合37日本 | 日韩av在线网站 | 在线看片91 | 在线观看免费版高清版 | 最近中文字幕完整高清 | 免费黄色在线网址 | 九九交易行官网 | 狠狠操欧美 | 天天插天天 | 中文字幕网站视频在线 | 一区二区三区日韩在线 | 99精品免费久久久久久久久日本 | 成人性生活大片 | 国产精品门事件 | 五月婷婷久 | 全黄色一级片 | 欧美激情综合色 | 国产91在线观看 | 国产精品永久 | 五月天久久久 | 欧美大片在线观看一区 | av电影免费在线 | 国产精品午夜免费福利视频 | 日韩美女av在线 | 久久99精品视频 | 成人福利av| 亚洲精品乱码久久久久久 | 九九热免费观看 | 国产馆在线播放 | 丰满少妇高潮在线观看 | 婷婷色中文字幕 | 亚洲国产无 | 99精品视频一区二区 | 91九色国产蝌蚪 | 日韩午夜视频在线观看 | 久久亚洲热| 免费在线激情电影 | 99热 精品在线 | 婷婷六月丁 | 国产日韩欧美视频 | 91精品国自产拍天天拍 | 久久久久久久久久免费 | 欧美在线视频第一页 | 亚洲精品人人 | 亚洲伊人网在线观看 | 国产精品高清一区二区三区 | 欧美日韩一级久久久久久免费看 | 久久九九久久精品 | 久草在线视频看看 | 欧美精品天堂 | 国产精品美女免费 | 蜜桃视频日本 | 日韩激情视频在线 | 免费在线播放视频 | 国产精品永久久久久久久www | 国产999精品久久久 免费a网站 | 国产精品午夜久久久久久99热 | 亚洲国产成人精品在线观看 | 91丨九色丨国产在线 | 日韩簧片在线观看 | 91精品久久久久久久久久入口 | 亚洲精品玖玖玖av在线看 | 99精品视频一区二区 | 黄色成品视频 | 在线电影 你懂得 | 麻豆网站免费观看 | 日韩av视屏在线观看 | 日韩欧美视频在线观看免费 | 免费av网站在线 | 日韩在线电影 | 成人免费看片98欧美 | 中文字幕观看视频 | 一本大道久久精品懂色aⅴ 五月婷社区 | 成人中文字幕在线观看 | 色欧美综合 | 岛国精品一区二区 | 国产福利资源 | 国产成人精品午夜在线播放 | 精品一区免费 | 91精品在线免费 | 五月宗合网 | 久草视频在线免费 | 亚洲精品乱码久久久久久按摩 | 久久久精品99 | 日韩视频精品在线 | 日韩一级片网址 | 激情五月激情综合网 | a午夜在线 | 福利视频一区二区 | 午夜丁香视频在线观看 | 婷婷国产精品 | 国产精品成人av电影 | 成人免费观看网站 | 91成人精品一区在线播放 | 国产黄色精品在线 | a成人在线 | 国产一级二级av | 亚洲精品动漫成人3d无尽在线 | 日韩中文字幕在线 | a视频在线 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 伊人狠狠操 | 福利网址在线观看 | av日韩不卡 | 亚洲欧美婷婷六月色综合 | 亚洲精品国产精品久久99 | 成人免费在线视频观看 | 久久精品专区 | 久久精品播放 | 国产精品av免费观看 | 国内精品久久久精品电影院 | 欧美日本在线视频 | 日韩欧美国产视频 | 亚洲天堂网在线播放 | 国产日女人 | 免费a现在观看 | 中文在线资源 | 日韩精品1区2区 | 久久精品视频免费观看 | 色狠狠久久av五月综合 | 天天操天天色天天 | 亚洲乱码精品久久久久 | 9999精品视频 | 九九热在线精品视频 | 黄视频色网站 | 9在线观看免费高清完整版在线观看明 | 国产日产精品一区二区三区四区 | 国产精品欧美日韩在线观看 | 麻豆成人精品视频 | 超碰97人人爱| 日韩欧美在线观看一区 | 涩涩在线| 亚洲成人av片在线观看 | 欧美一区二区三区在线观看 | 欧美精品在线观看免费 | 久久99国产精品二区护士 | 国产电影一区二区三区四区 | 天天综合网入口 | 香蕉在线观看 | 久久免费精品视频 | 日韩精品一区二区三区在线播放 | 麻豆一区二区三区视频 | 亚欧日韩成人h片 | 中文字幕一区二区三 | 日韩欧美xxxx| 91在线文字幕| 激情在线网站 | 国产精久久 | av黄色国产 | 天天操天天色天天 | 九九久久影视 | 天天操天天摸天天爽 | 亚洲黄色三级 | 午夜美女视频 | 国产亚洲精品bv在线观看 | 欧美精品在线一区 | 国产中文伊人 | 4438全国亚洲精品在线观看视频 | 国产日韩av在线 | 久久黄页 | 在线观看一区 | 成人精品一区二区三区电影免费 | 午夜在线资源 | 欧美精品九九99久久 | 免费在线观看av的网站 | 国产视频精品在线 | 国产在线国偷精品产拍免费yy | 成人教育av| 一区二区 精品 | 国产色拍 | 最近日本字幕mv免费观看在线 | 一区二区三区四区久久 | 成人免费视频在线观看 | 欧美激情va永久在线播放 | 日韩电影一区二区在线观看 | 精品久久久久久久久久岛国gif | 国产精品久久久一区二区三区网站 | 美女精品国产 | 久久国产精品久久久久 | 91中文字幕永久在线 | 亚洲精品乱码久久 | 久久不见久久见免费影院 | 久久久久亚洲精品中文字幕 | 四虎成人精品在永久免费 | 欧美久久久久久久久中文字幕 | 91久久丝袜国产露脸动漫 | 欧美一级特黄高清视频 | 日本少妇久久久 | 97操碰 | 久久99影院 | 97精品国产aⅴ | 色综合欧洲| 欧美日本日韩aⅴ在线视频 插插插色综合 | 国产中文在线字幕 | 久久影视精品 | av大全在线| 麻豆91精品91久久久 | 91视频在线网址 | 日韩av在线一区二区 | 免费看的黄色的网站 | 狠狠久久伊人 | 久久精品福利视频 | 久久精品视频一 | 国产精品久久久久久久久久久久久久 | 99国产精品视频免费观看一公开 | 免费视频91蜜桃 | 久草综合在线观看 | 激情综合五月天 | 最新亚洲视频 | 黄色在线观看污 | 亚洲涩涩色 | 国产 欧美 日本 | 久久这里只有精品久久 | 亚洲婷婷在线视频 | 91天天操 | 手机av在线网站 | 免费男女羞羞的视频网站中文字幕 | 婷婷五天天在线视频 | 视频在线观看一区 | 日本激情视频中文字幕 | 国产999精品久久久影片官网 | 超碰伊人网| 日韩视频二区 | 国产精品久久久久久久久久久久午夜 | 中日韩欧美精彩视频 | 国产美女精品视频免费观看 | 久久激情小视频 | 色婷婷五 | 国产91成人在在线播放 | 日韩在线观看视频中文字幕 | 欧美色图亚洲图片 | 天堂av观看 | 狠狠色丁香婷婷综合久久片 | 九九视频网| 亚洲一级片| 国产精品 中文在线 | 97精产国品一二三产区在线 | 91香蕉视频色版 | 日韩在线视频免费看 | 日韩精品中文字幕av | 亚洲欧美视频在线播放 | 久久成人毛片 | 成年人视频免费在线播放 | 日免费视频 | 久久不卡国产精品一区二区 | 久久毛片视频 | 男女免费av | 国产真实在线 | 日韩 精品 一区 国产 麻豆 | 亚洲3级 | 日本高清中文字幕有码在线 | 日韩在线视频精品 | 日本在线成人 | 欧美片一区二区三区 | 国产精品一区二区三区久久久 | 欧美亚洲免费在线一区 | 精品99在线观看 | 四虎国产| 日韩中文幕 | 国产精品久久久久久久久久久免费看 | 亚洲精品资源在线观看 | 久久免费99 | av高清在线 | 国产精品不卡一区 | 国产成人在线观看 | 国产精品欧美一区二区三区不卡 | 一区二区精品久久 | 麻豆一区二区三区视频 | 亚洲性视频 | 国内99视频 | 国产精品伦一区二区三区视频 | 中文理论片 | 天天做综合网 | 婷婷在线看 | 亚洲激情中文 | 成人午夜在线电影 | 中文字幕欧美三区 | 五月天天av| av性在线| 日韩在线视频免费看 | 色婷婷福利 | 亚洲va天堂va欧美ⅴa在线 | 国产精品一区二区久久精品爱微奶 | 一级黄色大片在线观看 | 国内精品视频在线播放 | 婷婷久月 | 日韩中文字幕免费在线观看 | 激情五月在线观看 | 亚洲 欧美 精品 | 国产黄a三级三级三级三级三级 | 日韩欧美综合 | 最新日本中文字幕 | 成人综合日日夜夜 | 久久精品二区 | 热re99久久精品国产99热 | 免费在线播放av电影 | 中文字幕资源网 国产 | 综合色站导航 | 精品一二三区视频 | 91禁在线看 | 中文字幕av免费在线观看 | 一区二区三区韩国免费中文网站 | 亚洲精品一区二区三区高潮 | 色婷婷激情网 | 精品国产中文字幕 | 激情九九 | 一级a性色生活片久久毛片波多野 | 高清免费av在线 | 色香天天| 久草爱视频 | 久久9精品 | 成人黄色在线观看视频 | 香蕉视频在线播放 | 亚洲国产精品va在线看黑人 | 日韩网站一区 | 久久欧美视频 | 91爱爱电影 | 久久久国产精品一区二区中文 | 日日躁天天躁 | 在线免费观看视频 | 亚洲婷婷丁香 | 色综合久久综合网 | 人人干人人爽 | 日本黄色免费在线观看 | 国产精品欧美一区二区 | 最近免费中文字幕大全高清10 | 国产成人三级在线 | 一级精品视频在线观看宜春院 | 天天插日日射 | 久久国产电影院 | a在线观看国产 | 精产嫩模国品一二三区 | 日韩精品视频在线免费观看 | 夜夜操天天摸 | 欧美日韩电影在线播放 | 在线观看视频免费播放 | 久久影视一区 | 人成在线免费视频 | 国产精品久免费的黄网站 | 国产在线91在线电影 | 天天草视频 | 国产精品美女久久久久久久久 | 五月婷婷丁香在线观看 | 在线免费黄色av | 日韩三级视频在线看 | 成人久久久久久久久 | 美女视频免费一区二区 | 日韩中文在线电影 | 久久久首页 | 国产美女在线精品免费观看 | 青青草国产精品视频 | 久操中文字幕在线观看 | 日韩精品免费一区二区 | 亚洲国产片 | www黄色软件| 日日操夜夜操狠狠操 | 999色视频 | 成人av电影免费 | 亚洲在线视频播放 | 久久久久女人精品毛片九一 | 字幕网在线观看 | 亚洲国产字幕 | 国产爽妇网 | 亚洲高清免费在线 | 字幕网av | 蜜臀aⅴ国产精品久久久国产 | 日韩黄色一级电影 | 三级黄色在线观看 | 久久久久久久免费观看 | 91精品国产自产在线观看 | 在线国产黄色 | 亚洲电影一级黄 | 国产国产人免费人成免费视频 | 综合久久久久久 | 91在线影院 | 国产系列 在线观看 | 蜜臀一区二区三区精品免费视频 | 日韩av电影一区 | 国产成人一区二区三区在线观看 | 久久久久久蜜桃一区二区 | 91传媒免费观看 | 成人免费视频播放 | 黄色特一级 | 日日摸日日碰 | 在线免费观看的av | 在线精品一区二区 | 亚洲人成人在线 | 免费精品在线视频 | 欧美日韩一区二区三区不卡 | 丰满少妇高潮在线观看 | 国产精品久久久久一区二区三区共 | 国产亚洲日 | 国产精品综合av一区二区国产馆 | 中文字幕在线日 | 久久精品一区二区三区国产主播 | 在线观看香蕉视频 | 91在线精品观看 | 在线国产小视频 | 天天色天天色天天色 | 天天天天爽 | 天天鲁天天干天天射 | 精品九九九九 | 亚洲无吗视频在线 | 中国一级片免费看 | 久久国产精品99精国产 | 久久婷婷色 | 91精品少妇偷拍99 | 久久综合中文字幕 | 去干成人网 | 手机av在线网站 | 五月天天av| 中文字幕网站 | 99久热精品 | a天堂最新版中文在线地址 久久99久久精品国产 | 中文字幕在线观看网址 | 国产一区免费视频 | av成人免费在线 | 天天爱天天色 | 久久99国产综合精品免费 | 麻豆视频在线免费看 | 在线观看久 | 婷婷综合久久 | 福利视频一区二区 | 97色婷婷成人综合在线观看 | 伊人色综合久久天天网 | 91av在线免费 | 久久久精品久久日韩一区综合 | 日韩国产高清在线 | 黄色国产在线 | 久久不射影院 | 色婷婷综合久久久中文字幕 | 99久久婷婷国产精品综合 | av电影中文字幕在线观看 | 亚洲另类视频在线观看 | 天天在线操 | 91在线视频精品 | 日日爱夜夜爱 | 婷婷在线不卡 | 97伊人网| 久久久久一区 | 婷婷丁香激情综合 | avwww在线| 国产在线观看你懂得 | av在线免费播放网站 | 99精品免费久久久久久日本 | 99精品欧美一区二区三区 | 欧美91成人网 | 国产美女久久 | 一区 在线 影院 | freejavvideo日本免费 | 精产嫩模国品一二三区 | 天天干人人 | a天堂最新版中文在线地址 久久99久久精品国产 | 99在线高清视频在线播放 | 国内精品亚洲 | 国产精品白浆 | 欧美成人性网 | 色视频网站在线观看一=区 a视频免费在线观看 | 成年人免费在线观看网站 | 国产亚洲久一区二区 | 精品久久久久国产免费第一页 | 婷婷色六月天 | 丁香六月在线 | 日韩乱码中文字幕 | 天天色婷婷 | 欧美一级久久 | 97av色| av专区在线| 国产欧美精品在线观看 | 欧美日韩国产二区三区 | 日韩一区二区三区高清免费看看 | 在线成人中文字幕 | 在线观看黄色免费视频 | 国产精品免费久久久久影院仙踪林 | 天天干天天操天天入 | 中文字幕av免费观看 | 国产涩涩在线观看 | 成人在线黄色 | 午夜精品久久久久久中宇69 | 亚洲精品在线观看网站 | 午夜精品三区 | 国产美女在线免费观看 | 成年人免费看片 | 91插插影库| 免费观看www7722午夜电影 | 最新午夜 | 午夜少妇一区二区三区 | 免费在线观看日韩视频 | 欧美久久久久 | 好看的国产精品视频 | 国产精品久久久久久久av大片 | 国产毛片久久久 | 国产亚洲激情视频在线 | 日韩成人精品一区二区 | 日韩欧美精品在线 | 成人91在线| 91精品久久久久久综合乱菊 | 精品久久久久久久久久久久 | 国产97碰免费视频 | 亚洲精品在线观看av | 国产精品精品国产色婷婷 | 欧美一级小视频 | 免费亚洲一区二区 | 日韩免费视频线观看 | 久草在线视频免赞 | 一区二区三区在线免费播放 | 麻豆91在线观看 | 国产伦理剧 | 伊人久久婷婷 | 欧美视频xxx | 成人超碰在线 | 亚洲国产精品女人久久久 | 成人黄色片在线播放 | 精品影院一区二区久久久 | 久久国产免 | 射射色 | 国产在线精品国自产拍影院 | 欧美精品一区二区免费 | 久久狠狠亚洲综合 | 国产精品久久在线 | 亚洲精品五月 | 中文字幕在线观看网址 | 草久在线观看视频 | 五月天网页 | 亚洲欧美乱综合图片区小说区 | 欧美国产亚洲精品久久久8v | 国产91影院 | 日本久久久久久科技有限公司 | 欧美精品中文 | 欧美一区二区日韩一区二区 | 精选久久 | 成人av中文字幕在线观看 | 五月婷婷综合久久 | 精品国产亚洲日本 | 久久久精品国产一区二区三区 | 二区三区精品 | 亚洲区色 | 国产三级午夜理伦三级 | 在线观看黄色小视频 | 国产96在线视频 | 福利区在线观看 | 五月天久久精品 | 在线播放国产精品 | 国产清纯在线 | 亚洲精品在线观看不卡 | 99精品观看 | 九九九九热精品免费视频点播观看 | 免费男女羞羞的视频网站中文字幕 | 国产成人精品女人久久久 | 国产一区影院 | 欧美小视频在线观看 | 毛片美女网站 | 国产精品刺激对白麻豆99 | 91成人看片 | 久久精品专区 | 日本高清中文字幕有码在线 | 婷婷国产精品 | 深爱激情五月婷婷 | 色中文字幕在线观看 | 亚洲精品视 | 成人动漫精品一区二区 | 亚洲在线| 一区二区三区在线免费观看 | 亚洲色图 校园春色 | 天天插狠狠干 | 激情综合网色播五月 | 性色av一区二区三区在线观看 | 黄色高清视频在线观看 | 久久精品小视频 | 天天曰天天干 | 国产精品久久久久久69 | 天天爱天天操天天爽 | 一区二区不卡高清 | 亚洲精品女人久久久 | 成人av资源站 | 国产中文在线观看 | 日韩成人中文字幕 | 久久激情电影 | 夜夜躁日日躁狠狠躁 | 午夜视频在线观看一区二区三区 | 欧美极品xxxx| 天天超碰 | 国产专区日韩专区 | 在线观看黄色的网站 | 中文字幕在线视频网站 | 国产999精品久久久久久麻豆 | 91手机电视 | 日韩91在线 | 深夜福利视频在线观看 | 色婷婷视频在线 | 精品国产视频在线 | 天天干国产 | 久久视频网 | 久久伦理 | 在线观看色网站 | 免费网站在线观看成人 | 日韩在线视频播放 | 好看的国产精品视频 | 黄色三级免费观看 | 2022久久国产露脸精品国产 | 综合网伊人 | 韩日在线一区 | 免费合欢视频成人app | 91精品国产成人观看 | 综合久久综合久久 | 免费的黄色的网站 | 久久视频精品在线 | 亚洲黄色免费 | 国产亚洲情侣一区二区无 | 2021国产在线 | 亚洲女欲精品久久久久久久18 | 日韩精品无码一区二区三区 | 久久精品91久久久久久再现 | 中文字幕在线观看av | 国产精品精品 | 最近最新最好看中文视频 | 99在线精品视频在线观看 | 高清av网 | 久草免费看 | 99久久国产免费免费 | 超碰久热 | 在线韩国电影免费观影完整版 | 久草在线99 | 91亚洲狠狠婷婷综合久久久 | 色吧av色av | 欧美午夜精品久久久久久孕妇 | 成人av一区二区三区 | 91桃色国产在线播放 | 涩涩在线 | 婷婷网站天天婷婷网站 | 蜜臀久久99精品久久久久久网站 | 99久久精品免费看国产 | 免费看的黄网站 | 日韩免费一区二区在线观看 | 天天玩天天干 | 91av九色| av网站免费看 | 成人黄色在线电影 | 中文字幕在线观看资源 | 中文字幕国产 | 日韩一区二区三区免费电影 | 欧美不卡在线 | 国产黄色精品在线 | 在线观看91精品视频 | 五月婷婷影视 | 黄色av一区二区三区 | 亚洲欧美日韩一区二区三区在线观看 | 综合久久一本 | 国产+日韩欧美 | 黄色精品久久久 | 日日夜夜天天 | 在线视频欧美日韩 | 99视频黄| 久久这里精品视频 | 日韩免费一区二区在线观看 | 91pony九色丨交换 | 国产成人高清av | 亚洲精品99久久久久中文字幕 | 麻豆传媒在线免费看 | 精品久久五月天 | 日本黄色大片免费看 | 在线香蕉视频 | 午夜电影一区 | 久久国产欧美日韩精品 | 日批视频在线观看免费 | 人人玩人人爽 | av片免费播放 | 91日韩在线专区 | 亚洲三级精品 | 精品一区二区电影 | 999久久久久 | 伊人五月天 | 日韩有码欧美 | 婷婷四房综合激情五月 | 精品福利网 | 免费网站在线观看人 | 狠狠黄 | 日韩午夜电影 | 人人插人人| 国产永久免费高清在线观看视频 | 91亚洲精品在线观看 | 黄色a在线 | 久久久久免费观看 | 精品国产诱惑 | 人人插人人看 | 日本免费久久高清视频 | 不卡中文字幕在线 | 51久久成人国产精品麻豆 | 毛片久久久 | 97在线精品国自产拍中文 |