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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

系统进程启动流程分析(一)

發(fā)布時(shí)間:2024/1/8 windows 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 系统进程启动流程分析(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android啟動(dòng)概覽
眾所周知,Android是谷歌開(kāi)發(fā)的一款基于Linux的開(kāi)源操作系統(tǒng),下圖所示為 Android 平臺(tái)的主要組件

1. Linux 內(nèi)核
Android 平臺(tái)的基礎(chǔ)是 Linux 內(nèi)核。例如,Android Runtime (ART) 依靠 Linux 內(nèi)核來(lái)執(zhí)行底層功

能,例如線(xiàn)程和低層內(nèi)存管理。
使用 Linux 內(nèi)核可讓 Android 利用主要安全功能,并且允許設(shè)備制造商為著名的內(nèi)核開(kāi)發(fā)硬件驅(qū)動(dòng)程
序。
2. 硬件抽象層 (HAL)
硬件抽象層 (HAL) 提供標(biāo)準(zhǔn)界面,向更高級(jí)別的 Java API 框架顯示設(shè)備硬件功能。HAL 包含多個(gè)
庫(kù)模塊,其中每個(gè)模塊都為特定類(lèi)型的硬件組件實(shí)現(xiàn)一個(gè)界面,例如相機(jī)或藍(lán)牙模塊。當(dāng)框架 API
要求訪(fǎng)問(wèn)設(shè)備硬件時(shí),Android 系統(tǒng)將為該硬件組件加載庫(kù)模塊。
3. Android Runtime
對(duì)于運(yùn)行 Android 5.0(API 級(jí)別 21)或更高版本的設(shè)備,每個(gè)應(yīng)用都在其自己的進(jìn)程中運(yùn)行,并
且有其自己的 Android Runtime (ART) 實(shí)例。ART 編寫(xiě)為通過(guò)執(zhí)行 DEX 文件在低內(nèi)存設(shè)備上運(yùn)行
多個(gè)虛擬機(jī),DEX 文件是一種專(zhuān)為 Android 設(shè)計(jì)的字節(jié)碼格式,經(jīng)過(guò)優(yōu)化,使用的內(nèi)存很少。編
譯工具鏈(例如 Jack)將 Java 源代碼編譯為 DEX 字節(jié)碼,使其可在 Android 平臺(tái)上運(yùn)行。
ART 的部分主要功能包括:
預(yù)先 (AOT) 和即時(shí) (JIT) 編譯
優(yōu)化的垃圾回收 (GC)
在 Android 9(API 級(jí)別 28)及更高版本的系統(tǒng)中,支持將應(yīng)用軟件包中的 Dalvik Executable 格
式 (DEX) 文件轉(zhuǎn)換為更緊湊的機(jī)器代碼。
更好的調(diào)試支持,包括專(zhuān)用采樣分析器、詳細(xì)的診斷異常和崩潰報(bào)告,并且能夠設(shè)置觀察點(diǎn)以監(jiān)控
特定字段
在 Android 版本 5.0(API 級(jí)別 21)之前,Dalvik 是 Android Runtime。如果您的應(yīng)用在 ART 上
運(yùn)行效果很好,那么它應(yīng)該也可在 Dalvik 上運(yùn)行,但反過(guò)來(lái)不一定。
Android 還包含一套核心運(yùn)行時(shí)庫(kù),可提供 Java API 框架所使用的 Java 編程語(yǔ)言中的大部分功能,包括
一些 Java 8 語(yǔ)言功能。
4. 原生 C/C++ 庫(kù)
許多核心 Android 系統(tǒng)組件和服務(wù)(例如 ART 和 HAL)構(gòu)建自原生代碼,需要以 C 和 C++ 編寫(xiě)的
原生庫(kù)。Android 平臺(tái)提供 Java 框架 API 以向應(yīng)用顯示其中部分原生庫(kù)的功能。例如,您可以通
過(guò) Android 框架的 Java OpenGL API 訪(fǎng)問(wèn) OpenGL ES,以支持在應(yīng)用中繪制和操作 2D 和 3D 圖形。
如果開(kāi)發(fā)的是需要 C 或 C++ 代碼的應(yīng)用,可以使用 Android NDK 直接從原生代碼訪(fǎng)問(wèn)某些原生平臺(tái)庫(kù)。

5. Java API 框架
您可通過(guò)以 Java 語(yǔ)言編寫(xiě)的 API 使用 Android OS 的整個(gè)功能集。這些 API 形成創(chuàng)建 Android 應(yīng)
用所需的構(gòu)建塊,它們可簡(jiǎn)化核心模塊化系統(tǒng)組件和服務(wù)的重復(fù)使用,包括以下組件和服務(wù):
豐富、可擴(kuò)展的視圖系統(tǒng),可用以構(gòu)建應(yīng)用的 UI,包括列表、網(wǎng)格、文本框、按鈕甚至可嵌入的網(wǎng)
絡(luò)瀏覽器
資源管理器,用于訪(fǎng)問(wèn)非代碼資源,例如本地化的字符串、圖形和布局文件
通知管理器,可讓所有應(yīng)用在狀態(tài)欄中顯示自定義提醒
Activity 管理器,用于管理應(yīng)用的生命周期,提供常見(jiàn)的導(dǎo)航返回棧
內(nèi)容提供程序,可讓?xiě)?yīng)用訪(fǎng)問(wèn)其他應(yīng)用(例如“聯(lián)系人”應(yīng)用)中的數(shù)據(jù)或者共享其自己的數(shù)據(jù)
開(kāi)發(fā)者可以完全訪(fǎng)問(wèn) Android 系統(tǒng)應(yīng)用使用的框架 API。
6. 系統(tǒng)應(yīng)用
Android 隨附一套用于電子郵件、短信、日歷、互聯(lián)網(wǎng)瀏覽和聯(lián)系人等的核心應(yīng)用。平臺(tái)隨附的應(yīng)
用與用戶(hù)可以選擇安裝的應(yīng)用一樣,沒(méi)有特殊狀態(tài)。因此第三方應(yīng)用可成為用戶(hù)的默認(rèn)網(wǎng)絡(luò)瀏覽
器、短信 Messenger 甚至默認(rèn)鍵盤(pán)(有一些例外,例如系統(tǒng)的“設(shè)置”應(yīng)用)。
系統(tǒng)應(yīng)用可用作用戶(hù)的應(yīng)用,以及提供開(kāi)發(fā)者可從其自己的應(yīng)用訪(fǎng)問(wèn)的主要功能。例如,如果您的應(yīng)用
要發(fā)短信,您無(wú)需自己構(gòu)建該功能,可以改為調(diào)用已安裝的短信應(yīng)用向您指定的接收者發(fā)送消息。

接下來(lái),我們來(lái)看下Android系統(tǒng)啟動(dòng)的大概流程,如下圖所示:

第一步: 啟動(dòng)電源以及系統(tǒng)啟動(dòng)

當(dāng)電源按下,引導(dǎo)芯片代碼開(kāi)始從預(yù)定義的地方(固化在ROM)開(kāi)始執(zhí)行。加載引導(dǎo)程序到RAM,然后
執(zhí)行

第二步:引導(dǎo)程序
引導(dǎo)程序是在Android操作系統(tǒng)開(kāi)始運(yùn)行前的一個(gè)小程序。引導(dǎo)程序是運(yùn)行的第一個(gè)程序,因此它是針
對(duì)特定的主板與芯片的。設(shè)備制造商要么使用很受歡迎的引導(dǎo)程序比如redboot、uboot、qi
bootloader或者開(kāi)發(fā)自己的引導(dǎo)程序,它不是Android操作系統(tǒng)的一部分。引導(dǎo)程序是OEM廠(chǎng)商或者運(yùn)
營(yíng)商加鎖和限制的地方。
引導(dǎo)程序分兩個(gè)階段執(zhí)行。
第一個(gè)階段,檢測(cè)外部的RAM以及加載對(duì)第二階段有用的程序;
第二階段,引導(dǎo)程序設(shè)置網(wǎng)絡(luò)、內(nèi)存等等。這些對(duì)于運(yùn)行內(nèi)核是必要的,為了達(dá)到特殊的目標(biāo),引導(dǎo)程
序可以根據(jù)配置參數(shù)或者輸入數(shù)據(jù)設(shè)置內(nèi)核。
Android引導(dǎo)程序可以在\bootable\bootloader\legacy\usbloader找到。傳統(tǒng)的加載器包含兩個(gè)文件,
需要在這里說(shuō)明:
init.s初始化堆棧,清零BBS段,調(diào)用main.c的_main()函數(shù);
main.c初始化硬件(鬧鐘、主板、鍵盤(pán)、控制臺(tái)),創(chuàng)建linux標(biāo)簽

第三步:內(nèi)核

Android內(nèi)核與桌面linux內(nèi)核啟動(dòng)的方式差不多。內(nèi)核啟動(dòng)時(shí),設(shè)置緩存、被保護(hù)存儲(chǔ)器、計(jì)劃列表,
加載驅(qū)動(dòng)。當(dāng)內(nèi)核完成系統(tǒng)設(shè)置,它首先在系統(tǒng)文件中尋找”init”文件,然后啟動(dòng)root進(jìn)程或者系統(tǒng)的第
一個(gè)進(jìn)程
第四步:init進(jìn)程
init進(jìn)程是Linux系統(tǒng)中用戶(hù)空間的第一個(gè)進(jìn)程,進(jìn)程號(hào)固定為1。Kernel啟動(dòng)后,在用戶(hù)空間啟動(dòng)init進(jìn)
程,并調(diào)用init中的main()方法執(zhí)行init進(jìn)程的職責(zé)。
第五步:啟動(dòng)Lancher App

init進(jìn)程分析
其中init進(jìn)程是Android系統(tǒng)中及其重要的第一個(gè)進(jìn)程,接下來(lái)我們來(lái)看下init進(jìn)程注意做了些什么
1. 創(chuàng)建和掛載啟動(dòng)所需要的文件目錄
2. 初始化和啟動(dòng)屬性服務(wù)
3. 解析init.rc配置文件并啟動(dòng)Zygote進(jìn)程

// \system\core\init\init.cpp main() L545 /* * 1.C++中主函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)argc表示參數(shù)個(gè)數(shù),第二個(gè)參數(shù)是參數(shù)列表,也就是具體 的參數(shù) * 2.init的main函數(shù)有兩個(gè)其它入口,一是參數(shù)中有ueventd,進(jìn)入ueventd_main,二是參數(shù)中 有watchdogd,進(jìn)入watchdogd_main */ int main(int argc, char** argv) { /** 1.strcmp是String的一個(gè)函數(shù),比較字符串,相等返回0* 2.C++中0也可以表示false* 3.basename是C庫(kù)中的一個(gè)函數(shù),得到特定的路徑中的最后一個(gè)'/'后面的內(nèi)容,* 比如/sdcard/miui_recovery/backup,得到的結(jié)果是backup*/if (!strcmp(basename(argv[0]), "ueventd")) {//當(dāng)argv[0]的內(nèi)容為ueventd 時(shí),strcmp的值為0,!strcmp為1 //1表示true,也就執(zhí)行ueventd_main,ueventd主要是負(fù)責(zé)設(shè)備節(jié)點(diǎn)的創(chuàng)建、權(quán)限設(shè)定等一 些列工作return ueventd_main(argc, argv);}if (!strcmp(basename(argv[0]), "watchdogd")) {//watchdogd俗稱(chēng)看門(mén)狗,用于 系統(tǒng)出問(wèn)題時(shí)重啟系統(tǒng)return watchdogd_main(argc, argv);}if (argc > 1 && !strcmp(argv[1], "subcontext")) {InitKernelLogging(argv);const BuiltinFunctionMap function_map;return SubcontextMain(argc, argv, &function_map);}if (REBOOT_BOOTLOADER_ON_PANIC) {InstallRebootSignalHandlers();//初始化重啟系統(tǒng)的處理信號(hào),內(nèi)部通過(guò) sigaction 注冊(cè)信號(hào),當(dāng)監(jiān)聽(tīng)到該信號(hào)時(shí)重啟系統(tǒng)}bool is_first_stage = (getenv("INIT_SECOND_STAGE") == nullptr);//查看是 否有環(huán)境變量INIT_SECOND_STAGE/** 1.init的main方法會(huì)執(zhí)行兩次,由is_first_stage控制,first_stage就是第一階段要 做的事*/if (is_first_stage) {boot_clock::time_point start_time = boot_clock::now();// Clear the umask.umask(0);//清空文件權(quán)限clearenv();setenv("PATH", _PATH_DEFPATH, 1);// Get the basic filesystem setup we need put together in the initramdisk// on / and then we'll let the rc file figure out the rest. //mount是用來(lái)掛載文件系統(tǒng)的,mount屬于Linux系統(tǒng)調(diào)用mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");mkdir("/dev/pts", 0755);//創(chuàng)建目錄,第一個(gè)參數(shù)是目錄路徑,第二個(gè)是讀寫(xiě)權(quán)限mkdir("/dev/socket", 0755);mount("devpts", "/dev/pts", "devpts", 0, NULL);#define MAKE_STR(x) __STRING(x)mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC));// Don't expose the raw commandline to unprivileged processes.chmod("/proc/cmdline", 0440);//用于修改文件/目錄的讀寫(xiě)權(quán)限gid_t groups[] = { AID_READPROC };setgroups(arraysize(groups), groups);// 用來(lái)將list 數(shù)組中所標(biāo)明的組加入 到目前進(jìn)程的組設(shè)置中mount("sysfs", "/sys", "sysfs", 0, NULL);mount("selinuxfs", "/sys/fs/selinux", "selinuxfs", 0, NULL); //mknod用于創(chuàng)建Linux中的設(shè)備文件mknod("/dev/kmsg", S_IFCHR | 0600, makedev(1, 11));if constexpr (WORLD_WRITABLE_KMSG) {mknod("/dev/kmsg_debug", S_IFCHR | 0622, makedev(1, 11));}mknod("/dev/random", S_IFCHR | 0666, makedev(1, 8));mknod("/dev/urandom", S_IFCHR | 0666, makedev(1, 9));// Mount staging areas for devices managed by vold// See storage config details at http://source.android.com/devices/storage/mount("tmpfs", "/mnt", "tmpfs", MS_NOEXEC | MS_NOSUID | MS_NODEV,"mode=0755,uid=0,gid=1000");// /mnt/vendor is used to mount vendor-specific partitions that can not be// part of the vendor partition, e.g. because they are mounted read-write.mkdir("/mnt/vendor", 0755);// Now that tmpfs is mounted on /dev and we have /dev/kmsg, we can actually// talk to the outside world...InitKernelLogging(argv);//將標(biāo)準(zhǔn)輸入輸出重定向到"/sys/fs/selinux/null"LOG(INFO) << "init first stage started!";if (!DoFirstStageMount()) {LOG(FATAL) << "Failed to mount required partitions early ...";}//Avb即Android Verfied boot,功能包括Secure Boot, verfying boot 和 dm- verity,//原理都是對(duì)二進(jìn)制文件進(jìn)行簽名,在系統(tǒng)啟動(dòng)時(shí)進(jìn)行認(rèn)證,確保系統(tǒng)運(yùn)行的是合法的二進(jìn) 制鏡像文件。//其中認(rèn)證的范圍涵蓋:bootloader,boot.img,system.imgSetInitAvbVersionInRecovery();//在刷機(jī)模式下初始化avb的版本,不是刷機(jī)模式 直接跳過(guò)// Enable seccomp if global boot option was passed (otherwise it is enabled in zygote).global_seccomp();// Set up SELinux, loading the SELinux policy.SelinuxSetupKernelLogging();SelinuxInitialize();//加載SELinux policy,也就是安全策略,// We're in the kernel domain, so re-exec init to transition to the init domain now// that the SELinux policy has been loaded. /** 1.這句英文大概意思是,我們執(zhí)行第一遍時(shí)是在kernel domain,所以要重新執(zhí)行 init文件,切換到init domain,* 這樣SELinux policy才已經(jīng)加載進(jìn)來(lái)了* 2.后面的security_failure函數(shù)會(huì)調(diào)用panic重啟系統(tǒng)*/if (selinux_android_restorecon("/init", 0) == -1) {PLOG(FATAL) << "restorecon failed of /init failed";}setenv("INIT_SECOND_STAGE", "true", 1);static constexpr uint32_t kNanosecondsPerMillisecond = 1e6;uint64_t start_ms = start_time.time_since_epoch().count() / kNanosecondsPerMillisecond;setenv("INIT_STARTED_AT", std::to_string(start_ms).c_str(), 1);char* path = argv[0];char* args[] = { path, nullptr };execv(path, args);//重新執(zhí)行main方法,進(jìn)入第二階段// execv() only returns if an error happened, in which case we// panic and never fall through this conditional.PLOG(FATAL) << "execv(\"" << path << "\") failed";}// At this point we're in the second stage of init.InitKernelLogging(argv);LOG(INFO) << "init second stage started!";// Set up a session keyring that all processes will have access to. It// will hold things like FBE encryption keys. No process should override// its session keyring.keyctl_get_keyring_ID(KEY_SPEC_SESSION_KEYRING, 1);// Indicate that booting is in progress to background fw loaders, etc.close(open("/dev/.booting", O_WRONLY | O_CREAT | O_CLOEXEC, 0000));property_init();//初始化屬性系統(tǒng),并從指定文件讀取屬性// If arguments are passed both on the command line and in DT,// properties set in DT always have priority over the command-line ones. //接下來(lái)的一系列操作都是從各個(gè)文件讀取一些屬性,然后通過(guò)property_set設(shè)置系統(tǒng)屬性// If arguments are passed both on the command line and in DT,// properties set in DT always have priority over the command-line ones./** 1.這句英文的大概意思是,如果參數(shù)同時(shí)從命令行和DT傳過(guò)來(lái),DT的優(yōu)先級(jí)總是大于命令行 的* 2.DT即device-tree,中文意思是設(shè)備樹(shù),這里面記錄自己的硬件配置和系統(tǒng)運(yùn)行參數(shù),參 考http://www.wowotech.net/linux_kenrel/why-dt.html*/process_kernel_dt();//處理DT屬性process_kernel_cmdline();//處理命令行屬性// Propagate the kernel variables to internal variables// used by init as well as the current required properties.export_kernel_boot_props();//處理其他的一些屬性// Make the time that init started available for bootstat to log.property_set("ro.boottime.init", getenv("INIT_STARTED_AT"));property_set("ro.boottime.init.selinux", getenv("INIT_SELINUX_TOOK"));// Set libavb version for Framework-only OTA match in Treble build.const char* avb_version = getenv("INIT_AVB_VERSION");if (avb_version) property_set("ro.boot.avb_version", avb_version);// Clean up our environment.unsetenv("INIT_SECOND_STAGE");//清空這些環(huán)境變量,因?yàn)橹岸家呀?jīng)存入到系統(tǒng)屬性 中去了unsetenv("INIT_STARTED_AT");unsetenv("INIT_SELINUX_TOOK");unsetenv("INIT_AVB_VERSION");// Now set up SELinux for second stage.SelinuxSetupKernelLogging();SelabelInitialize();SelinuxRestoreContext();epoll_fd = epoll_create1(EPOLL_CLOEXEC);//創(chuàng)建epoll實(shí)例,并返回epoll的文件 描述符if (epoll_fd == -1) {PLOG(FATAL) << "epoll_create1 failed";}sigchld_handler_init();//主要是創(chuàng)建handler處理子進(jìn)程終止信號(hào),創(chuàng)建一個(gè)匿名 socket并注冊(cè)到epoll進(jìn)行監(jiān)聽(tīng)if (!IsRebootCapable()) {// If init does not have the CAP_SYS_BOOT capability, it is running in a container.// In that case, receiving SIGTERM will cause the system to shut down.InstallSigtermHandler();}property_load_boot_defaults();//從文件中加載一些屬性,讀取usb配置export_oem_lock_status();//設(shè)置ro.boot.flash.locked 屬性start_property_service();//開(kāi)啟一個(gè)socket監(jiān)聽(tīng)系統(tǒng)屬性的設(shè)置set_usb_controller();//設(shè)置sys.usb.controller 屬性const BuiltinFunctionMap function_map;//方法映射 “class_start”-> "do_class_start" /** 1.C++中::表示靜態(tài)方法調(diào)用,相當(dāng)于java中static的方法*/Action::set_function_map(&function_map);//將function_map存放到Action中作 為成員屬性subcontexts = InitializeSubcontexts();ActionManager& am = ActionManager::GetInstance();ServiceList& sm = ServiceList::GetInstance();LoadBootScripts(am, sm);//解析xxx.rc// Turning this on and letting the INFO logging be discarded adds 0.2s to// Nexus 9 boot time, so it's disabled by default.if (false) DumpState();//打印一些當(dāng)前Parser的信息,默認(rèn)是不執(zhí)行的am.QueueEventTrigger("early-init");//QueueEventTrigger用于觸發(fā)Action,這里 觸發(fā) early-init事件// Queue an action that waits for coldboot done so we know ueventd has set up all of /dev...am.QueueBuiltinAction(wait_for_coldboot_done_action, "wait_for_coldboot_done");//QueueBuiltinAction用于添加Action,第一個(gè)參數(shù)是 Action要執(zhí)行的Command,第二個(gè)是Trigger// ... so that we can start queuing up actions that require stuff from /dev.am.QueueBuiltinAction(MixHwrngIntoLinuxRngAction, "MixHwrngIntoLinuxRng");am.QueueBuiltinAction(SetMmapRndBitsAction, "SetMmapRndBits");am.QueueBuiltinAction(SetKptrRestrictAction, "SetKptrRestrict");am.QueueBuiltinAction(keychord_init_action, "keychord_init");am.QueueBuiltinAction(console_init_action, "console_init");// Trigger all the boot actions to get us started.am.QueueEventTrigger("init");// Repeat mix_hwrng_into_linux_rng in case /dev/hw_random or /dev/random// wasn't ready immediately after wait_for_coldboot_doneam.QueueBuiltinAction(MixHwrngIntoLinuxRngAction, "MixHwrngIntoLinuxRng");// Don't mount filesystems or start core system services in charger mode.std::string bootmode = GetProperty("ro.bootmode", "");if (bootmode == "charger") {am.QueueEventTrigger("charger");} else {am.QueueEventTrigger("late-init");}// Run all property triggers based on current state of the properties.am.QueueBuiltinAction(queue_property_triggers_action, "queue_property_triggers");while (true) {// By default, sleep until something happens.int epoll_timeout_ms = -1; //epoll超時(shí)時(shí)間,相當(dāng)于阻塞時(shí)間if (do_shutdown && !shutting_down) {do_shutdown = false;if (HandlePowerctlMessage(shutdown_command)) {shutting_down = true;}}if (!(waiting_for_prop || Service::is_exec_service_running())) {am.ExecuteOneCommand();//執(zhí)行一個(gè)command} /** 1.waiting_for_prop和IsWaitingForExec都是判斷一個(gè)Timer為不為空,相當(dāng) 于一個(gè)標(biāo)志位* 2.waiting_for_prop負(fù)責(zé)屬性設(shè)置,IsWaitingForExe負(fù)責(zé)service運(yùn)行* 3.當(dāng)有屬性設(shè)置或Service開(kāi)始運(yùn)行時(shí),這兩個(gè)值就不為空,直到執(zhí)行完畢才置為空* 4.其實(shí)這兩個(gè)判斷條件主要作用就是保證屬性設(shè)置和service啟動(dòng)的完整性,也可以 說(shuō)是為了同步*/if (!(waiting_for_prop || Service::is_exec_service_running())) {if (!shutting_down) {auto next_process_restart_time = RestartProcesses();//重啟服 務(wù)// If there's a process that needs restarting, wake up in time for that.if (next_process_restart_time) {epoll_timeout_ms = std::chrono::ceil<std::chrono::milliseconds>(*next_process_restart_time - boot_clock::now()).count();if (epoll_timeout_ms < 0) epoll_timeout_ms = 0;}}// If there's more work to do, wake up again immediately.if (am.HasMoreCommands()) epoll_timeout_ms = 0;//當(dāng)還有命令要執(zhí)行 時(shí),將epoll_timeout_ms設(shè)置為0}epoll_event ev; /** 1.epoll_wait與epoll_create1、epoll_ctl是一起使用的* 2.epoll_create1用于創(chuàng)建epoll的文件描述符,epoll_ctl、epoll_wait都把它 創(chuàng)建的fd作為第一個(gè)參數(shù)傳入* 3.epoll_ctl用于操作epoll,EPOLL_CTL_ADD:注冊(cè)新的fd到epfd中, EPOLL_CTL_MOD:修改已經(jīng)注冊(cè)的fd的監(jiān)聽(tīng)事件,EPOLL_CTL_DEL:從epfd中刪除一個(gè)fd;* 4.epoll_wait用于等待事件的產(chǎn)生,epoll_ctl調(diào)用EPOLL_CTL_ADD時(shí)會(huì)傳入需要 監(jiān)聽(tīng)什么類(lèi)型的事件,* ?比如EPOLLIN表示監(jiān)聽(tīng)fd可讀,當(dāng)該fd有可讀的數(shù)據(jù)時(shí),調(diào)用epoll_wait經(jīng)過(guò) epoll_timeout_ms時(shí)間就會(huì)把該事件的信息返回給&ev*/int nr = TEMP_FAILURE_RETRY(epoll_wait(epoll_fd, &ev, 1, epoll_timeout_ms));if (nr == -1) {PLOG(ERROR) << "epoll_wait failed";} else if (nr == 1) {((void (*)()) ev.data.ptr)();//當(dāng)有event返回時(shí),取出 ev.data.ptr(之前epoll_ctl注冊(cè)時(shí)的回調(diào)函數(shù)),直接執(zhí)行 //在signal_handler_init和start_property_service有注冊(cè)兩個(gè)fd的監(jiān) 聽(tīng),一個(gè)用于監(jiān)聽(tīng)SIGCHLD(子進(jìn)程結(jié)束信號(hào)),一個(gè)用于監(jiān)聽(tīng)屬性設(shè)置}}return 0; }

init.rc解析
init.rc是一個(gè)非常重要的配置文件,它是由Android初始化語(yǔ)言(Android Init Language)編寫(xiě)的腳
本,它主要包含五種類(lèi)型語(yǔ)句:Action(Action中包含了一系列的Command)、Commands(init語(yǔ)言
中的命令)、Services(由init進(jìn)程啟動(dòng)的服務(wù))、Options(對(duì)服務(wù)進(jìn)行配置的選項(xiàng))和Import(引入
其他配置文件)。init.rc的配置代碼如下所示。

# \system\core\rootdir\init.rc on init # L41sysclktz 0# Mix device-specific information into the entropy poolcopy /proc/cmdline /dev/urandomcopy /default.prop /dev/urandom... on <trigger> [&& <trigger>]* //設(shè)置觸發(fā)器<command><command> //動(dòng)作觸發(fā)之后要執(zhí)行的命令service <name> <pathname> [ <argument> ]* //<service的名字><執(zhí)行程序路徑><傳遞參 數(shù)><option> //Options是Services的參數(shù)配置. 它們影響Service如何運(yùn)行及運(yùn)行時(shí)機(jī)group <groupname> [ <groupname>\* ] //在啟動(dòng)Service前將group改為第一個(gè) groupname,第一個(gè)groupname是必須有的,//默認(rèn)值為root(或許默認(rèn)值是無(wú)),第二個(gè)groupname可以不設(shè)置,用于追加組(通過(guò) setgroups)priority <priority> //設(shè)置進(jìn)程優(yōu)先級(jí). 在-20~19之間,默認(rèn)值是0,能過(guò) setpriority實(shí)現(xiàn)socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]//創(chuàng)建 一個(gè)unix域的socket,名字叫/dev/socket/name , 并將fd返回給Service. type 只能是 "dgram", "stream" or "seqpacket".... ?

Action
Action: 通過(guò)觸發(fā)器trigger,即以on開(kāi)頭的語(yǔ)句來(lái)決定執(zhí)行相應(yīng)的service的時(shí)機(jī),具體有如下時(shí)機(jī):

  • on early-init; 在初始化早期階段觸發(fā);
  • on init; 在初始化階段觸發(fā);
  • on late-init; 在初始化晚期階段觸發(fā);
  • on boot/charger: 當(dāng)系統(tǒng)啟動(dòng)/充電時(shí)觸發(fā),還包含其他情況,此處不一一列舉;
  • on property:=: 當(dāng)屬性值滿(mǎn)足條件時(shí)觸發(fā)

Service
服務(wù)Service,以 service開(kāi)頭,由init進(jìn)程啟動(dòng),一般運(yùn)行在init的一個(gè)子進(jìn)程,所以啟動(dòng)service前需要
判斷對(duì)應(yīng)的可執(zhí)行文件是否存在。init生成的子進(jìn)程,定義在rc文件,其中每一個(gè)service在啟動(dòng)時(shí)會(huì)通過(guò)
fork方式生成子進(jìn)程。
例如: ?service servicemanager /system/bin/servicemanager 代表的是服務(wù)名為
servicemanager,服務(wù)執(zhí)行的路徑為/system/bin/servicemanager。

Command
下面列舉常用的命令

  • class_start <service_class_name>: 啟動(dòng)屬于同一個(gè)class的所有服務(wù);
  • start <service_name>: 啟動(dòng)指定的服務(wù),若已啟動(dòng)則跳過(guò);
  • stop <service_name>: 停止正在運(yùn)行的服務(wù)
  • setprop :設(shè)置屬性值
  • mkdir :創(chuàng)建指定目錄
  • symlink <sym_link>: 創(chuàng)建連接到的<sym_link>符號(hào)鏈接;
  • write : 向文件path中寫(xiě)入字符串;
  • exec: fork并執(zhí)行,會(huì)阻塞init進(jìn)程直到程序完畢;
  • exprot :設(shè)定環(huán)境變量;
  • loglevel :設(shè)置log級(jí)別

Options
Options是Service的可選項(xiàng),與service配合使用

  • disabled: 不隨class自動(dòng)啟動(dòng),只有根據(jù)service名才啟動(dòng);
  • oneshot: service退出后不再重啟;
  • user/group: 設(shè)置執(zhí)行服務(wù)的用戶(hù)/用戶(hù)組,默認(rèn)都是root;
  • class:設(shè)置所屬的類(lèi)名,當(dāng)所屬類(lèi)啟動(dòng)/退出時(shí),服務(wù)也啟動(dòng)/停止,默認(rèn)為default;
  • onrestart:當(dāng)服務(wù)重啟時(shí)執(zhí)行相應(yīng)命令;
  • socket: 創(chuàng)建名為 /dev/socket/<name> 的socket
  • critical: 在規(guī)定時(shí)間內(nèi)該service不斷重啟,則系統(tǒng)會(huì)重啟并進(jìn)入恢復(fù)模式

default: 意味著disabled=false,oneshot=false,critical=false。

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote -- start-system-serverclass mainpriority -20user rootgroup root readproc reserved_disksocket zygote stream 660 root systemonrestart write /sys/android_power/request_state wakeonrestart write /sys/power/state ononrestart restart audioserveronrestart restart cameraserveronrestart restart mediaonrestart restart netdonrestart restart wificondwritepid /dev/cpuset/foreground/tasks

service解析流程

// \system\core\init\init.cpp LoadBootScripts() L110 static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) {Parser parser = CreateParser(action_manager, service_list);//創(chuàng)建解析器std::string bootscript = GetProperty("ro.boot.init_rc", "");if (bootscript.empty()) {parser.ParseConfig("/init.rc");if (!parser.ParseConfig("/system/etc/init")) {late_import_paths.emplace_back("/system/etc/init");}if (!parser.ParseConfig("/product/etc/init")) {late_import_paths.emplace_back("/product/etc/init");}if (!parser.ParseConfig("/odm/etc/init")) {late_import_paths.emplace_back("/odm/etc/init");}if (!parser.ParseConfig("/vendor/etc/init")) {late_import_paths.emplace_back("/vendor/etc/init");}} else {parser.ParseConfig(bootscript);//開(kāi)始解析} // \system\core\init\init.cpp CreateParser() L100 Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) {Parser parser;parser.AddSectionParser("service", std::make_unique<ServiceParser> (&service_list, subcontexts));//service解析parser.AddSectionParser("on", std::make_unique<ActionParser> (&action_manager, subcontexts));parser.AddSectionParser("import", std::make_unique<ImportParser> (&parser));return parser; } // \system\core\init\parser.cpp ParseData() L 42 void Parser::ParseData(const std::string& filename, const std::string& data, size_t* parse_errors) {...for (;;) {switch (next_token(&state)) {case T_EOF:end_section();return;case T_NEWLINE:...if (section_parsers_.count(args[0])) {end_section();section_parser = section_parsers_[args[0]].get();section_start_line = state.line;if (auto result =section_parser->ParseSection(std::move(args), filename, state.line);// L95!result) {(*parse_errors)++;LOG(ERROR) << filename << ": " << state.line << ": " << result.error();section_parser = nullptr;}} else if (section_parser) {if (auto result = section_parser- >ParseLineSection(std::move(args), state.line);// L102!result) {(*parse_errors)++;LOG(ERROR) << filename << ": " << state.line << ": " << result.error();}}args.clear();break;case T_TEXT:args.emplace_back(state.text);break;}} } // \system\core\init\service.cpp ParseSection() L1180 Result<Success> ServiceParser::ParseSection(std::vector<std::string>&& args,const std::string& filename, int line) {if (args.size() < 3) {return Error() << "services must have a name and a program";}const std::string& name = args[1];if (!IsValidName(name)) {return Error() << "invalid service name '" << name << "'";}Subcontext* restart_action_subcontext = nullptr;if (subcontexts_) {for (auto& subcontext : *subcontexts_) {if (StartsWith(filename, subcontext.path_prefix())) {restart_action_subcontext = &subcontext;break;}}}std::vector<std::string> str_args(args.begin() + 2, args.end());service_ = std::make_unique<Service>(name, restart_action_subcontext, str_args);//構(gòu)建出一個(gè)service對(duì)象return Success(); } // \system\core\init\service.cpp ParseLineSection() L1206 Result<Success> ServiceParser::ParseLineSection(std::vector<std::string>&& args, int line) {return service_ ? service_->ParseLine(std::move(args)) : Success(); } // \system\core\init\service.cpp EndSection() L1210 Result<Success> ServiceParser::EndSection() {if (service_) {Service* old_service = service_list_->FindService(service_->name());if (old_service) {if (!service_->is_override()) {return Error() << "ignored duplicate definition of service '" << service_->name()<< "'";}service_list_->RemoveService(*old_service);old_service = nullptr;}service_list_->AddService(std::move(service_)); }return Success(); } // \system\core\init\service.cpp AddService() L1082 void ServiceList::AddService(std::unique_ptr<Service> service) {services_.emplace_back(std::move(service)); } 上面解析完成后,接下來(lái)就是啟動(dòng)Service,這里我們以啟動(dòng)Zygote來(lái)分析 # \system\core\rootdir\init.rc L680 on nonencryptedclass_start main //class_start是一個(gè)命令,通過(guò)do_class_start函數(shù)處理class_start late_start // \system\core\init\builtins..cpp do_class_start() L101 static Result<Success> do_class_start(const BuiltinArguments& args) {// Starting a class does not start services which are explicitly disabled.// They must be started individually.for (const auto& service : ServiceList::GetInstance()) {if (service->classnames().count(args[1])) {if (auto result = service->StartIfNotDisabled(); !result) {LOG(ERROR) << "Could not start service '" << service->name()<< "' as part of class '" << args[1] << "': " << result.error();}}}return Success(); } // \system\core\init\service.cpp StartIfNotDisabled() L977 Result<Success> Service::StartIfNotDisabled() {if (!(flags_ & SVC_DISABLED)) {return Start();} else {flags_ |= SVC_DISABLED_START;}return Success(); } // \system\core\init\service.cpp Start() L785 Result<Success> Service::Start() {//如果service已經(jīng)運(yùn)行,則不啟動(dòng)if (flags_ & SVC_RUNNING) {if ((flags_ & SVC_ONESHOT) && disabled) {flags_ |= SVC_RESTART;}// It is not an error to try to start a service that is already running.return Success(); }...//判斷需要啟動(dòng)的service的對(duì)應(yīng)的執(zhí)行文件是否存在,不存在則不啟動(dòng)servicestruct stat sb;if (stat(args_[0].c_str(), &sb) == -1) {flags_ |= SVC_DISABLED;return ErrnoError() << "Cannot find '" << args_[0] << "'";}std::string scon;if (!seclabel_.empty()) {scon = seclabel_;} else {auto result = ComputeContextFromExecutable(args_[0]);if (!result) {return result.error();}scon = *result;}LOG(INFO) << "starting service '" << name_ << "'...";//如果子進(jìn)程沒(méi)有啟動(dòng),則調(diào)用fork函數(shù)創(chuàng)建子進(jìn)程pid_t pid = -1;if (namespace_flags_) {pid = clone(nullptr, nullptr, namespace_flags_ | SIGCHLD, nullptr);} else {pid = fork();}if (pid == 0) {//當(dāng)期代碼邏輯在子進(jìn)程中運(yùn)行umask(077);//調(diào)用execv函數(shù),啟動(dòng)sevice子進(jìn)程if (!ExpandArgsAndExecv(args_)) {PLOG(ERROR) << "cannot execve('" << args_[0] << "')";}_exit(127);}return Success(); }

Zygote概敘
Zygote中文翻譯為“受精卵”,正如其名,它主要用于孵化子進(jìn)程。在Android系統(tǒng)中有以下兩種程序:
java應(yīng)用程序,主要基于ART虛擬機(jī),所有的應(yīng)用程序apk都屬于這類(lèi)native程序,也就是利用C或C++語(yǔ)
言開(kāi)發(fā)的程序,如bootanimation。所有的Java應(yīng)用程序進(jìn)程及系統(tǒng)服務(wù)SystemServer進(jìn)程都由Zygote
進(jìn)程通過(guò)Linux的fork()函數(shù)孵化出來(lái)的,這也就是為什么把它稱(chēng)為Zygote的原因,因?yàn)樗拖褚粋€(gè)受精
卵,孵化出無(wú)數(shù)子進(jìn)程,而native程序則由Init程序創(chuàng)建啟動(dòng)。Zygote進(jìn)程最初的名字不是“zygote”而是
“app_process”,這個(gè)名字是在Android.mk文件中定義的
Zgyote是Android中的第一個(gè)art虛擬機(jī),他通過(guò)socket的方式與其他進(jìn)程進(jìn)行通信。這里的“其他進(jìn)程”
其實(shí)主要是系統(tǒng)進(jìn)程——SystemServer

Zygote是一個(gè)C/S模型,Zygote進(jìn)程作為服務(wù)端,它主要負(fù)責(zé)創(chuàng)建Java虛擬機(jī),加載系統(tǒng)資源,啟
動(dòng)SystemServer進(jìn)程,以及在后續(xù)運(yùn)行過(guò)程中啟動(dòng)普通的應(yīng)用程序,其他進(jìn)程作為客戶(hù)端向它發(fā)
出“孵化”請(qǐng)求,而Zygote接收到這個(gè)請(qǐng)求后就“孵化”出一個(gè)新的進(jìn)程。比如,當(dāng)點(diǎn)擊Launcher里的
應(yīng)用程序圖標(biāo)去啟動(dòng)一個(gè)新的應(yīng)用程序進(jìn)程時(shí),這個(gè)請(qǐng)求會(huì)到達(dá)框架層的核心服務(wù)
ActivityManagerService中,當(dāng)AMS收到這個(gè)請(qǐng)求后,它通過(guò)調(diào)用Process類(lèi)發(fā)出一個(gè)“孵化”子進(jìn)
程的Socket請(qǐng)求,而Zygote監(jiān)聽(tīng)到這個(gè)請(qǐng)求后就立刻fork一個(gè)新的進(jìn)程出來(lái)

Zygote觸發(fā)過(guò)程
1. init.zygoteXX.rc

import /init.${ro.zygote}.rc

${ro.zygote} 會(huì)被替換成 ro.zyogte 的屬性值,這個(gè)是由不同的硬件廠(chǎng)商自己定制的,
有四個(gè)值,
zygote32: zygote 進(jìn)程對(duì)應(yīng)的執(zhí)行程序是 app_process (純 32bit 模式)
zygote64: zygote 進(jìn)程對(duì)應(yīng)的執(zhí)行程序是 app_process64 (純 64bit 模式)
zygote32_64: 啟動(dòng)兩個(gè) zygote 進(jìn)程 (名為 zygote 和 zygote_secondary),對(duì)應(yīng)的執(zhí)行程序分別
是 app_process32 (主模式)
zygote64_32: 啟動(dòng)兩個(gè) zygote 進(jìn)程 (名為 zygote 和 zygote_secondary),對(duì)應(yīng)的執(zhí)行程序分別
是 app_process64 (主模式)、app_process32
2. start zygote
位置:system\core\rootdir\init.rc 560

# It is recommended to put unnecessary data/ initialization from post-fs- data # to start-zygote in device's init.rc to unblock zygote start. on zygote-start && property:ro.crypto.state=unencrypted# A/B update verifier that marks a successful boot.exec_start update_verifier_nonencryptedstart netdstart zygotestart zygote_secondary on zygote-start && property:ro.crypto.state=unsupported# A/B update verifier that marks a successful boot.exec_start update_verifier_nonencryptedstart netdstart zygotestart zygote_secondary on zygote-start && property:ro.crypto.state=encrypted && property:ro.crypto.type=file# A/B update verifier that marks a successful boot.exec_start update_verifier_nonencryptedstart netdstart zygotestart zygote_secondary

zygote-start 是在 on late-init 中觸發(fā)的

# Mount filesystems and start core system services. on late-inittrigger early-fs# Mount fstab in init.{$device}.rc by mount_all command. Optional parameter# '--early' can be specified to skip entries with 'latemount'.# /system and /vendor must be mounted by the end of the fs stage,# while /data is optional.trigger fstrigger post-fs# Mount fstab in init.{$device}.rc by mount_all with '--late' parameter# to only mount entries with 'latemount'. This is needed if '--early' is# specified in the previous mount_all command on the fs stage.# With /system mounted and properties form /system + /factory available,# some services can be started.trigger late-fs# Now we can mount /data. File encryption requires keymaster to decrypt# /data, which in turn can only be loaded when system properties are present.trigger post-fs-data# Now we can start zygote for devices with file based encryptiontrigger zygote-start # zygote-start 是在 on late-init 中觸發(fā)的# Load persist properties and override properties (if enabled) from /data.trigger load_persist_props_action# Remove a file to wake up anything waiting for firmware.trigger firmware_mounts_completetrigger early-boottrigger boot if (bootmode == "charger") {am.QueueEventTrigger("charger");} else {am.QueueEventTrigger("late-init");}

3. app_processXX
位置\frameworks\base\cmds\app_process\

app_process_src_files := \app_main.cpp \ LOCAL_SRC_FILES:= $(app_process_src_files) ... LOCAL_MODULE:= app_process LOCAL_MULTILIB := both LOCAL_MODULE_STEM_32 := app_process32 LOCAL_MODULE_STEM_64 := app_process64

Zygote啟動(dòng)過(guò)程
位置\frameworks\base\cmds\app_process\app_main.cpp
在app_main.cpp的main函數(shù)中,主要做的事情就是參數(shù)解析. 這個(gè)函數(shù)有兩種啟動(dòng)模式:
1. 一種是zygote模式,也就是初始化zygote進(jìn)程,傳遞的參數(shù)有--start-system-server --socket-
name=zygote,前者表示啟動(dòng)SystemServer,后者指定socket的名稱(chēng)
2. 一種是application模式,也就是啟動(dòng)普通應(yīng)用程序,傳遞的參數(shù)有class名字以及class帶的參數(shù)
兩者最終都是調(diào)用AppRuntime對(duì)象的start函數(shù),加載ZygoteInit或RuntimeInit兩個(gè)Java類(lèi),并將之前
整理的參數(shù)傳入進(jìn)去

app_process

// \frameworks\base\cmds\app_process\app_main.cpp main() L280 if (strcmp(arg, "--zygote") == 0) {zygote = true;niceName = ZYGOTE_NICE_NAME;} else if (strcmp(arg, "--start-system-server") == 0) {startSystemServer = true;} else if (strcmp(arg, "--application") == 0) {application = true;} // L349 ?? if (zygote) {//這些Java的應(yīng)用都是通過(guò) AppRuntime.start(className)開(kāi)始的//其實(shí)AppRuntime是AndroidRuntime的子類(lèi),它主要實(shí)現(xiàn)了幾個(gè)回調(diào)函數(shù),而start()方 法是實(shí)現(xiàn)在AndroidRuntime這個(gè)方法類(lèi)里runtime.start("com.android.internal.os.ZygoteInit", args, zygote);} else if (className) {runtime.start("com.android.internal.os.RuntimeInit", args, zygote);}

app_process 里面定義了三種應(yīng)用程序類(lèi)型:
1. Zygote: com.android.internal.os.ZygoteInit
2. System Server, 不單獨(dú)啟動(dòng),而是由Zygote啟動(dòng)
3. 其他指定類(lèi)名的Java 程序

// \frameworks\base\core\jni\androidRuntime.cpp class AppRuntime : public AndroidRuntime { public:AppRuntime(char* argBlockStart, const size_t argBlockLength): AndroidRuntime(argBlockStart, argBlockLength), mClass(NULL){}void setClassNameAndArgs(const String8& className, int argc, char * const *argv) {mClassName = className;for (int i = 0; i < argc; ++i) {mArgs.add(String8(argv[i]));}}virtual void onVmCreated(JNIEnv* env){if (mClassName.isEmpty()) {return; // Zygote. Nothing to do here.}/** This is a little awkward because the JNI FindClass call uses the* class loader associated with the native method we're executing in.* If called in onStarted (from RuntimeInit.finishInit because we're* launching "am", for example), FindClass would see that we're calling* from a boot class' native method, and so wouldn't look for the class* we're trying to look up in CLASSPATH. Unfortunately it needs to,* because the "am" classes are not boot classes.** The easiest fix is to call FindClass here, early on before we start* executing boot class Java code and thereby deny ourselves access to* non-boot classes.*/char* slashClassName = toSlashClassName(mClassName.string());mClass = env->FindClass(slashClassName);if (mClass == NULL) {ALOGE("ERROR: could not find class '%s'\n", mClassName.string());}free(slashClassName);mClass = reinterpret_cast<jclass>(env->NewGlobalRef(mClass));}virtual void onStarted(){sp<ProcessState> proc = ProcessState::self();ALOGV("App process: starting thread pool.\n");proc->startThreadPool();AndroidRuntime* ar = AndroidRuntime::getRuntime();ar->callMain(mClassName, mClass, mArgs);IPCThreadState::self()->stopProcess();hardware::IPCThreadState::self()->stopProcess();}virtual void onZygoteInit(){sp<ProcessState> proc = ProcessState::self();ALOGV("App process: starting thread pool.\n");proc->startThreadPool();}virtual void onExit(int code){if (mClassName.isEmpty()) {// if zygoteIPCThreadState::self()->stopProcess();hardware::IPCThreadState::self()->stopProcess();}AndroidRuntime::onExit(code);}String8 mClassName;Vector<String8> mArgs;jclass mClass; }; }

?

總結(jié)

以上是生活随笔為你收集整理的系统进程启动流程分析(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

人人网人人爽 | 97超碰国产精品 | 91资源在线播放 | 中文字幕在线观看国产 | 9在线观看免费高清完整版在线观看明 | av电影亚洲 | 在线免费观看黄色小说 | 四虎永久免费 | 六月丁香六月婷婷 | 成人小视频在线 | 黄色91在线观看 | 久久99国产精品自在自在app | 密桃av在线| 99热在线这里只有精品 | 亚洲免费在线 | 国产精品久久99综合免费观看尤物 | 国产黄网站在线观看 | 亚洲一级电影在线观看 | 久久在线电影 | 天天插天天色 | 国产黄a三级三级 | 天天摸天天弄 | 中文字幕免费高清av | 亚洲国产成人久久综合 | 久久这里只精品 | 国产视频日韩 | 麻豆av一区二区三区在线观看 | 国产精品一区二区三区四区在线观看 | 亚洲精品国产精品国自产观看浪潮 | 国产激情久久久 | 日韩在线免费高清视频 | 久久久免费看视频 | 亚洲色图 校园春色 | 婷婷电影在线观看 | 久久成 | 国产破处在线视频 | 国产白浆在线观看 | 99国产精品久久久久老师 | 天天在线操 | 久久黄色影院 | 中文字幕视频在线播放 | 亚洲日日日 | 欧美国产日韩一区二区三区 | 青青河边草免费直播 | 日日干,天天干 | 成人午夜剧场在线观看 | 00av视频 | 肉色欧美久久久久久久免费看 | 成人精品一区二区三区电影免费 | 日韩亚洲在线观看 | 国产精品白丝jk白祙 | 蜜臀久久99精品久久久久久网站 | av免费成人 | 久久影院亚洲 | 成人在线视频在线观看 | 伊人在线视频 | 日韩乱色精品一区二区 | 亚洲国产精品第一区二区 | 欧美激情综合五月色丁香小说 | 久久久久女教师免费一区 | 免费在线播放视频 | 成片免费观看视频 | 久久国产区 | 视频一区二区国产 | 超碰在线1| 狠狠色2019综合网 | 91热视频 | 安徽妇搡bbbb搡bbbb | 探花在线观看 | 亚洲综合五月天 | 美腿丝袜一区二区三区 | www婷婷| 奇米影视四色8888 | 一区二区三区四区五区在线视频 | 亚洲精品高清在线 | 啪嗒啪嗒免费观看完整版 | 日日夜夜艹 | 99久久精品免费看国产免费软件 | 日韩久久午夜一级啪啪 | 日本中文字幕在线免费观看 | 中文字幕在线网 | 免费av免费观看 | 91精品免费看 | 日韩精品在线视频 | 在线免费观看一区二区三区 | 中文字幕 国产专区 | 亚洲 精品在线视频 | 免费一级片久久 | 97在线免费视频观看 | 99亚洲精品视频 | 国产精品第二页 | 亚洲专区视频在线观看 | 亚洲人成在线电影 | 最近日本中文字幕 | 人人插人人澡 | 久久成 | 亚洲三级在线免费观看 | 免费福利在线视频 | 开心激情综合网 | 中文字幕国产精品 | 久久久免费观看视频 | 一级黄色电影网站 | av片子在线观看 | 久久99中文字幕 | 久久久国产精品网站 | 综合色亚洲 | av国产网站| 久草综合视频 | 欧美日韩国产在线精品 | 国产精品久久久久aaaa九色 | 五月婷婷av | 99久热在线精品视频观看 | 日韩国产欧美在线播放 | 国产91国语对白在线 | 天天操比 | 香蕉97视频观看在线观看 | 国产精品嫩草在线 | 国产香蕉视频在线播放 | 国产 日韩 中文字幕 | 五月婷婷亚洲 | 国产精品青草综合久久久久99 | 国产一区二区三区视频在线 | 日韩大片在线免费观看 | 99r在线观看 | 久久色亚洲 | 国产精品久久久电影 | 日本爽妇网 | 色永久免费视频 | 91亚洲精品久久久 | 亚洲在线网址 | 视频在线观看一区 | 国产毛片久久久 | 国产成人精品aaa | 久久国产精品第一页 | 日日夜夜av| 日韩在线一二三区 | 亚洲国产高清在线观看视频 | 精品一区二区免费在线观看 | 在线网站黄| 国产一二区免费视频 | 91超碰在线播放 | 国产 字幕 制服 中文 在线 | 日韩字幕在线观看 | 最近中文字幕 | 国产99一区视频免费 | 欧美aaaxxxx做受视频 | 1024在线看片 | 国产伦理一区二区 | 最近的中文字幕大全免费版 | 激情在线网站 | 97碰碰视频 | 香蕉视频在线免费看 | 国产女人免费看a级丨片 | 色婷婷亚洲婷婷 | 亚洲香蕉在线观看 | 一区 在线 影院 | 日本三级吹潮在线 | 中文在线字幕免 | 黄色一二级片 | 国产国产人免费人成免费视频 | 国产精品乱码一区二区视频 | 五月婷婷丁香综合 | 欧美视频在线二区 | 在线精品亚洲一区二区 | 在线免费观看黄色小说 | 国产精品一区二区无线 | 免费在线观看日韩视频 | 色网站在线 | 色的网站在线观看 | 欧美肥妇free| 日韩黄色在线观看 | 亚洲一区二区三区miaa149 | 三级在线国产 | 久久精品国产v日韩v亚洲 | 在线亚洲日本 | 伊人官网 | 国产在线视频一区二区 | 日韩高清一区在线 | 久久国产成人午夜av影院宅 | 国产丝袜一区二区三区 | 99精品视频在线播放免费 | 偷拍精偷拍精品欧洲亚洲网站 | 欧美淫视频 | 99电影456麻豆 | 日韩一片 | 亚洲人xxx | 免费麻豆 | 久久久久电影网站 | 中文字幕乱码日本亚洲一区二区 | 成人黄色在线观看视频 | 五月婷丁香 | 亚洲精品网址在线观看 | 天天干,天天插 | 99精品在线免费视频 | 美女黄视频免费看 | 特级毛片在线免费观看 | 久久综合五月天 | 久久精品五月 | 五月天丁香 | 国产精品免费一区二区 | 中文字幕日韩av | 黄色一级大片在线免费看国产一 | 免费福利在线观看 | 久久在线免费观看视频 | 国产精品四虎 | 精品国偷自产国产一区 | 亚洲成人999 | 欧美综合国产 | 国产午夜小视频 | 成 人 黄 色 视频免费播放 | 96精品在线 | 日日干天天爽 | 伊人婷婷在线 | 久久久久久不卡 | 在线观看免费一区 | 国产成人av网站 | 亚洲成人频道 | 99视频偷窥在线精品国自产拍 | 国产九九热 | 亚洲国产精品推荐 | 久久在线视频在线 | av成人免费在线观看 | 能在线观看的日韩av | 久久激情五月激情 | 五月天堂色 | 久久视屏网 | 精品国产福利在线 | 色91在线视频 | 操操综合网| 一区二区三区在线电影 | 亚洲电影成人 | 在线观看午夜av | 一区二区三区动漫 | 久久伊99综合婷婷久久伊 | 日韩久久精品一区二区 | 久久人人看 | 天天射狠狠干 | www.久久久com | aav在线| 亚洲日本va午夜在线影院 | 亚洲视频999 | 狠狠操夜夜操 | 久久国产剧场电影 | 婷婷五情天综123 | 日韩欧美视频在线观看免费 | 日韩欧美专区 | 中文字幕一区二区三区在线观看 | 黄色天堂在线观看 | 久久精品99国产 | 手机在线免费av | 狠狠色噜噜狠狠狠狠 | 久久99国产精品久久99 | 久久综合久久久久88 | 99精品在线视频播放 | 精品日韩在线 | 狠狠色狠狠色综合日日92 | 欧美少妇18p | 色综合色综合色综合 | 国产成人免费精品 | 欧美专区日韩专区 | 久久午夜精品 | 亚洲国产黄色片 | 黄色性av | 亚洲一区二区三区miaa149 | 精品成人网 | 91在线精品播放 | 不卡av电影在线观看 | 五月婷婷伊人网 | 亚洲精品免费在线观看视频 | 欧美在线一级片 | 五月婷婷网站 | 亚洲免费在线观看视频 | 精品国产乱码一区二 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | av免费看在线 | 国产视频一区在线 | 久草资源在线观看 | 中文字幕在线观看第一区 | 三级在线视频观看 | 日本中文字幕久久 | 国产xx视频| 日韩免费播放 | 91网在线 | 偷拍精偷拍精品欧洲亚洲网站 | 国产精品区二区三区日本 | 国产区精品视频 | 国产日本在线播放 | 久久精品国产一区二区电影 | 免费观看一区 | 中国一 片免费观看 | 国产一区高清在线观看 | 极品美女被弄高潮视频网站 | 国产免费小视频 | 亚洲视频 在线观看 | 在线高清一区 | 午夜三级毛片 | 99久久久国产精品 | 曰本免费av | 成人免费观看大片 | 国产福利在线 | 久久午夜羞羞影院 | 2023天天干| 操夜夜操 | 热久久免费国产视频 | 日韩a级黄色 | 九九欧美| 欧美日本三级 | 亚洲日本一区二区在线 | 免费精品久久久 | 午夜免费福利视频 | 97视频资源| 国产成人福利在线观看 | 日韩欧美亚州 | 在线中文字幕播放 | 91传媒激情理伦片 | 日韩二区三区 | 免费色视频在线 | 亚洲国产无 | 色噜噜日韩精品欧美一区二区 | 久久激情小视频 | 天天操天天玩 | 日韩精品一区二区三区在线视频 | 国产伦精品一区二区三区四区视频 | 丁香六月婷 | 欧美日韩视频在线 | 激情综合五月网 | 丁香婷婷激情网 | 久草视频免费看 | www久草| 亚洲午夜精品久久久久久久久 | 国产精品资源网 | 在线色亚洲 | 国产馆在线播放 | 欧美aaa视频 | 99色在线播放 | 久久国产精彩视频 | 狠狠狠综合 | 伊人成人久久 | 亚洲国产中文在线 | 中文字幕精品视频 | 亚洲九九 | 久久精品一区二区三区四区 | 91网站在线视频 | 久久国产经典 | 一级黄色片网站 | 成人免费在线视频观看 | 久久99久久99 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 9ⅰ精品久久久久久久久中文字幕 | 欧美日韩国产一区二区三区 | 中文字幕成人在线 | 国产乱码精品一区二区三区介绍 | 久久国产精彩视频 | 日韩精品欧美精品 | 日韩精品aaa | 国产在线中文字幕 | 99综合影院在线 | 天天天天天天干 | 99这里只有 | 国产精品免费视频一区二区 | av日韩国产 | 国产成人精品综合 | 免费观看黄 | 亚洲精品美女视频 | 久艹视频免费观看 | 日韩网站在线 | 叶爱av在线 | 在线观看免费成人 | 国产精品小视频网站 | 伊人黄色网| 92中文资源在线 | av中文字幕在线播放 | 国产精品久久久久免费 | 久久黄色美女 | 韩国av免费观看 | 亚洲免费av电影 | 中文av一区二区 | 成人免费影院 | av成人黄色 | 亚洲 中文 欧美 日韩vr 在线 | 国产剧在线观看片 | 亚洲 欧美 国产 va在线影院 | 亚洲精品美女视频 | 亚洲成人资源在线观看 | 超碰97人人干 | 国产原创在线观看 | 亚洲国产影院 | 午夜精选视频 | a天堂中文在线 | 国产日韩在线视频 | 国产在线不卡 | 国产精品久久久久国产精品日日 | 国产精品国产三级国产aⅴ无密码 | 欧美一区二区免费在线观看 | 青青河边草免费观看 | 日韩午夜视频在线观看 | 亚洲精品视频在线观看免费视频 | 免费在线观看av | 日韩欧美成人网 | 中文视频在线 | 91在线精品秘密一区二区 | 久久色中文字幕 | 97精品国自产拍在线观看 | 欧美一级久久久久 | 国产精品久久片 | 日韩高清免费电影 | 99国产精品免费网站 | 成人亚洲欧美 | 人人爽人人爱 | 中文字幕一区二区三区四区久久 | 亚洲精品婷婷 | 国产视频一区在线播放 | 粉嫩av一区二区三区四区五区 | 国产精品99久久久久人中文网介绍 | 四虎永久国产精品 | 五月天九九 | 人成午夜视频 | 在线免费观看国产精品 | 久久久久久免费毛片精品 | 久久久久久99精品 | 中文字幕一区二区三区久久蜜桃 | 国产高清在线 | 国产福利免费在线观看 | 色亚洲网 | 天天综合天天综合 | 欧美一区二区三区在线播放 | 808电影免费观看三年 | 又爽又黄在线观看 | 色综合天天射 | 在线黄色毛片 | 女人18精品一区二区三区 | 日日干激情五月 | 亚洲午夜精品久久久久久久久 | 精品国产精品一区二区夜夜嗨 | 日韩中文字幕免费 | 亚洲精品色婷婷 | 亚洲开心激情 | 91在线视频免费观看 | 欧美性生交大片免网 | 久久99国产精品二区护士 | 亚州人成在线播放 | 国产成人av电影 | 国产不卡精品 | 婷婷在线网站 | 91成人免费看片 | 97综合视频 | 亚洲高清在线视频 | 97精品国产97久久久久久久久久久久 | 中文字幕欧美三区 | 国产综合精品一区二区三区 | 福利视频一二区 | 高清国产午夜精品久久久久久 | 青青草华人在线视频 | 国产美腿白丝袜足在线av | 国内小视频| www一起操 | 黄色app网站在线观看 | 精品一区二区在线免费观看 | 五月天久久综合网 | 最近中文字幕mv免费高清在线 | 人人射人人爱 | 日韩视| 国产精品免费一区二区三区 | 久久久久一区二区三区 | 在线看岛国av| 日韩av免费大片 | 亚洲精品18p | 国产午夜精品福利视频 | 国产短视频在线播放 | 五月婷婷综合激情网 | 中文字幕一区二区三区四区在线视频 | 在线视频 国产 日韩 | av九九| 在线黄色观看 | 探花视频在线观看+在线播放 | aaa亚洲精品一二三区 | 奇米影视四色8888 | 亚洲久草视频 | 久久69av| 日本亚洲国产 | 免费观看性生活大片 | 亚洲国产精品免费 | 国产精品美女久久久久aⅴ 干干夜夜 | 看片黄网站 | 激情丁香在线 | 色婷婷视频在线观看 | 日日天天狠狠 | 人人澡人人干 | 日韩二级毛片 | 91精品国自产在线 | 欧美激情第一区 | 91精品啪在线观看国产 | 人人添人人澡人人澡人人人爽 | 国产精品精品 | 国产美女久久 | 免费av大全| 久久伊人91| 国产一级免费观看视频 | 国产中文字幕久久 | 在线免费观看视频你懂的 | 视频三区在线 | 97电影院在线观看 | 天天做天天看 | 伊人影院在线观看 | 成人午夜久久 | 久久久香蕉视频 | 久草网视频在线观看 | 高清中文字幕 | 久草在线视频免赞 | 西西人体www444 | 日韩欧美网址 | 制服丝袜一区二区 | 国产色久 | 91麻豆精品国产91久久久使用方法 | 久久99热这里只有精品 | 欧美日韩国产亚洲乱码字幕 | 麻豆视频免费播放 | 国产原创在线 | 国产一区二区不卡在线 | 日韩精品中文字幕在线不卡尤物 | 精品久久久久久久久中文字幕 | 国产精品久久久久久久久久免费看 | 国产精品免费观看国产网曝瓜 | 精品成人久久 | 992tv在线观看 | 国产麻豆精品传媒av国产下载 | 久久精品一二三区白丝高潮 | 久久综合九色九九 | 亚洲精品视频在线观看免费视频 | 狠狠狠狠狠狠干 | 一区二区视频在线免费观看 | 色婷婷狠| www.色婷婷| 中文字幕在线专区 | 色婷婷88av视频一二三区 | 不卡av在线| 国产精品久久久久免费a∨ 欧美一级性生活片 | 亚洲国产69 | 国产精品久久久久国产精品日日 | 丁香六月婷婷开心婷婷网 | 五月天婷亚洲天综合网精品偷 | 黄色app网站在线观看 | 国产黄色美女 | 人人爱人人爽 | 男女激情片在线观看 | 国产精品尤物视频 | 久久久久欧美精品999 | 人人澡人人舔 | 水蜜桃亚洲一二三四在线 | 亚洲一级电影视频 | av中文字幕网站 | 国产精品成人自产拍在线观看 | 亚洲黄色在线观看 | 综合色婷婷 | 亚洲国产美女久久久久 | 99视频在线精品 | 久久国产精品99久久久久 | av在线播放一区二区三区 | 九九视频精品免费 | 久久精品99视频 | 99视频在线观看视频 | 蜜桃av观看 | 色婷婷狠狠操 | 国产91精品一区二区麻豆网站 | 午夜性生活片 | 国产成人一区二区精品非洲 | 久久久精品综合 | 欧美福利片在线观看 | 亚洲黄色成人 | 日韩黄色影院 | 欧美视频网址 | 欧美黄色软件 | 亚洲人成在线电影 | av网址aaa| 91精品国产自产91精品 | 日本久久精品视频 | 蜜桃视频成人在线观看 | 九九爱免费视频 | 国产精品久久久区三区天天噜 | 激情偷乱人伦小说视频在线观看 | 日一日操一操 | 超碰在线91 | 狠狠激情中文字幕 | 亚洲一二区精品 | 四虎天堂 | 国产啊v在线 | wwwwwww黄| 成人黄色在线播放 | 麻豆传媒在线免费看 | 久久精品欧美一区二区三区麻豆 | 高潮久久久 | 午夜视频在线观看一区 | 国产精品久久久久久久妇 | 成人免费一区二区三区在线观看 | 中文字幕一区二区三区四区视频 | 成人天堂网 | 日本中文在线观看 | 国产传媒中文字幕 | 国产伦精品一区二区三区… | 久久草视频| 国产精品对白一区二区三区 | 麻豆视频一区二区 | 九九热精品视频在线播放 | 亚洲成人动漫在线观看 | 91秒拍国产福利一区 | 色综合天天综合 | 亚洲精品在线观 | 99热99热| 99精品免费在线 | 91精品久久香蕉国产线看观看 | 亚洲国产网址 | 中文字幕最新精品 | 国产福利一区二区在线 | 一区av在线播放 | 亚洲成人av在线播放 | 久久永久免费视频 | 日韩美女免费线视频 | 久久精品99国产精品 | 免费网站看v片在线a | 97人人超| 中文字幕乱码日本亚洲一区二区 | 国产热re99久久6国产精品 | 久久免费黄色网址 | 2018亚洲男人天堂 | 91中文在线观看 | 韩国精品一区二区三区六区色诱 | 99精品视频在线 | 日韩精品一区二区三区第95 | 91精品国产福利在线观看 | 国内精品久久久久久久97牛牛 | 91香蕉国产在线观看软件 | 久久av不卡| 国产 色| 综合在线观看色 | 在线观看免费视频你懂的 | 免费的黄色的网站 | 91久久精品一区二区二区 | 亚洲婷婷在线 | 美女网站在线看 | 91九色视频网站 | 草草草影院 | 亚洲另类交 | 在线观看免费 | 天天操天天干天天操天天干 | 99re视频在线观看 | 91丨精品丨蝌蚪丨白丝jk | 免费久久99精品国产 | 在线日韩中文字幕 | 免费看高清毛片 | 国产一区免费视频 | 国产亚洲一区 | 超碰人人在线观看 | 九九热在线精品视频 | 亚洲少妇久久 | 亚洲黄色在线观看 | 日本黄色一级电影 | 日韩欧美在线国产 | 婷婷综合视频 | 99精品视频免费全部在线 | 91精品国产综合久久福利不卡 | 18久久久| 日韩精品中文字幕一区二区 | 在线观看日韩精品 | 婷婷丁香在线 | 在线观看亚洲国产精品 | 日本免费一二三区 | 在线国产片 | 在线黄色免费 | 日韩在线视频看看 | 激情婷婷在线观看 | 国产色视频123区 | 日本精品一区二区三区在线观看 | 国产精品成人自产拍在线观看 | 欧美激情第28页 | 丝袜足交在线 | 久久成人在线 | 亚洲成人免费在线 | 超碰97人人干| 久久99日韩| 日韩区欠美精品av视频 | 91高清不卡| 成人黄色大片在线免费观看 | 亚洲精品成人 | av在线电影免费观看 | 亚洲不卡123| 69国产精品视频免费观看 | 日韩中文字幕电影 | 国产高清在线免费观看 | 九九视频这里只有精品 | 久久久久久久网 | 一区二区三区免费在线 | 狠狠色丁香婷综合久久 | 欧美日韩国产精品久久 | 国产一区二区在线视频观看 | 激情文学丁香 | 嫩模bbw搡bbbb搡bbbb| 波多野结衣视频一区二区三区 | 亚洲精品乱码久久久久久蜜桃不爽 | 国产成人精品在线 | 在线亚洲小视频 | av在线短片 | 国产99久久九九精品免费 | 久久综合网色—综合色88 | 激情亚洲综合在线 | www日韩在线 | 天堂网一区二区三区 | 欧美一区二区三区在线播放 | 色综合久 | 久久精品九色 | 日产乱码一二三区别在线 | 99久久超碰中文字幕伊人 | 久久久综合电影 | 国语精品久久 | 久久久视屏 | 97天天综合网 | 96久久精品 | 日韩在线观看a | 久久久国产精品一区二区中文 | 中文字幕在线影视资源 | 日本爱爱免费视频 | 亚洲精品美女在线观看 | 91精品国自产在线 | 日韩免费在线 | 天天干天天射天天插 | 久久综合中文字幕 | 91福利视频免费 | 成人黄色在线电影 | 色综合天天综合网国产成人网 | 999视频网站 | 国产精品免费小视频 | 久久久国产高清 | 亚洲专区在线视频 | 中文字幕在线第一页 | 国产精品久久99综合免费观看尤物 | 综合久久五月天 | 国产性xxxx| 九九视频免费在线观看 | 91视频免费看网站 | 久久综合中文色婷婷 | 久草在线视频在线 | 国产高清黄色 | 亚洲精品乱码久久久久久蜜桃动漫 | 在线中文字幕网站 | 久久草草热国产精品直播 | 免费精品在线观看 | 在线亚洲成人 | 国产九九九视频 | 中文字幕丰满人伦在线 | 免费黄色网址大全 | 在线电影av | 欧美日韩久久一区 | 国产精品国产三级国产 | 久艹视频免费观看 | 久久国内精品视频 | 麻豆视频免费网站 | 亚洲午夜精品久久久久久久久久久久 | 亚洲免费精品一区二区 | 999精品网 | 色吊丝在线永久观看最新版本 | 国产在线观看你懂得 | 91av手机在线 | 日本中文一区二区 | 区一区二区三在线观看 | 国产精品 日韩精品 | 亚洲婷婷综合色高清在线 | 亚洲精品国产免费 | 99精品久久只有精品 | 国产色在线观看 | 66av99精品福利视频在线 | 超碰在线人人 | 青草视频在线 | 在线观看国产一区二区 | 有码视频在线观看 | 97超碰超碰久久福利超碰 | 伊人官网 | 97在线观看免费高清 | 久久久www免费电影网 | 日韩成人精品 | 五月婷婷操 | 婷婷综合国产 | 人人干在线观看 | 天天综合网在线 | 日韩精品在线免费播放 | 91免费观看网站 | 成人黄色毛片 | 精品国产1区二区 | 国产伦理久久精品久久久久_ | 日韩艹 | 天天操比 | 亚洲精品国偷拍自产在线观看蜜桃 | 99久久激情 | 亚洲 综合 精品 | 国内精品亚洲 | 久草男人天堂 | av千婊在线免费观看 | av免费观看高清 | 97超碰超碰久久福利超碰 | 国产精品视频观看 | h动漫中文字幕 | 久久精品网站视频 | 国产精品久久久久久久久久久免费 | 久久精品视频观看 | 久久精品一区二区三区中文字幕 | 九九热re| 精品国产激情 | 国产69精品久久99不卡的观看体验 | 欧美一级性 | 久草精品视频在线看网站免费 | 亚洲欧美在线观看视频 | 中文字幕中文字幕中文字幕 | 国产视频欧美视频 | 夜色在线资源 | 久久99久久99精品免视看婷婷 | 日韩视频在线观看视频 | 国产美腿白丝袜足在线av | 亚洲精品在 | 美女免费视频观看网站 | 久久爱影视i | 九色视频自拍 | 久久成人亚洲欧美电影 | 久久久久久久久久久久久久电影 | 国产字幕在线播放 | av三区在线 | 999成人免费视频 | 久久综合99 | 婷婷久久五月天 | 亚洲一区美女视频在线观看免费 | av电影久久 | 成人 国产 在线 | 亚洲va韩国va欧美va精四季 | 日韩视频免费 | 精品毛片久久久久久 | 国产精品毛片久久久久久久 | 亚洲一区免费在线 | 国产成人久久精品77777 | 日韩电影中文,亚洲精品乱码 | 成人精品视频 | 色六月婷婷| 99热在线这里只有精品 | 色婷婷激情综合 | 亚洲精品在线免费看 | 免费成视频 | 久久精品国产v日韩v亚洲 | 成人在线视频免费看 | 网站免费黄 | 久久久伊人网 | 91porny九色在线播放 | 久久在线观看视频 | 亚洲狠狠丁香婷婷综合久久久 | a一片一级| 日韩成人免费电影 | 在线观看免费 | 亚洲电影久久久 | 亚洲高清在线视频 | 香蕉视频网址 | 久色 网 | 国产精品福利在线播放 | av网站在线免费观看 | 天天操天天透 | 久久视频一区二区 | 日韩欧美精品一区 | av888av.com| 99热这里只有精品国产首页 | 中文字幕欲求不满 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 久草热视频 | 成人毛片在线观看视频 | 久久久久亚洲精品国产 | 日韩a免费 | 国产精品久久久久久久久久妇女 | 成人黄色影片在线 | 久一网站 | 五月激情天 | 91免费高清在线观看 | 99亚洲视频| 国产在线a视频 | 天天色天天干天天色 | 国产精品伦一区二区三区视频 | 亚洲五月激情 | 色在线国产 | 婷婷九九 | 免费看污黄网站 | 美女一级毛片视频 | 99精品国产99久久久久久97 | 国产一区视频导航 | 久久国产精品色婷婷 | 免费观看成人 | 91亚洲夫妻 | 在线中文字幕播放 | 在线观看av中文字幕 | 在线你懂的视频 | 国产麻豆剧传媒免费观看 | 伊人婷婷综合 | 成人中文字幕在线 | 日韩专区 在线 | 最新极品jizzhd欧美 | 中文av字幕在线观看 | 日韩三级.com | 日韩电影中文字幕在线观看 | av一级片| 亚洲 欧洲 国产 日本 综合 | 91精品黄色 | 五月开心激情 | 超碰97国产在线 | 亚洲国产精品500在线观看 | 在线成人短视频 | 四虎成人精品在永久免费 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 国产女做a爱免费视频 | 中文字幕资源站 | 日韩av视屏在线观看 | 毛片3 | 九九精品视频在线观看 | 亚洲国产mv | 五月天婷婷丁香花 | 99精品国产99久久久久久97 | 免费a v网站 | 国产精品电影一区 | 热久久国产精品 | 国产片网站| 日韩欧美第二页 | 91高清视频在线 | 日日操天天操狠狠操 | 欧美精品一区二区在线观看 | 521色香蕉网站在线观看 | av电影在线观看完整版一区二区 | 九九热精 | 欧美激情视频在线观看免费 | 在线观看视频福利 | 色91av| 青青河边草免费观看完整版高清 | 欧美大片在线观看一区 | 三级黄免费看 | 91香蕉视频在线 | 超碰人人乐 | 色资源网在线观看 | 免费观看一级一片 | 91禁在线观看 | 97超碰在线播放 | 欧美天天综合网 | 一区二区三区福利 | 美女精品国产 | 在线观看91网站 | 五月激情在线 | 精品人人人 | 天天干天天天天 | 日韩av成人在线观看 | 91视频在线看 | 亚洲综合在线播放 | 日韩免费播放 | 精品国产欧美一区二区三区不卡 | 久久免费观看少妇a级毛片 久久久久成人免费 | 日韩中文字幕免费在线播放 | 国产精品久久久久国产精品日日 | 精品国产乱码久久久久久久 | 亚洲精品美女在线观看播放 | 欧美日韩电影在线播放 | 国产精品午夜av | 国产在线一区二区三区播放 | 亚洲精品日韩在线观看 | 国产精品 999| www色com | 亚洲成av人影院 | 日韩色爱 | 精品无人国产偷自产在线 | 最近中文字幕国语免费av | 欧美天天综合网 | 欧美精品在线观看一区 | 久久久久久久久久久黄色 | 香蕉影院在线观看 | 国产又黄又爽无遮挡 | 91桃色免费视频 | 日韩字幕| 五月天狠狠操 | 日日干天天射 | 婷婷色影院| 亚洲精品午夜视频 | 国产一级淫片免费看 | 午夜视频黄 | 国产精品久久99综合免费观看尤物 | 国产乱码精品一区二区蜜臀 | 国产精品免费观看在线 | 五月天婷亚洲天综合网精品偷 | 91高清视频在线 | 久久精品国产v日韩v亚洲 | 精品国产1区2区3区 国产欧美精品在线观看 | 极品久久久 | 亚洲视频在线看 | 丰满少妇在线观看 | 国内精品久久久久久久97牛牛 | 欧美日韩国产二区三区 | 一性一交视频 | aaawww| 在线视频欧美日韩 | 国产视频在线观看一区 | 人人爽人人爽人人爽 | 你操综合 | 亚洲国产福利视频 |