精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

OpenHarmony源碼解析之系統(tǒng)服務管理子系統(tǒng)

系統(tǒng) OpenHarmony
本文詳細講解了系統(tǒng)服務的實現(xiàn)方法和注意事項。通過這篇文章相信大家對系統(tǒng)服務管理子系統(tǒng)有了一定的了解。

??想了解更多關于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎軟件社區(qū)??

??https://ost.51cto.com??

1、預備知識

Linux中主要的IPC機制有:管道(pipe)、信號(signal)、信號量(semophore)、消息隊列(Message)、共享內(nèi)存(Share Memory)、套接字(Socket)等。Openharmony基于binder驅(qū)動封裝了一套ipc機制(foundation\communication\ipc)用于實現(xiàn)設備內(nèi)的跨進程通信。
Binder機制通常采用客戶端-服務器(Client-Server)模型,服務請求方(Client)可獲取服務提供方(Server)的代理 (Proxy),并通過此代理讀寫數(shù)據(jù)來實現(xiàn)進程間的數(shù)據(jù)通信。通常,系統(tǒng)能力(SystemAbility)Server側(cè)會先注冊到系統(tǒng)能力管理者(System Ability Manager,縮寫SAMgr)中,SAMgr負責管理這些SA并向Client提供相關的接口(添加,查詢,獲取,刪除等)。Client要和某個具體的SA通信,必須先從SAMgr中獲取該SA的代理,然后使用代理和SA通信。

注:SAMgr本身也是IPC的Server端,Client通過SAMgr的代理,調(diào)用SAMgr的接口。

(1)binder機制架構(gòu)圖

OpenHarmony源碼解析之系統(tǒng)服務管理子系統(tǒng)-開源基礎軟件社區(qū)

說明:

SAMgr中保存了一個map,key為saId, value為SAInfo。SAInfo結(jié)構(gòu)體定義如下:

struct SAInfo {
sptr<IRemoteObject> remoteObj;
bool isDistributed = false;
std::u16string capability;
std::string permission;
};

(2)實現(xiàn)IPC的基本步驟

  1. 定義接口類
    接口類繼承IRemoteBroker,定義描述符、業(yè)務函數(shù)和消息碼。
  2. 實現(xiàn)服務提供端(Stub)
    Stub繼承IRemoteStub,除了接口類中未實現(xiàn)方法外,還需要實現(xiàn)OnRemoteRequest方法。
  3. 實現(xiàn)服務請求端(Proxy)
    Proxy繼承IRemoteProxy,封裝業(yè)務函數(shù),調(diào)用SendRequest將請求發(fā)送到Stub。
  4. 服務端進程注冊SA
    服務提供方所在進程啟動后,申請SA的唯一標識,將Stub注冊到SAMgr。
  5. 客戶端進程通過SA的標識(saId),從SAMgr獲取Proxy,通過Proxy實現(xiàn)與Stub的跨進程通信。

ohos中的SystemAbility可以運行在獨立的進程中,也可以多個SystemAbility同時依附在某個進程內(nèi)(如 foundation進程),通過這個進程對外提供服務。其他進程通過IPC(binder機制)使用這些服務提供的接口。

2、系統(tǒng)服務管理子系統(tǒng)簡介

系統(tǒng)服務管理子系統(tǒng)由兩部分構(gòu)成。
系統(tǒng)服務框架組件(safwk):定義了SystemAbility的實現(xiàn)方法,并提供啟動、發(fā)布等接口實現(xiàn)。
系統(tǒng)服務管理組件(samgr): 提供系統(tǒng)服務注冊、查詢等功能。

架構(gòu)圖如下:

OpenHarmony源碼解析之系統(tǒng)服務管理子系統(tǒng)-開源基礎軟件社區(qū)

代碼目錄:

/foundation/systemabilitymgr
│── safwk # 組件目錄
├── bundle.json # 組件描述及編譯腳本
├── etc # 配置文件
├── interfaces # 對外接口目錄
├── services # 框架實現(xiàn)
├── test # 測試用例
├── samgr
├── bundle.json # 部件描述及編譯文件
├── frameworks # 框架實現(xiàn)存在目錄
├── interfaces # 接口目錄
├── services # 組件服務端目錄
├── test # 測試代碼存放目錄
├── utils # 工具類目錄

3、系統(tǒng)服務框架組件

SystemAbility實現(xiàn)一般采用XXX.cfg + saId.xml + libXXX.z.so的方式由init進程解析對應的XXX.cfg文件拉起SystemAbility所依賴的進程。(注:多個系統(tǒng)服務可能跑在同一個進程里。比如AbilityManagerService、BatteryService、WindowManagerService都在foundation進程,MMIService在獨立的進程multimodalinput中。)

SystemAbility類圖如下:

OpenHarmony源碼解析之系統(tǒng)服務管理子系統(tǒng)-開源基礎軟件社區(qū)

說明:

SystemAbility子類需要重寫OnStart()和OnStop()方法,并且在OnStart()方法中調(diào)用Publish(sptr<IRemoteObject> systemAbility)方法把系統(tǒng)服務發(fā)布出去。

(1)系統(tǒng)服務實現(xiàn)步驟

下面以AbilityManagerService為例說明SystemAbility的實現(xiàn)。

定義IPC對外接口IXXX

定義該服務對外提供的能力集合函數(shù),統(tǒng)一繼承IPC接口類IRemoteBroker;同時聲明該IPC對外接口唯一標識符DECLARE_INTERFACE_DESCRIPTOR(XXX);該標識符用于IPC通信的校驗等目的。
foundation\ability\ability_runtime\interfaces\inner_api\ability_manager\include\ability_manager_interface.h。

class IAbilityManager : public OHOS::IRemoteBroker {
public:
DECLARE_INTERFACE_DESCRIPTOR(u"ohos.aafwk.AbilityManager")

/**
* StartAbility with want, send want to ability manager service.
*
* @param want, the want of the ability to start.
* @param userId, Designation User ID.
* @param requestCode, Ability request code.
* @return Returns ERR_OK on success, others on failure.
*/
virtual int StartAbility(
const Want &want,
int32_t userId = DEFAULT_INVAL_VALUE,
int requestCode = DEFAULT_INVAL_VALUE) = 0;
//...此處省略若干行
}

定義客戶端代碼XXXProxy

foundation\ability\ability_runtime\services\abilitymgr\include\ability_manager_proxy.h。

class AbilityManagerProxy : public IRemoteProxy<IAbilityManager> {
public:
explicit AbilityManagerProxy(const sptr<IRemoteObject> &impl) : IRemoteProxy<IAbilityManager>(impl)
{}

virtual ~AbilityManagerProxy()
{}

/**
* StartAbility with want, send want to ability manager service.
*
* @param want, the want of the ability to start.
* @param requestCode, Ability request code.
* @param userId, Designation User ID.
* @return Returns ERR_OK on success, others on failure.
*/
virtual int StartAbility(
const Want &want,
int32_t userId = DEFAULT_INVAL_VALUE,
int requestCode = DEFAULT_INVAL_VALUE) override;
//...此處省略若干行
private:
static inline BrokerDelegator<AbilityManagerProxy> delegator_;
};

foundation\ability\ability_runtime\services\abilitymgr\src\ability_manager_proxy.cpp。

int AbilityManagerProxy::StartAbility(const Want &want, int32_t userId, int requestCode)
{
int error;
MessageParcel data;
MessageParcel reply;
MessageOption option;

if (!WriteInterfaceToken(data)) {
return INNER_ERR;
}
if (!data.WriteParcelable(&want)) {
HILOG_ERROR("want write failed.");
return INNER_ERR;
}

if (!data.WriteInt32(userId)) {
HILOG_ERROR("userId write failed.");
return INNER_ERR;
}

if (!data.WriteInt32(requestCode)) {
HILOG_ERROR("requestCode write failed.");
return INNER_ERR;
}

error = Remote()->SendRequest(IAbilityManager::START_ABILITY, data, reply, option);
if (error != NO_ERROR) {
HILOG_ERROR("Send request error: %{public}d", error);
return error;
}
return reply.ReadInt32();
}

AbilityManagerProxy::StartAbility()實現(xiàn)代碼中會調(diào)用Remote()->SendRequest(IAbilityManager::START_ABILITY, data, reply, option);把消息碼和數(shù)據(jù)發(fā)送給服務端。

定義服務端代碼XXXStub

foundation\ability\ability_runtime\services\abilitymgr\include\ability_manager_stub.h。

class AbilityManagerStub : public IRemoteStub<IAbilityManager> {
public:
AbilityManagerStub();
~AbilityManagerStub();
virtual int OnRemoteRequest(
uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override;
//...此處省略若干行
};

foundation\ability\ability_runtime\services\abilitymgr\src\ability_manager_stub.cpp。

int AbilityManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
{
std::u16string descriptor = AbilityManagerStub::GetDescriptor();
std::u16string remoteDescriptor = data.ReadInterfaceToken();
if (descriptor != remoteDescriptor) {
HILOG_INFO("local descriptor is not equal to remote");
return ERR_INVALID_STATE;
}

auto itFunc = requestFuncMap_.find(code);
if (itFunc != requestFuncMap_.end()) {
auto requestFunc = itFunc->second;
if (requestFunc != nullptr) {
return (this->*requestFunc)(data, reply);
}
}
HILOG_WARN("default case, need check.");
return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
}

requestFuncMap_[START_ABILITY] = &AbilityManagerStub::StartAbilityInner。
消息碼START_ABILITY對應的函數(shù)為AbilityManagerStub::StartAbilityInner。

int AbilityManagerStub::StartAbilityInner(MessageParcel &data, MessageParcel &reply)
{
Want *want = data.ReadParcelable<Want>();
if (want == nullptr) {
HILOG_ERROR("want is nullptr");
return ERR_INVALID_VALUE;
}
int32_t userId = data.ReadInt32();
int requestCode = data.ReadInt32();
int32_t result = StartAbility(*want, userId, requestCode);
reply.WriteInt32(result);
delete want;
return NO_ERROR;
}

StartAbility()的實現(xiàn)在AbilityManagerStub的實現(xiàn)類AbilityManagerService中。

SystemAbility的實現(xiàn)類

foundation\ability\ability_runtime\services\abilitymgr\include\ability_manager_service.h。

class AbilityManagerService : public SystemAbility,
public AbilityManagerStub,
public AppStateCallback,
public std::enable_shared_from_this<AbilityManagerService> {
DECLARE_DELAYED_SINGLETON(AbilityManagerService)
DECLEAR_SYSTEM_ABILITY(AbilityManagerService)
public:
void OnStart() override;
void OnStop() override;
ServiceRunningState QueryServiceState() const;

/**
* StartAbility with want, send want to ability manager service.
*
* @param want, the want of the ability to start.
* @param requestCode, Ability request code.
* @param userId, Designation User ID.
* @return Returns ERR_OK on success, others on failure.
*/
virtual int StartAbility(
const Want &want, int32_t userId = DEFAULT_INVAL_VALUE, int requestCode = DEFAULT_INVAL_VALUE) override;
// ...此處省略若干行
}

AbilityManagerService同時繼承了SystemAbility和AbilityManagerStub。
在重寫的SystemAbility的接口函數(shù)OnStart()中,調(diào)用Publish(instance_)把自己發(fā)布出去。

void AbilityManagerService::OnStart()
{
//...此處省略若干行
/* Publish service maybe failed, so we need call this function at the last,
* so it can't affect the TDD test program */
instance_ = DelayedSingleton<AbilityManagerService>::GetInstance().get();
if (instance_ == nullptr) {
HILOG_ERROR("AMS enter OnStart, but instance_ is nullptr!");
return;
}
bool ret = Publish(instance_);
if (!ret) {
HILOG_ERROR("Publish AMS failed!");
return;
}
//...此處省略若干行
}

注:在實現(xiàn)SystemAbility的時候,必須調(diào)用宏REGISTER_SYSTEM_ABILITY_BY_ID或者SystemAbility::MakeAndRegisterAbility()把SystemAbility注冊到LocalAbilityManager中。
可參考如下代碼:

const bool REGISTER_RESULT =
SystemAbility::MakeAndRegisterAbility(DelayedSingleton<AbilityManagerService>::GetInstance().get());

或者:

REGISTER_SYSTEM_ABILITY_BY_ID(AppMgrService, APP_MGR_SERVICE_ID, true);

SystemAbility配置

以c++實現(xiàn)的SA必須配置相關SystemAbility的profile配置文件才會完成SA的自動加載注冊邏輯,否則沒有編寫配置文件的SystemAbility不會完成自動加載注冊。配置方法如下:
在子系統(tǒng)的根目錄新建一個以sa_profile為名的文件夾,然后在此文件夾中新建兩個文件:一個以saId為前綴的xml文件,另外一個為BUILD.gn文件。
比如AbilityManagerService,saId為ABILITY_MGR_SERVICE_ID(即180),對應的配置文件為180.xml。內(nèi)容如下:

<info>
<process>foundation</process>
<systemability>
<name>180</name>
<libpath>libabilityms.z.so</libpath>
<run-on-create>true</run-on-create>
<distributed>false</distributed>
<dump-level>1</dump-level>
</systemability>
</info>

BUILD.gn內(nèi)容如下:

ohos_sa_profile("ams_sa_profile") {
sources = [
"180.xml",
"182.xml",
"183.xml",
"184.xml",
"501.xml",
]

part_name = "ability_runtime"
}

說明:
  • 進程名字即該SystemAbility要運行的進程空間,此字段是必填選項。上例中,AbilityManagerService跑在foundation進程中。
  • 一個SystemAbility配置文件只能配置一個SystemAbility節(jié)點,配置多個會導致編譯失敗。
  • SystemAbility的name為對應的saId必須與代碼中注冊的saId保持一致,必配項。
  • libpath為SystemAbility的加載路徑,必配項。
  • run-on-create:true表示進程啟動后即向samgr組件注冊該SystemAbility;false表示按需啟動,即在其他模塊訪問到該SystemAbility時啟動,必配項。
  • distributed:true表示該SystemAbility為分布式SystemAbility,支持跨設備訪問;false表示只有本地跨進程訪問。
  • bootphase:可不設置;可以設置的值有三種:BootStartPhase、CoreStartPhase、OtherStartPhase(默認類型),三種優(yōu)先級依次降低,在同一個進程中,會優(yōu)先拉起注冊配置BootStartPhase的SystemAbility,然后是配置了CoreStartPhase的SystemAbility,最后是OtherStartPhase;當高優(yōu)先級的SystemAbility全部啟動注冊完畢才會啟動下一級的SystemAbility的注冊啟動。
  • dump-level:表示systemdumper支持的level等級,默認配置1。
  • BUILD.gn中part_name為相應部件名稱;sources表示當前子系統(tǒng)需要配置的SystemAbility列表,可支持配置多個SystemAbility。

以上步驟完成后,全量編譯代碼后會在out路徑下生成一個以進程名為前綴的xml文件(比如foundation.xml),路徑為:out\…\system\profile\foundation.xml。該文件整合了所有需要在該進程中運行的SA的saId.xml文件內(nèi)容。(比如AbilityManagerService,WindowManagerService,PowerManagerService等SA的配置文件都會被集成到foundation.xml中)。

Cfg配置文件

cfg配置文件為linux提供的native進程拉起策略,開機啟動階段由init進程解析cfg文件把目標進程拉起(動態(tài)加載的除外)。
foundation進程的配置文件在systemabilitymgr子系統(tǒng)中。
foundation\systemabilitymgr\safwk\etc\profile\foundation.cfg。

"services" : [{
"name" : "foundation",
"path" : ["/system/bin/sa_main", "/system/profile/foundation.xml"],
"importance" : -20,
"uid" : "foundation",
//...此處省略若干行
}
]

(2)SystemAbility所在進程啟動時序圖

OpenHarmony源碼解析之系統(tǒng)服務管理子系統(tǒng)-開源基礎軟件社區(qū)

時序圖1

該流程即為/system/bin/sa_main可執(zhí)行文件的啟動流程,main()函數(shù)(代碼路徑foundation\systemabilitymgr\safwk\services\safwk\src\main.cpp)在調(diào)用LocalAbilityManager::GetInstance().DoStartSAProcess(profilePath, saId)之前會把進程改名為saId.xml配置文件中指定的進程名。

3、系統(tǒng)服務管理組件

SystemAbilityManager本身是IPC接口ISystemAbilityManager的服務端。提供了添加、刪除、查詢系統(tǒng)服務,以及訂閱系統(tǒng)服務狀態(tài)等接口。IPCSkeleton::SetContextObject()通過該方法告訴binder我是服務管理器,我是0號選手。

constexpr int REGISTRY_HANDLE = 0。

foundation\systemabilitymgr\samgr\services\samgr\native\source\main.cpp。

int main(int argc, char *argv[])
{
HILOGI("%{public}s called, enter System Ability Manager ", __func__);

OHOS::sptr<OHOS::SystemAbilityManager> manager = OHOS::SystemAbilityManager::GetInstance();
manager->Init();
OHOS::sptr<OHOS::IRemoteObject> serv = manager->AsObject();

if (!IPCSkeleton::SetContextObject(serv)) {
HILOGE("set context fail!"); // add log for dfx
}
int result = SetParameter("bootevent.samgr.ready", "true");
HILOGI("set samgr ready ret : %{public}s", result == 0 ? "succeed" : "failed");
manager->StartDfxTimer();
OHOS::IPCSkeleton::JoinWorkThread();
return -1;
}

OpenHarmony源碼解析之系統(tǒng)服務管理子系統(tǒng)-開源基礎軟件社區(qū)

標紅的方法LoadSystemAbility適用于動態(tài)加載系統(tǒng)服務進程的場景。

前面章節(jié)講的AbilityManagerService所在的foundation進程,開機即被init進程拉起。

有些系統(tǒng)服務進程需要動態(tài)加載,比如QuickFixManagerService所在的quick_fix進程。

foundation\ability\ability_runtime\services\quickfixmgr\quick_fix.cfg。

{
"services" : [{
"name" : "quick_fix",
"path" : ["/system/bin/sa_main", "/system/profile/quick_fix.xml"],
"ondemand" : true,
"uid" : "quickfixserver",
"gid" : ["system"],
"secon" : "u:r:quick_fix:s0"
}
]
}

cfg文件指定了"ondemand"為 true,說明quick_fix進程要按需啟動。拉起quick_fix進程的關鍵在于SystemAbilityManager::LoadSystemAbility方法。
foundation\ability\ability_runtime\interfaces\inner_api\quick_fix\src\quick_fix_manager_client.cpp。

bool QuickFixManagerClient::LoadQuickFixMgrService()
{
// ...此處省略若干行
sptr<QuickFixLoadCallback> loadCallback = new (std::nothrow) QuickFixLoadCallback();
if (loadCallback == nullptr) {
HILOG_ERROR("Create load callback failed.");
return false;
}

auto ret = systemAbilityMgr->LoadSystemAbility(QUICK_FIX_MGR_SERVICE_ID, loadCallback);
if (ret != 0) {
HILOG_ERROR("Load system ability %{public}d failed with %{public}d.", QUICK_FIX_MGR_SERVICE_ID, ret);
return false;
}

{
std::unique_lock<std::mutex> lock(loadSaMutex_);
auto waitStatus = loadSaCondation_.wait_for(lock, std::chrono::milliseconds(LOAD_SA_TIMEOUT_MS),
[this]() {
return loadSaFinished_;
});
if (!waitStatus) {
HILOG_ERROR("Wait for load sa timeout.");
return false;
}
}

return true;
}

SystemAbilityManager::LoadSystemAbility()中,會先判斷目標SA是否已存在,如不存在,則調(diào)用StartDynamicSystemProcess()函數(shù)把目標SA所在進程拉起。(SystemAbilityManager在初始化的時候會遍歷/system/profile/目錄下的文件并解析,把所有SA的配置信息保存到saProfileMap_中。所以目標SA所在的進程名,SystemAbilityManager都有保存。)

int32_t SystemAbilityManager::StartDynamicSystemProcess(const std::u16string& name, int32_t systemAbilityId)
{
std::string strExtra = std::to_string(systemAbilityId);
auto extraArgv = strExtra.c_str();
auto result = ServiceControlWithExtra(Str16ToStr8(name).c_str(), ServiceAction::START, &extraArgv, 1);
HILOGI("StartDynamicSystemProcess call ServiceControlWithExtra result:%{public}d!", result);
return (result == 0) ? ERR_OK : ERR_INVALID_VALUE;
}

ServiceControlWithExtra()函數(shù)的實現(xiàn)在base\startup\init\interfaces\innerkits\service_control\service_control.c文件中,實際就是通知init進程把目標進程拉起。目標進程被拉起之后會再走一遍時序圖1的流程。跟開機啟動的系統(tǒng)服務進程的不同點在于,動態(tài)加載的系統(tǒng)服務進程main()函數(shù)參數(shù)多了目標saId。

4、系統(tǒng)服務接口使用方法

foundation\systemabilitymgr\samgr\interfaces\innerkits\samgr_proxy\include\system_ability_definition.h 定義了所有系統(tǒng)服務的saId。

比如要使用AbilityManagerService的StartAbility()接口。

  • 包含頭文件

#include "ability_manager_interface.h"
#include "if_system_ability_manager.h"
#include "ipc_skeleton.h"
#include "iservice_registry.h"
#include "system_ability_definition.h"

  • 獲取系統(tǒng)服務,調(diào)用接口

OHOS::sptr<OHOS::ISystemAbilityManager> systemAbilityManager =
OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
OHOS::sptr<OHOS::IRemoteObject> abilityObject =
systemAbilityManager->GetSystemAbility(OHOS::ABILITY_MGR_SERVICE_ID);
auto abms = OHOS::iface_cast<OHOS::AAFwk::IAbilityManager>(abilityObject);
abms->StartAbility(want, userId, requestCode);

5、系統(tǒng)服務不配置saId.xml,不走自動加載注冊流程行不行?

答案是可以的。
參考SysEventServiceOhos,是SystemAbility,但沒有配置saId.xml,直接在hiview進程中初始化并注冊。
SysEventService::OnLoad() => (hiview進程加載SysEventService插件)
SysEventServiceAdapter::StartService() =>
OHOS::HiviewDFX::SysEventServiceOhos::StartService() =>
samgr->AddSystemAbility(DFX_SYS_EVENT_SERVICE_ABILITY_ID, instance)

6、總結(jié)

本文詳細講解了系統(tǒng)服務的實現(xiàn)方法和注意事項。通過這篇文章相信大家對系統(tǒng)服務管理子系統(tǒng)有了一定的了解。

??想了解更多關于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎軟件社區(qū)??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區(qū)
相關推薦

2021-11-18 10:28:03

鴻蒙HarmonyOS應用

2021-12-17 16:42:09

鴻蒙HarmonyOS應用

2021-11-08 15:04:47

鴻蒙HarmonyOS應用

2022-01-06 16:17:58

鴻蒙HarmonyOS應用

2022-02-17 20:57:07

OpenHarmon操作系統(tǒng)鴻蒙

2021-09-18 14:40:37

鴻蒙HarmonyOS應用

2022-01-10 15:30:11

鴻蒙HarmonyOS應用

2022-05-10 11:17:27

電話子系統(tǒng)數(shù)據(jù)服務模塊

2022-05-24 15:46:51

Wi-FiSTA模式

2023-06-28 15:00:02

開源鴻蒙輸入系統(tǒng)架構(gòu)

2023-04-06 09:14:11

多模輸入子系統(tǒng)鴻蒙

2021-09-13 15:15:18

鴻蒙HarmonyOS應用

2022-01-13 10:11:59

鴻蒙HarmonyOS應用

2021-09-17 14:38:58

鴻蒙HarmonyOS應用

2022-01-20 14:33:29

openharmonwayland協(xié)議鴻蒙

2022-03-18 16:07:04

Graphic子系統(tǒng)鴻蒙

2022-05-30 15:08:33

包管理子系統(tǒng)包安裝模塊

2021-11-25 09:54:54

鴻蒙HarmonyOS應用

2022-06-13 14:18:39

電源管理子系統(tǒng)耗電量服務

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙
點贊
收藏

51CTO技術棧公眾號

国产精品视频一区国模私拍 | 69精品久久久| 日韩视频一二区| 国产一区第一页| 91成人午夜| 欧美视频在线免费看| 亚洲欧美丝袜| 日本韩国免费观看| 日韩二区在线观看| 精品中文字幕视频| 日本xxxx裸体xxxx| 成人免费观看49www在线观看| 亚洲二区视频在线| 午夜精品一区二区在线观看的 | 春暖花开亚洲一区二区三区| 成人免费一区二区三区视频 | 99久久www免费| 亚洲电影第1页| 亚洲一区日韩精品| sm捆绑调教国产免费网站在线观看 | 亚洲最大的免费| 国产一级免费视频| 欧美精品18| 中文字幕久久久av一区| 男人网站在线观看| 国产一区二区高清在线| 欧美午夜电影在线| 免费人成在线观看视频播放| 69av亚洲| 久久久久久麻豆| 岛国一区二区三区高清视频| 影音先锋国产在线| 久久福利精品| 久久久久五月天| 午夜爽爽爽男女免费观看| 国产精品欧美在线观看| 亚洲第一av网| 少妇伦子伦精品无吗| www.久久草.com| 欧美色视频一区| 干日本少妇首页| 国产不卡123| 亚洲国产精品久久一线不卡| 免费观看国产视频在线| 一区二区三区视频在线观看视频| 国产欧美日韩一区二区三区在线观看| 黑人中文字幕一区二区三区| 亚洲av无码乱码在线观看性色| 国内不卡的二区三区中文字幕| 国产精品十八以下禁看| 日本成人一级片| 人禽交欧美网站| 国产精品高潮粉嫩av| 国产美女www爽爽爽| 日韩av午夜在线观看| 国产精品av在线播放| 日本视频在线观看免费| 国产亚洲精品v| 91av成人在线| 中文字幕一区在线播放| 蘑菇福利视频一区播放| 日本精品中文字幕| 探花国产精品一区二区| 另类小说一区二区三区| 成人黄色在线免费| 国产福利第一页| 大陆成人av片| 久久久一本精品99久久精品| 男操女在线观看| 国产婷婷色一区二区三区在线| 日韩三级电影| 久操视频在线观看| 亚洲免费在线视频| 我的公把我弄高潮了视频| 欧美一级鲁丝片| 在线看日韩精品电影| 亚洲 欧美 另类人妖| 91成人福利社区| 日韩精品一区二区三区四区| 国产a√精品区二区三区四区| julia中文字幕一区二区99在线| 亚洲第一福利在线观看| 国产熟妇搡bbbb搡bbbb| 欧美色图国产精品| 久久中国妇女中文字幕| 国产一卡二卡在线| 日韩中文字幕麻豆| 亚洲mm色国产网站| 婷婷在线免费视频| 国产清纯在线一区二区www| 综合视频免费看| 538在线观看| 欧美亚洲综合网| 五月天婷婷在线观看视频| 国产 日韩 欧美 综合 一区| 亚洲美女免费精品视频在线观看| jizz日本在线播放| 国产综合网站| 国产精品国产亚洲伊人久久| 亚洲av无码乱码国产麻豆| 国产视频一区二区在线观看| 男女爱爱视频网站| 麻豆视频在线观看免费网站黄| 欧美三级一区二区| 亚洲激情 欧美| 91亚洲国产高清| 911国产网站尤物在线观看| 国产精品日韩无码| 久久精品视频网| 日产精品久久久久久久蜜臀| 123成人网| 精品久久久久久久人人人人传媒 | 在线成人精品视频| 国产亚洲一区二区三区不卡| 欧美精品18videos性欧| 在线观看中文字幕2021| 91在线视频网址| 男同互操gay射视频在线看| 日韩精品影片| 亚洲精品久久久久中文字幕欢迎你| 精品国产大片大片大片| 久久都是精品| 精品在线视频一区二区三区| av免费网站在线| 欧美图区在线视频| 超碰97人人干| 亚洲精品社区| 动漫一区二区在线| 91精品久久久久久粉嫩| 欧美日本在线一区| 成年人在线免费看片| 国产日韩欧美一区在线| 国产精品久久久久久久久久直播 | 成人综合网网址| av午夜在线| 色综合一个色综合| 国产国语性生话播放| 亚洲高清成人| 国产精品成人一区二区三区| 四虎亚洲成人| 日韩欧美中文字幕公布| www深夜成人a√在线| 美女看a上一区| 婷婷久久伊人| 久久亚洲国产精品尤物| 伊人青青综合网站| 国产又粗又猛又爽又| 久久精品人人做人人爽97 | 久久成人羞羞网站| 亚洲电影网站| 外国成人毛片| 久久伊人精品一区二区三区| 国产精品视频在线观看免费| 国产精品国产自产拍在线| 黄色片视频在线| 欧美a级成人淫片免费看| 国产欧美日韩免费看aⅴ视频| 午夜在线观看视频| 欧美一区二区久久久| 久久中文字幕无码| 99视频热这里只有精品免费| 丰满爆乳一区二区三区| 亚洲欧洲美洲国产香蕉| 国产成人一区二区三区小说| av资源网站在线观看| 欧美日韩国产成人在线免费| 欧美视频www| 成人午夜大片免费观看| 午夜精品久久久久久久无码| 亚洲天堂日韩在线| 国产精品亚洲第一区| 快射av在线播放一区| 日韩一二三区视频| 日本中文字幕网| 久久综合国产精品| 天天爽夜夜爽一区二区三区| 欧美成人日韩| 久久久久久久久四区三区| 精品无人乱码一区二区三区 | 欧美××××黑人××性爽| 中文字幕在线日韩| 国产激情久久久久久熟女老人av| 五月天视频一区| 色屁屁草草影院ccyy.com| 精品一区二区免费看| 日韩xxxx视频| 成人精品久久| 99国产盗摄| 欧美精品总汇| 欧美日韩国产成人| 国产毛片av在线| 欧美成人猛片aaaaaaa| 亚洲欧美偷拍一区| 一区二区三区在线观看欧美| 日本少妇色视频| 久久91精品国产91久久小草| 国产a级片网站| 久久视频在线| 免费亚洲精品视频| 日本免费一区二区三区视频| 国产精品成人一区二区| 丁香花在线电影| 日韩中文字幕国产| 在线观看xxx| 欧美一级片在线看| 黄色污污网站在线观看| 亚洲综合色视频| 成人免费视频入口| 99久久久久久| 亚洲热在线视频| 日本欧美一区二区在线观看| 成人毛片一区二区| 欧美福利影院| 亚洲一卡二卡三卡四卡无卡网站在线看| 99这里只有精品视频| 国产一区私人高清影院| 欧美艳星kaydenkross| 久久久中文字幕| gogo在线高清视频| 中日韩美女免费视频网站在线观看| 欧美熟女一区二区| 欧美一区二区不卡视频| 影音先锋黄色网址| 在线日韩一区二区| 国产原创视频在线| 亚洲国产一二三| 色在线观看视频| 国产精品久久久久一区二区三区| 在线免费观看成年人视频| 高清国产一区二区| 亚洲综合在线一区二区| 久久成人免费网| 国产九九热视频| 日本视频中文字幕一区二区三区| 男女高潮又爽又黄又无遮挡| 亚洲毛片在线| 青青草成人免费在线视频| 国一区二区在线观看| 日韩精品一区二区三区四| 在线精品国产| 欧洲金发美女大战黑人| 欧美国产日本| 日本成人在线不卡| 欧美人与禽猛交乱配视频| 裸体大乳女做爰69| 欧美1区2区| av 日韩 人妻 黑人 综合 无码| 91精品国产福利在线观看麻豆| 亚洲午夜精品久久久中文影院av| 色天天久久综合婷婷女18| 亚洲精品成人久久久998| 日韩高清欧美| 一区二区日本| 国产韩日影视精品| 久久最新免费视频| 欧美另类专区| 你真棒插曲来救救我在线观看| 一区二区激情| 日本新janpanese乱熟| 免费av成人在线| 97人人爽人人| 国产成人三级在线观看| 男人女人拔萝卜视频| 成人丝袜18视频在线观看| 手机免费看av片| 久久久综合九色合综国产精品| 欧美 日韩 国产 成人 在线观看| 日本一区二区视频在线| 久久国产波多野结衣| 亚洲一区二区三区视频在线 | 欧美精品少妇一区二区三区| 国产日韩免费视频| 亚洲成人aaa| 国产小视频在线观看| 久久精品国产亚洲7777| 青草av在线| 热久久这里只有| 日韩一区二区三区四区五区| 成人免费视频网站| 久9久9色综合| 免费成人深夜夜行网站视频| 日韩视频一区| 一区二区三区网址| 国产成人精品免费看| 香蕉网在线播放| 综合在线观看色| 日本熟女一区二区| 欧美色精品天天在线观看视频| 国产ts人妖调教重口男| 亚洲欧美中文字幕在线一区| 黄网站免费在线播放| 午夜欧美不卡精品aaaaa| av亚洲一区| 国产在线一区二区三区四区| 色喇叭免费久久综合网| 黄色一级在线视频| 国产自产v一区二区三区c| 亚洲国产精品无码久久久久高潮| 国产精品久久网站| 日韩成人在线免费视频| 欧美乱妇15p| 青青草在线免费视频| 美女少妇精品视频| 成人看片在线观看| 国产精品亚洲综合| 欧美激情成人| 国产黄色特级片| 成人性色生活片免费看爆迷你毛片| 国产123在线| 婷婷丁香激情综合| va视频在线观看| 中文字幕综合在线| 欧美日韩国产观看视频| 不卡视频一区二区| 99精品电影| 五月天婷婷激情视频| av亚洲精华国产精华精| 亚洲国产精品免费在线观看| 欧美体内she精视频| 午夜视频福利在线| 久久久久久久久国产| 国产精品日韩精品在线播放 | 日本不卡视频| 国产成人精品优优av| 女仆av观看一区| 无码人妻精品一区二区蜜桃网站| 麻豆久久久久久久| 四虎国产精品成人免费入口| 欧美日韩国产在线看| 日本国产在线观看| 欧美激情三级免费| 日韩一区免费| 国产日韩第一页| 寂寞少妇一区二区三区| 日本黄区免费视频观看 | 亚洲AV无码精品自拍| 麻豆乱码国产一区二区三区| 久久伊人国产| 亚洲一区3d动漫同人无遮挡 | 亚洲高清在线| 亚洲精品久久一区二区三区777| 亚洲精品成人精品456| 99视频在线观看免费| 美女国内精品自产拍在线播放| 一级欧美视频| 异国色恋浪漫潭| 国产一区二区在线影院| 欧美手机在线观看| 69久久夜色精品国产69蝌蚪网 | 性色av一区二区三区红粉影视| 一区二区精彩视频| 久久在线中文字幕| av资源站一区| 视频一区二区三区四区五区| 日韩精品www| 成人午夜精品| 亚洲午夜在线观看| 国产精品99久久久久久有的能看 | 欧美日韩免费| 天天躁日日躁狠狠躁av| 天天综合色天天综合色h| 青青草免费观看免费视频在线| 热久久免费国产视频| 日本黄色精品| 精品亚洲视频在线| 亚洲综合色区另类av| 婷婷丁香花五月天| 国产精品老牛影院在线观看| 亚洲精品一二三区区别| 麻豆短视频在线观看| 大荫蒂欧美视频另类xxxx| 国内精品在线视频| 成人精品一区二区三区电影黑人| 欧美国产91| 中文字幕免费看| 欧美美女bb生活片| 国产精品13p| 亚洲第一导航| 粉嫩绯色av一区二区在线观看 | 久久久久久久麻豆| 精品精品国产高清a毛片牛牛| 在线看片国产福利你懂的| 五月天国产一区| 丰满少妇久久久久久久| 欧美一级片免费在线观看| 精品国内自产拍在线观看| 成人av地址| 一本岛在线视频| 亚洲一区在线看| 成人在线二区| 国产伦精品一区二区三区高清| 丝袜亚洲精品中文字幕一区| 国精品无码一区二区三区| 日韩精品免费在线视频观看| 四虎国产精品免费久久5151| a级黄色小视频| 国产精品久久久久永久免费观看 | 久久夜色精品国产欧美乱极品| 最近中文字幕在线观看视频| 久久久综合av|