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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

从源码角度看Android系统init进程启动过程

發布時間:2025/1/21 Android 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从源码角度看Android系统init进程启动过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

init進程是Linux系統中用戶空間的第一個進程,進程號為1。Kernel啟動后,在用戶空間啟動init進程,并調用/system/core/init.cpp中的main方法執行一些重要的工作。

備注:本文將結合Android8.0的源碼看init進程的啟動過程以及init進程做了哪些重要工作。

1. init進程啟動前系統的啟動流程

在引入init進程前,我們需要大致了解系統是如何走到init進程的。大致步驟如下:

  • 啟動電源和系統啟動

    按下電源,讓設備開機時引導芯片代碼會從預定義的地方開始執行。加載引導程序BootLoader到RAM中。

  • BootLoader

    BootLoader只是Android系統開始前的一個引導程序,主要作用是將OS系統拉起來并運行。

  • 啟動Linux內核

    當內核啟動時,會先去設置緩存、加載驅動等,在系統設置完成后,會在系統文件中尋找init.rc文件,并啟動init進程。

  • 啟動init進程

    經過前面的步驟,到這一步,init就被正式啟動。

  • init進程啟動后,下面就看下它里面的一些重要的職責工作。

    2. init進程main函數

    main函數是init進程的入口函數,代碼位置在:

    /system/core/init.cpp

    深入到init.cpp的main函數中:

    int main(int argc, char** argv) {...省略...if (is_first_stage) {boot_clock::time_point start_time = boot_clock::now();// Clear the umask.umask(0);//創建和掛載啟動所需的文件目錄mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");mkdir("/dev/pts", 0755);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);gid_t groups[] = { AID_READPROC };setgroups(arraysize(groups), groups);mount("sysfs", "/sys", "sysfs", 0, NULL);mount("selinuxfs", "/sys/fs/selinux", "selinuxfs", 0, NULL);mknod("/dev/kmsg", S_IFCHR | 0600, makedev(1, 11));mknod("/dev/random", S_IFCHR | 0666, makedev(1, 8));mknod("/dev/urandom", S_IFCHR | 0666, makedev(1, 9));//初始化Kernel的LogInitKernelLogging(argv);...省略...}...省略...//創建一塊共享的內存空間,用于對屬性服務進行初始化property_init();...省略...//創建epoll句柄epoll_fd = epoll_create1(EPOLL_CLOEXEC);if (epoll_fd == -1) {PLOG(ERROR) << "epoll_create1 failed";exit(1);}//初始化子進程退出的信號處理函數//如果子進程異常退出,init進程會調用該函數中設定的信號處理函數來進程處理//防止子進程成為僵尸進程signal_handler_init();//加載default.prop文件,導入默認的環境變量property_load_boot_defaults();export_oem_lock_status();//啟動屬性服務器,會調用epoll_ctl設置property fd可讀的回調函數start_property_service();...省略...if (bootscript.empty()) {//解析init.rc文件parser.ParseConfig("/init.rc");parser.set_is_system_etc_init_loaded(parser.ParseConfig("/system/etc/init"));parser.set_is_vendor_etc_init_loaded(parser.ParseConfig("/vendor/etc/init"));parser.set_is_odm_etc_init_loaded(parser.ParseConfig("/odm/etc/init"));} else {parser.ParseConfig(bootscript);parser.set_is_system_etc_init_loaded(true);parser.set_is_vendor_etc_init_loaded(true);parser.set_is_odm_etc_init_loaded(true);}...省略...//不要在充電器模式下掛載文件系統或啟動核心系統服務std::string bootmode = GetProperty("ro.bootmode", "");if (bootmode == "charger") {am.QueueEventTrigger("charger");} else {am.QueueEventTrigger("late-init");}//基于屬性的當前狀態運行所有屬性觸發器 am.QueueBuiltinAction(queue_property_triggers_action, "queue_property_triggers");while (true) {// By default, sleep until something happens.int epoll_timeout_ms = -1;if (!(waiting_for_prop || ServiceManager::GetInstance().IsWaitingForExec())) {am.ExecuteOneCommand();}if (!(waiting_for_prop || ServiceManager::GetInstance().IsWaitingForExec())) {//重啟需要重啟的服務restart_processes();// If there's a process that needs restarting, wake up in time for that.if (process_needs_restart_at != 0) {epoll_timeout_ms = (process_needs_restart_at - time(nullptr)) * 1000;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;}epoll_event 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)();}}return 0; }

    init進程執行完成后,就進入循環等待epoll_wait的狀態。init的main函數中做了大量初始化工,比較復雜。我主要學習了如下幾個關鍵點:

  • 創建和掛載啟動的文件

  • 屬性服務

  • 進程信號處理

  • 解析init.rc文件

  • init啟動Zygote

  • 3. 創建和掛載啟動的文件

    在最開始的時候就創建和掛載啟動所需要的文件目錄,其中掛載了:

    • tempfs

    • devpts

    • proc

    • sysfs

    • selinuxfs

    共掛載了這五個系統,這些都是系統運行時的目錄,只有當系統運行時才會存在,當系統停止時,這些目錄就不會存在。

    4. 屬性服務

    在Windows上有一個注冊表管理器,主要采用的是鍵值對的形式來記錄用戶、軟件的一些信息。即使系統或軟件重啟,還是能根據之前注冊表中的記錄,進行初始化工作。在Android系統中,也有一個類似的機制,叫作屬性服務。

    當某個進程通過property_set()方法修改屬性后,init進程會先檢查權限,當權限驗證通過后,就會去修改相應的屬性值,而屬性值一旦改變,就會觸發相應的觸發器(即rc文件中的on開頭的語句),在Android Shared Memmory(共享內存區)中有一個_system_property_area_區域,里面存儲這所有的屬性值。某個進程通過property_get()方法,獲取的也是這個共享內存區域的屬性值。

    在init.cpp的main函數中與屬性服務相關的代碼有如下兩行:

    路徑:system/core/init/init.cpp

    property_init();start_property_service();

    這兩行代碼主要是初始化屬性服務配置并啟動屬性服務。

    4.1 初始化共享內存并啟動屬性服務

    4.1.1 property_init

    深入到/system/core/init/property_service.cpp中:

    void property_init() {if (__system_property_area_init()) {LOG(ERROR) << "Failed to initialize property area";exit(1);} }

    這個方法的主要核心是執行__system_property_area_init()方法,初始化跨進程的共享內存。

    4.1.2 start_property_service

    深入到/system/core/init/property_service.cpp中:

    void start_property_service() {property_set("ro.property_service.version", "2");property_set_fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,0666, 0, 0, NULL);//注釋1if (property_set_fd == -1) {PLOG(ERROR) << "start_property_service socket creation failed";exit(1);}listen(property_set_fd, 8);//注釋2register_epoll_handler(property_set_fd, handle_property_set_fd);//注釋3 }

    注釋解析說明:

    注釋1:創建名為“property_service”的Socket。

    注釋2:調用listen函數對property_set_fd進行監聽,這里的Socket就成為了server,即屬性服務。其中,參數8表示可以同時為8個試圖設置屬性的用戶提供服務。

    注釋3:將property_set_fd放入到epoll中,用epoll來監聽property_set_fd,當property_set_fd中有數據變動時,init進程將調用handle_property_set_fd函數進行處理。

    其中,epoll是Linux內核為處理大批量文件描述符而做了改進的poll,能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率。

    4.2 服務端請求屬性服務處理數據

    上面說了當客戶端請求屬性服務處理數據時,會調用handle_property_set_fd函數進行處理。

    4.2.1 handle_property_set_fd

    深入到/system/core/init/property_service.cpp的handle_property_set_fd方法中:

    static void handle_property_set_fd() {static constexpr uint32_t kDefaultSocketTimeout = 2000; /* ms */...省略... uint32_t timeout_ms = kDefaultSocketTimeout;//設置2秒超時uint32_t cmd = 0;if (!socket.RecvUint32(&cmd, &timeout_ms)) {PLOG(ERROR) << "sys_prop: error while reading command from the socket";socket.SendUint32(PROP_ERROR_READ_CMD);return;}switch (cmd) {case PROP_MSG_SETPROP: {char prop_name[PROP_NAME_MAX];char prop_value[PROP_VALUE_MAX];//如果2秒內Socket沒有讀取到數據則直接返回if (!socket.RecvChars(prop_name, PROP_NAME_MAX, &timeout_ms) ||!socket.RecvChars(prop_value, PROP_VALUE_MAX, &timeout_ms)) {PLOG(ERROR) << "sys_prop(PROP_MSG_SETPROP): error while reading name/value from the socket";return;}prop_name[PROP_NAME_MAX-1] = 0;prop_value[PROP_VALUE_MAX-1] = 0;//調用handle_property_set方法去處理數據handle_property_set(socket, prop_value, prop_value, true);break;}...省略...} }

    從上面可以看到Android8.0繼續封裝了handle_property_set方法去處理數據。

    4.2.2 handle_property_set

    深入到/system/core/init/property_service.cpp的handle_property_set方法中:

    static void handle_property_set(SocketConnection& socket,const std::string& name,const std::string& value,bool legacy_protocol) {const char* cmd_name = legacy_protocol ? "PROP_MSG_SETPROP" : "PROP_MSG_SETPROP2";if (!is_legal_property_name(name)) {//檢查屬性名是否合法,不合法直接returnLOG(ERROR) << "sys_prop(" << cmd_name << "): illegal property name \"" << name << "\"";socket.SendUint32(PROP_ERROR_INVALID_NAME);return;}struct ucred cr = socket.cred();char* source_ctx = nullptr;getpeercon(socket.socket(), &source_ctx);//如果屬性名稱以“ctl.”開頭,則說明是控制屬性if (android::base::StartsWith(name, "ctl.")) {//檢查權限if (check_control_mac_perms(value.c_str(), source_ctx, &cr)) {//如果滿足權限,則直接設置以ctl.開頭的屬性handle_control_message(name.c_str() + 4, value.c_str());if (!legacy_protocol) {socket.SendUint32(PROP_SUCCESS);}} else {LOG(ERROR) << "sys_prop(" << cmd_name << "): Unable to " << (name.c_str() + 4)<< " service ctl [" << value << "]"<< " uid:" << cr.uid<< " gid:" << cr.gid<< " pid:" << cr.pid;if (!legacy_protocol) {socket.SendUint32(PROP_ERROR_HANDLE_CONTROL_MESSAGE);}}} else {//不是以“ctl.”開頭,則說明是普通屬性if (check_mac_perms(name, source_ctx, &cr)) {//調用property_set方法來設置普通屬性uint32_t result = property_set(name, value);if (!legacy_protocol) {socket.SendUint32(result);}} else {LOG(ERROR) << "sys_prop(" << cmd_name << "): permission denied uid:" << cr.uid << " name:" << name;if (!legacy_protocol) {socket.SendUint32(PROP_ERROR_PERMISSION_DENIED);}}}freecon(source_ctx); }

    綜上所述,會先檢查屬性名是否合法,在滿足合法的條件后;判斷屬性名是否是以“ctl.”開頭;如果是,則通過handle_control_message去設值;如果不是,則通過調用property_set方法來設值。

    4.2.3 property_set

    深入到/system/core/init/property_service.cpp的property_set方法中:

    uint32_t property_set(const std::string& name, const std::string& value) {size_t valuelen = value.size();//判斷屬性名是否合法if (!is_legal_property_name(name)) {LOG(ERROR) << "property_set(\"" << name << "\", \"" << value << "\") failed: bad name";return PROP_ERROR_INVALID_NAME;}//屬性名不能過長if (valuelen >= PROP_VALUE_MAX) {LOG(ERROR) << "property_set(\"" << name << "\", \"" << value << "\") failed: "<< "value too long";return PROP_ERROR_INVALID_VALUE;}if (name == "selinux.restorecon_recursive" && valuelen > 0) {if (restorecon(value.c_str(), SELINUX_ANDROID_RESTORECON_RECURSE) != 0) {LOG(ERROR) << "Failed to restorecon_recursive " << value;}}//從屬性存儲空間中查找該屬性prop_info* pi = (prop_info*) __system_property_find(name.c_str());//屬性如果存在if (pi != nullptr) {// 如果屬性名是以“.ro”開頭,表示只讀,不能修改,直接返回if (android::base::StartsWith(name, "ro.")) {LOG(ERROR) << "property_set(\"" << name << "\", \"" << value << "\") failed: "<< "property already set";return PROP_ERROR_READ_ONLY_PROPERTY;}// 如果屬性存在,則就去更新__system_property_update(pi, value.c_str(), valuelen);} else {//屬性如果不存在,則添加該屬性int rc = __system_property_add(name.c_str(), name.size(), value.c_str(), valuelen);if (rc < 0) {LOG(ERROR) << "property_set(\"" << name << "\", \"" << value << "\") failed: "<< "__system_property_add failed";return PROP_ERROR_SET_FAILED;}}// 處理以“persist.”開頭的屬性名if (persistent_properties_loaded && android::base::StartsWith(name, "persist.")) {write_persistent_property(name.c_str(), value.c_str());}property_changed(name, value);return PROP_SUCCESS; }

    綜上所述,property_set主要是處理普通屬性。先判斷屬性名是否合法,屬性名長度是否過長?在滿足一系列條件判斷后,再到存儲空間中去查找是否有該屬性;如果有,且是以“.ro”開頭的,表示只讀,不能修改,直接return,如果有,但不是以“.ro”開頭,則去update;如果存儲空間中沒有該屬性,則添加該屬性,并賦值。最后還調用了write_persistent_property方法處理了以“persist.”開頭的屬性名。需要注意的是persist用于持久保存某些屬性值,但會帶來額外的IO操作。

    如果是以“ctl.”開頭,則表示控制消息,控制消息主要用來執行一些命令,例如:

    • 查看開機動畫(setprop ctl.start bootanim)

    • 關閉開機動畫(setprop ctl.stop bootanim)

    • 進入recovery模式(setprop ctl.start pre-recovery)

    5. 進程信號處理

    在/system/core/init/init.cpp的main方法中,通過調用signal_handler_init方法來初始化信號處理進程。

    5.1 signal_handler_init

    深入到/system/core/init/signal_handler.cpp的signal_handler_init方法中:

    void signal_handler_init() {// 創建socket pairint s[2];if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0, s) == -1) {PLOG(ERROR) << "socketpair failed";exit(1);}signal_write_fd = s[0];signal_read_fd = s[1];// 當捕獲到信號SIGCHLD,則寫入signal_write_fdstruct sigaction act;memset(&act, 0, sizeof(act));act.sa_handler = SIGCHLD_handler;//SA_NOCLDSTOP使init進程只有在其子進程終止時才會收到SIGCHLD信號act.sa_flags = SA_NOCLDSTOP;sigaction(SIGCHLD, &act, 0);//進入waitpid來處理子進程是否退出的情況ServiceManager::GetInstance().ReapAnyOutstandingChildren();//詳情見5.2//調用epoll_ctl方法來注冊epoll的回調函數register_epoll_handler(signal_read_fd, handle_signal);//詳情見5.3 }

    init進程是所有用戶空間進程的父進程,當子進程終止時會產生SIGCHLD信號,此時init進程會調用信號安裝函數sigaction,然后將SIGCHLD作為參數傳遞給sigaction結構體,從而完成信號處理的過程。

    其中,SIGCHLD_handler是寫入數據的函數:

    static void SIGCHLD_handler(int) {//向signal_write_fd寫入1,直到成功為止if (TEMP_FAILURE_RETRY(write(signal_write_fd, "1", 1)) == -1) {PLOG(ERROR) << "write(signal_write_fd) failed";} }

    handle_signal是讀取數據的函數:

    static void handle_signal() {// Clear outstanding requests.char buf[32];//讀取signal_read_fd中的數據,并放入bufread(signal_read_fd, buf, sizeof(buf));ServiceManager::GetInstance().ReapAnyOutstandingChildren(); }

    5.2 ServiceManager::GetInstance().ReapAnyOutstandingChildren

    下面來看看處理子進程是否退出的流程:

    深入到/system/core/init/service.cpp的ServiceManager::ReapAnyOutstandingChildren中:

    void ServiceManager::ReapAnyOutstandingChildren() {while (ReapOneProcess()) {} }

    繼續深入到ReapOneProcess方法中:

    bool ServiceManager::ReapOneProcess() {int status;//等待任意子進程,如果子進程沒有退出則返回0,否則則返回該子進程pidpid_t pid = TEMP_FAILURE_RETRY(waitpid(-1, &status, WNOHANG));if (pid == 0) {return false;} else if (pid == -1) {PLOG(ERROR) << "waitpid failed";return false;}//根據pid查找到相應的serviceService* svc = FindServiceByPid(pid);std::string name;std::string wait_string;if (svc) {name = android::base::StringPrintf("Service '%s' (pid %d)",svc->name().c_str(), pid);if (svc->flags() & SVC_EXEC) {wait_string =android::base::StringPrintf(" waiting took %f seconds", exec_waiter_->duration_s());}} else {name = android::base::StringPrintf("Untracked pid %d", pid);}if (WIFEXITED(status)) {LOG(INFO) << name << " exited with status " << WEXITSTATUS(status) << wait_string;} else if (WIFSIGNALED(status)) {LOG(INFO) << name << " killed by signal " << WTERMSIG(status) << wait_string;} else if (WIFSTOPPED(status)) {LOG(INFO) << name << " stopped by signal " << WSTOPSIG(status) << wait_string;} else {LOG(INFO) << name << " state changed" << wait_string;}if (!svc) {return true;}svc->Reap();//當flags為EXEC時,重置相應的服務if (svc->flags() & SVC_EXEC) {exec_waiter_.reset();}//當flags為EXEC時,釋放相應的服務if (svc->flags() & SVC_TEMPORARY) {RemoveService(*svc);}return true; }

    5.3 register_epoll_handler

    register_epoll_handler是用來注冊epoll的回調函數

    深入到/system/core/init/init.cpp的register_epoll_handler方法中:

    void register_epoll_handler(int fd, void (*fn)()) {epoll_event ev;ev.events = EPOLLIN;ev.data.ptr = reinterpret_cast<void*>(fn);//將fd的可讀事件加入到epoll_fd的監聽隊列中if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) {PLOG(ERROR) << "epoll_ctl failed";} }

    當fd為可讀的時候,則會觸發調用(*fn)函數。

    5.4 要點總結:

    5.4.1 signal_handler_init的作用

    主要是防止init進程的子進程成為僵尸進程,系統會在子進程暫停或停止的時候發出SIGCHLD信號,而signal_handler_init方法會對系統發出的SIGCHLD信號進行處理,這樣就防止了僵尸進程的出現。

    5.4.2 什么是僵尸進程?

    在Linux中,父進程是通過fork的方式創建子進程,在子進程終止的時候,如果父進程不知道子進程已經停止,那么此時就算子進程退出,在系統進程表中還會保留一些子進程的信息(如進程號、運行時間、狀態等),那么這個子進程就成為了所謂的僵尸進程。但系統進程表中的資源空間是有限的,如果被僵尸進程耗盡,系統就無法創建新的進程。

    6. 解析init.rc文件

    init.rc是由Android初始化語言(Android Init Language)編寫的腳本。rc文件的語法是以行尾為單位,以空格間隔,用#開始代表注釋行。rc文件主要包含了5中類型的語句,分別是:Action、Command、Option、Service和Import。init.rc文件的目錄在system/core/rootdir/init.rc中。

    6.1 Action

    Action類型的語句是通過觸發器觸發,格式如下:

    on <trigger> [&& <trigger>] //設置觸發器<command><command> //動作觸發后要執行的命令

    即以on開頭的語句來決定執行相應service的時機,具體時機有如下幾個:

    • on early-init 在初始化早期觸發

    • on init 在初始化時觸發

    • on late-init 在初始化晚期觸發

    • on boot/charger 當系統啟動或充電時觸發

    • on property:= 當屬性值滿足條件時觸發

    6.2 Command

    列舉一些常用的命令:

    • loglevel : 設置log級別

    • start : 啟動指定的服務,如果已經啟動則跳過

    • stop : 停止正在運行的服務

    • export : 設定環境變量

    • setprop : 設置屬性值

    • write : 向文件path中寫入字符串

    6.3 Service

    以service開頭的是由init進程啟動,一般都是運行在init的某個子進程中。

    service類型的語句,格式如下:

    service <name> <pathname> [<argument>]* //<service的名><執行程序的路徑><傳遞參數><option> //option是service的修飾詞,影響什么時候、如何啟動service<option>

    注意:在Android8.0對init.rc文件進行拆分,每個服務對應一個rc文件。

    這里以64位處理器為例,Zygote啟動腳本則在init.zygote64.rc中定義。

    init.zygote64.rc的代碼如下:(目錄:system/core/rootdir/init.zygote64.rc)

    service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-serverclass mainpriority -20user rootgroup root readprocsocket 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類型語句格式大致解析下:

    • service用于通知init進程創建名為zygote進程

    • 執行程序的路徑是/system/bin/app_process64

    • 傳遞的參數是/system/bin --zygote --start-system-server

    • class main 是指Zygote的classname為main

    init.rc中Action、Service語句都有相應的XXXParser類來解析。即Action類型會有ActionParser來進行解析,Service類型會有ServiceParser來解析。

    因為后面分析Zygote,所以主要看下ServiceParser,ServiceParser的代碼目錄是:

    system/core/init/service.cpp

    深入到service.cpp中查看:

    bool ServiceParser::ParseSection(const std::vector<std::string>& args,std::string* err) {if (args.size() < 3) { //判斷service是否有name與可執行程序*err = "services must have a name and a program";return false;}const std::string& name = args[1];if (!IsValidName(name)) { //檢查service的name是否有效*err = StringPrintf("invalid service name '%s'", name.c_str());return false;}std::vector<std::string> str_args(args.begin() + 2, args.end());service_ = std::make_unique<Service>(name, str_args);//注釋1return true; }bool ServiceParser::ParseLineSection(const std::vector<std::string>& args,const std::string& filename, int line,std::string* err) const {return service_ ? service_->ParseLine(args, err) : false;//注釋2 }void ServiceParser::EndSection() {if (service_) {ServiceManager::GetInstance().AddService(std::move(service_));//注釋3} }void ServiceManager::AddService(std::unique_ptr<Service> service) {Service* old_service = FindServiceByName(service->name());if (old_service) {LOG(ERROR) << "ignored duplicate definition of service '" << service->name() << "'";return;}services_.emplace_back(std::move(service)); }

    注釋說明:

    • 注釋1:調用ParseSection方法,根據傳入的參數創建出一個Service參數

    • 注釋2:調用ParseLineSection方法解析出Service語句中的每一個子項,并將內容添加到Service對象中

    • 注釋3:解析完所有數據后,調用EndSection函數,內部調用ServiceManager中的AddService函數,將Service對象加入vector類型的Service鏈表中。

    6.4 Option

    option是配合service使用,是Service中的可選項。

    * socket : 創建名為/dev/socket/<name>的socket* user : 設置執行服務的用戶,默認是root* group : 設置執行服務的用戶組,默認是root* onrestart : 當服務重啟時執行相應的命令* oneshot : service退出后不再重啟* disabled : 不隨class自動啟動,只有根據service名才啟動

    7. init啟動Zygote

    這里我們同樣以64位處理器為例,由前面可知,Zygote啟動腳本在system/core/rootdir/init.zygote64.rc中:

    service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-serverclass mainpriority -20user rootgroup root readprocsocket 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

    從上面可知zygote的classname是main

    在init.rc中有如下兩行配置:

    目錄:system/core/rootdir/init.rc

    on nonencryptedclass_start main //注釋1class_start late_start

    其中,class_start是一個COMMAND,對應的函數是do_class_start。注釋1處表明啟動那些classname為main的service,而zygote的classname是main,所以這里是用來啟動Zygote的。

    深入到do_class_start函數中:

    目錄:system/core/init/builtins.cpp

    static int do_class_start(const std::vector<std::string>& args) {ServiceManager::GetInstance().ForEachServiceInClass(args[1], [] (Service* s) { s->StartIfNotDisabled(); });return 0; }

    do_class_start()函數中會遍歷前面的Vector類型的Service鏈表,找到classname為main的Zygote,并調用system/core/init/service.cpp中的StartIfNotDisabled()函數:

    bool Service::StartIfNotDisabled() {if (!(flags_ & SVC_DISABLED)) { //注釋1return Start();} else {flags_ |= SVC_DISABLED_START;}return true; }

    在注釋1處,如果Service中沒有在其對應的rc文件中設置disabled選項,則會調用Start函數啟動該Service,因為Zygote對應的init.zygote64.rc中沒有設置disable選項,所以直接調用Start函數啟動該Service

    bool Service::Start() {// 如果Service已經運行,則直接returnif (flags_ & SVC_RUNNING) {return false;}...省略...// 判斷需要啟動的Service的對應的執行文件是否存在,不存在則不啟動該Servicestruct stat sb;if (stat(args_[0].c_str(), &sb) == -1) {PLOG(ERROR) << "cannot find '" << args_[0] << "', disabling '" << name_ << "'";flags_ |= SVC_DISABLED;return false;}...省略...// 如果子進程沒有啟動,則調用fork函數創建子進程,并返回pid的值pid_t pid = -1;if (namespace_flags_) {pid = clone(nullptr, nullptr, namespace_flags_ | SIGCHLD, nullptr);} else {pid = fork();}// 如果pid=0,則表示當前代碼邏輯在子進程中運行if (pid == 0) {umask(077);...省略...//調用execve函數,啟動Service子進程if (execve(strs[0], (char**) &strs[0], (char**) ENV) < 0) { //注釋1PLOG(ERROR) << "cannot execve('" << strs[0] << "')";}_exit(127);}...省略...NotifyStateChange("running");return true; }

    綜上所述:

    • 首先判斷Service是否已經啟動,如果運行了,則直接返回。

    • 如果子進程沒有啟動,就調用fork函數創建子進程,并返回pid的值

    • 如果返回pid的值是0,則表示當前代碼邏輯在子進程中運行

    • 注釋1處在子進程中調用execve函數,Service子進程就會被啟動,并進入到該Service的main函數中。

    如果該Service是Zygote,從前面的system/core/rootdir/init.zygote64.rc文件中我們可以知道Zygote執行程序的路徑是/system/bin/app_process64,對應的文件是app_main.cpp,這樣就會進入app_main.cpp的main函數中,即Zygote的main函數中:

    代碼路徑:frameworks/base/cmds/app_process/app_main.cpp

    main函數如下:

    int main(int argc, char* const argv[]) {...省略...if (zygote) {runtime.start("com.android.internal.os.ZygoteInit", args, zygote); //注釋1} else if (className) {runtime.start("com.android.internal.os.RuntimeInit", args, zygote);} else {fprintf(stderr, "Error: no class name or --zygote supplied.\n");app_usage();LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");} }

    在注釋1處調用runtime的start函數啟動Zygote,到此Zygote進程就啟動了。

    8. init進程啟動總結

    init進程是Linux系統中用戶空間的第一個進程,主要做了如下工作:

    • 創建和掛載啟動所需要的文件目錄

    • 創建一塊共享內存,初始化和啟動屬性服務

    • 解析各個rc文件,啟動相應屬性服務進程(如:Zygote)

    • 初始化epoll,依次設置signal、property、keychord這三個fd可讀時相對應的回調函數

    • 子進程信號處理,防止系統中出現僵尸進程

    非常感謝您的耐心閱讀,希望我的文章對您有幫助。歡迎點評、轉發或分享給您的朋友或技術群。

    總結

    以上是生活随笔為你收集整理的从源码角度看Android系统init进程启动过程的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    麻豆视频观看 | 99久热在线精品视频观看 | 黄色三级视频片 | 亚洲最大免费成人网 | 开心激情五月婷婷 | 天天草天天色 | 中文字幕久久精品 | 免费高清在线视频一区· | 国产日产精品一区二区三区四区的观看方式 | 操处女逼 | 亚洲欧洲中文日韩久久av乱码 | 日韩精品一区二区三区三炮视频 | 天天综合网 天天 | 免费在线a | 色综合久久久久 | 久久综合色婷婷 | www色av| 欧美日韩免费在线观看视频 | 国产免费高清 | 欧美乱大交 | 国产一区二区午夜 | 成年人黄色av | www.午夜色.com| 日韩国产高清在线 | av 一区二区三区四区 | 一区二区精品在线观看 | 国产人成一区二区三区影院 | 成人一区二区在线 | 久久精国产 | 草久在线观看视频 | 亚洲国产视频网站 | 欧美极品xxx | 久久综合国产伦精品免费 | 93久久精品日日躁夜夜躁欧美 | 亚洲一区免费在线 | 国外成人在线视频网站 | 午夜精品久久久久久久99 | 国产一级免费电影 | 操久在线| 免费看片网站91 | 一区二区三区免费在线观看 | 久久久久久久影院 | 国产日产欧美在线观看 | 最近中文字幕大全中文字幕免费 | 亚洲日韩中文字幕在线播放 | 亚洲久草视频 | 亚洲成a人片77777潘金莲 | 久久精品理论 | 黄色影院在线免费观看 | 网址你懂的在线观看 | 激情av一区二区 | 国产在线视频在线观看 | 国产女人18毛片水真多18精品 | 91视频在线观看免费 | 91最新网址 | 最新av网站在线观看 | 国产精品九九视频 | 91麻豆看国产在线紧急地址 | 国产成人精品一区二 | www视频在线免费观看 | 97免费| 一级理论片在线观看 | 亚洲在线黄色 | 亚洲网站在线看 | 日韩精品一区在线观看 | 国产色黄网站 | 国产手机视频在线播放 | 色网址99| 九九激情视频 | 亚洲精品字幕在线 | 在线亚洲午夜片av大片 | 激情久久一区二区三区 | 亚洲成人动漫在线观看 | 奇米影视四色8888 | 国产1区在线 | 久久毛片高清国产 | 夜夜夜精品 | 亚洲欧美少妇 | 97人人爽 | 久久久国产成人 | 91看片在线播放 | 国产美女在线观看 | 色欲综合视频天天天 | 在线视频a| 成人丝袜 | 国产精品久久久网站 | 久久99久久99精品免视看婷婷 | 一区二区理论片 | 麻豆国产在线播放 | 国产福利免费在线观看 | 在线免费观看黄色小说 | 久久爱导航 | www.亚洲视频 | 中文字幕日韩精品有码视频 | 深爱婷婷| 免费黄在线看 | 亚洲精品一区二区精华 | 五月激情久久 | 麻豆精品传媒视频 | 91av亚洲| 涩涩网站在线观看 | av黄色国产 | 黄色三级视频片 | 中文字幕久久精品 | 亚洲成人中文在线 | 国产一级性生活视频 | 色综合久久88色综合天天免费 | 日韩精品中文字幕在线不卡尤物 | 国产成人a亚洲精品v | 亚洲桃花综合 | 黄色国产在线观看 | 久久在线观看 | 欧美精品国产精品 | 亚洲在线视频免费 | 色视频在线 | 国产一级不卡视频 | 婷婷九月激情 | 午夜丁香网 | 日本黄色大片儿 | 在线成人性视频 | 久久久久国产精品免费免费搜索 | 国产乱对白刺激视频在线观看女王 | 久久欧美视频 | 国产精品一区二区三区在线播放 | 国产成人精品三级 | 国产亚洲一区二区在线观看 | 色综合久久久久综合体 | 久久福利在线 | 国产最新福利 | 国产免费又爽又刺激在线观看 | 91社区国产高清 | 九七视频在线观看 | 一区二区三区国产欧美 | 午夜在线观看影院 | 色www精品视频在线观看 | 日本视频不卡 | 中文字幕在线日 | 人人看人人 | 国产裸体无遮挡 | 婷婷精品国产欧美精品亚洲人人爽 | 日韩三级在线 | 欧美与欧洲交xxxx免费观看 | 狠狠干狠狠久久 | 韩日精品在线 | 91免费观看国产 | 黄色软件视频网站 | 在线观看黄a | 国产精品你懂的在线观看 | 韩国三级在线一区 | 91激情视频在线观看 | 久久久久精 | 欧美成人tv | 成人黄在线 | 午夜在线免费视频 | 日韩精品在线免费观看 | 一区三区视频 | 日韩免费不卡视频 | av动态图片 | av福利在线播放 | 四虎影视国产精品免费久久 | 久久国产成人午夜av影院潦草 | 国产成人精品亚洲a | 成人av资源站| 在线小视频 | aav在线| 免费福利视频导航 | 一区二区 久久 | 精品无人国产偷自产在线 | 亚洲日本韩国一区二区 | 免费美女久久99 | 久久久免费精品国产一区二区 | 久久成年人网站 | 国产99久| 在线亚洲天堂网 | 久久99热这里只有精品 | 国产欧美日韩视频 | 成全在线视频免费观看 | 99成人在线视频 | 91亚洲精品久久久蜜桃网站 | 91中文字幕永久在线 | 免费观看国产成人 | 婷婷免费视频 | 欧美性黄网官网 | 中文字幕资源网 国产 | 夜夜高潮夜夜爽国产伦精品 | 在线黄色国产 | 免费不卡中文字幕视频 | 亚洲男人天堂2018 | 精品国产一区二区三区久久久蜜臀 | 久草资源在线观看 | 香蕉网在线观看 | 精品欧美一区二区三区久久久 | 免费观看特级毛片 | 午夜.dj高清免费观看视频 | 久久97久久97精品免视看 | 久久久久久久久久电影 | 国模视频一区二区三区 | 欧美日韩一区二区免费在线观看 | 成人黄大片视频在线观看 | 欧美少妇18p | 免费成人av网站 | 五月花婷婷 | 玖玖精品视频 | 日韩动态视频 | 99久久精品国产亚洲 | 欧美性粗大hdvideo | 久久 地址 | 91在线免费公开视频 | 99久久www| 天天拍天天色 | 欧美人交a欧美精品 | 99久热在线精品视频成人一区 | 成人黄色大片网站 | 又大又硬又黄又爽视频在线观看 | 免费视频资源 | 久久免费视频2 | 欧美精品在线观看一区 | 日韩美视频 | 在线国产视频观看 | 九九热在线观看视频 | 精品女同一区二区三区在线观看 | 久久成人18免费网站 | 婷婷激情综合五月天 | 999成人精品| 成人av在线影视 | 99r在线播放 | 国产一级一级国产 | 国产一区91 | 成人免费色| 91亚洲精品久久久蜜桃借种 | 麻豆传媒在线视频 | 成年人免费看av | 欧美日韩不卡在线视频 | 天天视频色版 | 青青久草在线 | 国产五月色婷婷六月丁香视频 | 麻豆视频一区 | 日韩手机在线观看 | 97天天干| 色人久久 | 中文字幕在线观看完整版电影 | 欧美人操人 | 日韩久久久久久久久久久久 | 国产999精品 | av片一区二区 | 日韩精品免费一区二区在线观看 | 玖玖在线观看视频 | 人人射人人插 | 日韩久久视频 | 91日韩在线 | 国产成人91| av一级片在线观看 | 国产免费大片 | 日韩视频www | 中文av在线免费观看 | 亚洲va在线va天堂 | 久久国语 | 亚洲黄色免费电影 | 毛片网站免费在线观看 | 97在线观视频免费观看 | 成人试看120秒 | 免费看一及片 | 999成人网 | 亚洲国产精品va在线看黑人动漫 | 欧美a√在线| 夜夜嗨av色一区二区不卡 | 在线影院中文字幕 | 手机在线看永久av片免费 | av丝袜制服 | www.午夜| av电影一区 | 国产精品久久久久久爽爽爽 | 色www永久免费 | 91高清完整版在线观看 | 日日躁你夜夜躁你av蜜 | 国产精品白浆 | 91精品国产91久久久久福利 | 狠狠色丁香婷婷综合视频 | 91av精品| 特黄一级毛片 | 嫩草伊人久久精品少妇av | 国产91在线观 | 亚洲日本在线一区 | 91成人免费电影 | 成人黄色大片在线免费观看 | 色www.| 日韩在线视频网站 | 91久久丝袜国产露脸动漫 | 怡红院av久久久久久久 | 欧美与欧洲交xxxx免费观看 | 在线观看国产一区 | 国产高清专区 | 波多野结衣视频一区二区三区 | 超碰在线最新 | 精品特级毛片 | a级片韩国 | 日韩av手机在线看 | 日韩在线网址 | 久久免费毛片视频 | 中文字幕国产精品一区二区 | 久久成人一区二区 | www.少妇| 国产区免费在线 | 国产激情电影综合在线看 | 欧美福利久久 | 麻豆视频国产精品 | 日女人电影 | 波多野结衣在线观看视频 | 精品久久久99 | 天天射天天操天天干 | 亚洲免费视频观看 | 狠狠色丁香婷婷综合久久片 | 久热免费在线观看 | 天天天天天天操 | 成人免费观看网站 | 国产99久久久久久免费看 | 成人国产精品久久久春色 | 精品成人免费 | 色综合久久精品 | 婷婷六月天综合 | 91专区在线观看 | 亚洲视频在线观看免费 | 在线你懂的视频 | 美女av电影 | 国产精品密入口果冻 | 天天操比| 欧美色888 | 国产97色在线 | 国产成人专区 | 精品99在线视频 | 久久视频这里有久久精品视频11 | 最近中文字幕高清字幕免费mv | 九九久久影视 | 亚洲精品在线观看网站 | 69精品久久 | 天天鲁一鲁摸一摸爽一爽 | 精品91视频| 精品在线99 | 欧美性色综合网站 | 婷婷丁香激情网 | 五月天婷婷在线播放 | 最新的av网站 | 亚洲清纯国产 | 久久天堂精品视频 | 91九色免费视频 | 成人黄色电影视频 | 久久国语露脸国产精品电影 | 国产精品手机在线 | www视频在线播放 | 国偷自产视频一区二区久 | 亚洲理论在线 | 69国产盗摄一区二区三区五区 | 免费瑟瑟网站 | 国产一级免费播放 | 久久久影片 | 911精品视频 | 亚洲精品男人天堂 | 亚洲爱视频 | 国产精品一区二区电影 | 久久人人97超碰国产公开结果 | 免费a级大片| 亚洲国产偷 | 免费成人在线网站 | 国产成人333kkk | 国产精品日韩在线观看 | 在线观看国产高清视频 | 一本一本久久a久久精品综合妖精 | 在线视频专区 | 亚洲.www| 日韩精品免费在线观看视频 | 日韩精品91偷拍在线观看 | 美女福利视频网 | 色综合欧洲 | 久久久久久国产精品999 | 国产一区在线播放 | 国产手机视频在线 | 免费午夜在线视频 | 久久久精品高清 | 999久久久欧美日韩黑人 | 久久中文字幕导航 | 国产黄在线| 成人免费大片黄在线播放 | 五月婷婷,六月丁香 | 婷婷色婷婷 | 亚洲天堂网站 | a一片一级 | 一区二区三区日韩在线 | 全黄网站| 国产精品一区二区久久 | 色偷偷88欧美精品久久久 | 婷婷丁香在线视频 | 国产精品久久久久久一区二区 | 亚洲一区二区三区在线看 | 人人澡人人模 | 韩国av三级 | av一区二区三区在线播放 | 免费a级毛片在线看 | 人人爱夜夜操 | 国产明星视频三级a三级点| 97看片吧| 免费十分钟 | 97视频在线观看成人 | 日日夜夜天天射 | 日日操夜 | 日本xxxx.com | 亚洲国产欧美一区二区三区丁香婷 | 国产精品一区二区三区久久久 | 国产精品日韩久久久久 | 成年人在线视频观看 | 天堂av在线中文在线 | 国产精品福利一区 | 久久精品一区二区 | av不卡在线看| 亚洲日本精品视频 | 久久久国产精品免费 | 亚洲另类视频 | 日韩免费高清在线 | 成人视屏免费看 | 99久久精品费精品 | 午夜a区 | 最新的av网站| 精品久久久久久一区二区里番 | 午夜久草| 国产一区二区三区网站 | 欧美a影视 | 日韩女同一区二区三区在线观看 | 国产一区高清在线观看 | 中文字幕亚洲国产 | 中文字幕日韩精品有码视频 | 成人免费观看视频网站 | 日韩欧美一区二区三区在线 | 日韩黄色免费看 | 手机在线黄色网址 | 免费在线观看av不卡 | 97涩涩视频 | 国产成人精品久久久久蜜臀 | 黄网站a | 中文字幕欧美激情 | 五月婷婷爱 | 欧美特一级 | 久久新视频 | 正在播放国产一区 | 黄色免费网站大全 | 黄色av免费 | 中文字幕国产一区二区 | 久久综合五月天婷婷伊人 | 97电影网站 | 超碰97网站| 特级黄录像视频 | 亚洲一区 影院 | 一区二区三区久久精品 | 久免费视频 | 伊人中文在线 | 操综合 | 日韩精品专区在线影院重磅 | 免费久草视频 | 日韩在线观看你懂的 | 午夜电影中文字幕 | 亚洲色图 校园春色 | 国产剧情久久 | 成人国产精品免费 | 欧美午夜精品久久久久久孕妇 | 91精品伦理 | 四虎成人av | 婷婷久久网 | 国产精品午夜在线观看 | 亚洲精品乱码久久久久久9色 | 手机看片国产日韩 | 亚洲国产mv| 国产一区二区不卡在线 | 西西www4444大胆在线 | 精品日韩中文字幕 | 中文字幕一区二区在线观看 | 精品福利在线视频 | 成人中文字幕+乱码+中文字幕 | 亚洲国产精品电影 | 九色精品免费永久在线 | 亚洲电影自拍 | 久久精品久久精品久久精品 | 欧美黑人猛交 | 亚洲成人中文在线 | 日韩| 欧美日韩视频在线播放 | 成人av电影免费在线观看 | 天天骚夜夜操 | 综合网色| 国内精品久久久久久久影视简单 | 国产91精品欧美 | 久久视频这里有久久精品视频11 | 亚州成人av在线 | 91chinesexxx| 就要干b | 国产精品一区二区av麻豆 | 免费黄在线观看 | 日日夜夜天天干 | 干干夜夜 | 国产自在线观看 | 五月天九九 | 樱空桃av| 97超碰中文| 久久尤物电影视频在线观看 | 日韩黄色在线电影 | 成年人视频在线免费观看 | 日免费视频 | 欧美一区二区三区在线播放 | 天天爽天天射 | av在线进入 | 日韩在观看线 | 亚洲人xxx| 黄色在线网站噜噜噜 | 久久精品一区二区三区中文字幕 | 一区二区在线电影 | 超碰精品在线 | 人人干网站 | 在线黄色免费av | 三级视频日韩 | 国产精品麻豆果冻传媒在线播放 | 美女黄频在线观看 | 国产精品一码二码三码在线 | 五月天免费网站 | 在线国产日本 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 婷婷资源站 | 国产一级在线播放 | 青草视频免费观看 | 日韩电影在线看 | bayu135国产精品视频 | 欧美性极品xxxx娇小 | 最新中文字幕视频 | 免费激情在线电影 | 国产无套一区二区三区久久 | 97超碰人人澡 | 成人黄色片免费看 | 色香网 | 亚洲手机av | 国产精品久久久久久久午夜片 | 麻豆传媒视频在线播放 | 久久中文字幕在线视频 | 日韩精品久久久久久久电影竹菊 | 天天干夜夜操视频 | 天天天天天天干 | 国产精品永久在线观看 | 日韩激情片在线观看 | 17婷婷久久www | 天天色天天骑天天射 | 深爱激情开心 | 一区二区三区免费看 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 久99久中文字幕在线 | 国产福利在线免费观看 | 日韩精品久久久久久久电影竹菊 | 久久综合九色综合97婷婷女人 | 天天射成人 | 999视频在线播放 | 国产免费三级在线观看 | 国产成人a亚洲精品v | 免费观看mv大片高清 | 成年人电影毛片 | 国产精品99爱| 日韩经典一区二区三区 | 亚洲成aⅴ人在线观看 | 激情五月综合网 | 成人免费视频在线观看 | 91片网| 精品一区电影国产 | 99视频在线观看一区三区 | 五月天电影免费在线观看一区 | 在线日韩av| 国产爽妇网 | 亚洲黄色片一级 | 91视频com| 91porny九色在线播放 | 国产亚洲精品v | 久久国产品 | 国产人免费人成免费视频 | 亚洲伊人天堂 | 正在播放国产91 | 毛片黄色一级 | 亚洲精品免费在线观看视频 | 日韩成人黄色av | 狠狠激情中文字幕 | 久久激情影院 | 69av在线播放 | av福利在线 | 成人综合婷婷国产精品久久免费 | 99c视频高清免费观看 | 国产亚洲一区二区在线观看 | 国产区在线看 | 欧美午夜理伦三级在线观看 | 激情视频一区二区三区 | 欧美视频日韩视频 | 99精品国产99久久久久久福利 | 国产精品6| 超碰国产在线 | 国产福利免费在线观看 | 国产成人av综合色 | 99久久精品国产免费看不卡 | 91麻豆精品国产自产在线游戏 | 99欧美| 91麻豆精品91久久久久同性 | 久久久久久久亚洲精品 | 美女视频黄是免费的 | 国产精品video爽爽爽爽 | 久久人人爽人人片av | 麻豆一二| 久久久久女人精品毛片九一 | 国产第一二区 | 最新av免费 | 中文字幕亚洲综合久久五月天色无吗'' | 香蕉视频18 | av免费电影网站 | av 一区 二区 久久 | 日本xxxx.com| 国模精品在线 | 超碰97免费在线 | 精品久久精品 | 国内久久精品视频 | 国产视频中文字幕在线观看 | 91完整版| 91在线成人 | 天天爽夜夜爽人人爽一区二区 | 亚洲精品视频偷拍 | 久久国产精品一区二区三区 | 日韩理论在线观看 | 97在线视频观看 | 天天综合中文 | 91av观看 | 一级精品视频在线观看宜春院 | 91尤物国产尤物福利在线播放 | 香蕉视频日本 | 91久久久久久国产精品 | 日韩精品久久一区二区三区 | 久久精品视频在线观看免费 | 欧美日韩伦理一区 | 国产高清在线免费 | 色老板在线视频 | 色综合久久久久久中文网 | 日韩欧美一二三 | 波多野结衣综合网 | 日韩在线电影一区二区 | 丁香五月亚洲综合在线 | 久久久鲁| 国产人成看黄久久久久久久久 | www.婷婷com| 免费成人av电影 | 人人澡人人舔 | .国产精品成人自产拍在线观看6 | 国产精品剧情在线亚洲 | 丰满少妇在线观看网站 | 精品视频一区在线 | 久久综合久久鬼 | 夜夜躁日日躁 | 久久电影色| 在线成人观看 | 欧美日韩a视频 | 午夜久久久久 | 免费观看成年人视频 | av中文在线影视 | 日韩精品一区二区三区免费观看视频 | 久久精品国产一区二区三区 | 四川bbb搡bbb爽爽视频 | 成人网色| 亚洲视频在线观看网站 | 超碰97国产精品人人cao | 久久99网站| 国产色婷婷精品综合在线手机播放 | 看国产黄色大片 | 亚洲一区二区天堂 | 日韩 精品 一区 国产 麻豆 | 波多野结衣精品视频 | 日韩二区在线观看 | 久久精品国产精品亚洲精品 | 久久免费视频一区 | 国产精品福利在线观看 | 日韩成人免费在线观看 | 精品国产伦一区二区三区免费 | 国产亚洲无 | 久久久久国产a免费观看rela | av一级久久 | 伊人婷婷激情 | 一区 在线观看 | 在线你懂的视频 | 又爽又黄又无遮挡网站动态图 | 一区二区三区高清不卡 | 91污视频在线观看 | 99精品视频免费看 | 成人黄在线观看 | 精品亚洲欧美一区 | 99久精品视频 | va视频在线观看 | 欧美性超爽 | 一级片视频免费观看 | 深爱五月激情网 | 麻豆91精品 | 久草在线免费看视频 | 久久成 | 在线观看一区 | 久久99精品国产一区二区三区 | 日韩理论电影网 | 插久久 | 国产日韩视频在线观看 | 97色资源 | 日韩欧美综合精品 | 中文字幕网站 | 国产精品永久免费观看 | 国语自产偷拍精品视频偷 | 黄色一级在线免费观看 | 日韩中文字幕第一页 | 亚洲理论在线观看电影 | 欧美日韩中文字幕在线视频 | 久久久久久激情 | 天天干天天操天天入 | 探花在线观看 | 欧美性生活免费 | 色www永久免费 | 人人揉人人揉人人揉人人揉97 | 久久香蕉国产精品麻豆粉嫩av | 深夜免费小视频 | 国产毛片在线 | 久久久久久久久久久福利 | 中文字幕国产精品一区二区 | 国产淫片 | 久久久久久久av | 国产精品18久久久久vr手机版特色 | 色婷婷综合久久久中文字幕 | 97超碰人人澡 | 国产最新在线视频 | 日本丶国产丶欧美色综合 | 国产小视频免费观看 | 中文字幕在线视频一区 | 天天操操 | 国产精品久久久一区二区 | 成人av一区二区兰花在线播放 | 成人av电影免费在线观看 | 日韩毛片在线免费观看 | 国产不卡免费 | 久久夜av | 中日韩免费视频 | 国产a国产a国产a | 国产亚洲高清视频 | 在线观看免费成人 | 久久国产免 | 97精品国产97久久久久久春色 | 国产流白浆高潮在线观看 | 黄色美女免费网站 | 九色91在线视频 | 在线国产91 | 在线观看视频中文字幕 | 中文乱幕日产无线码1区 | 久久私人影院 | 亚洲视频 中文字幕 | 99久久婷婷国产一区二区三区 | av大片网站 | 国产精品美女在线观看 | 久久国产精品免费一区二区三区 | 国产精品99爱 | 日韩乱码中文字幕 | 中文字幕永久 | 日本高清久久久 | 波多野结衣资源 | 天天射夜夜爽 | 午夜av免费看 | 久草视频精品 | 中文字幕国产 | 成人av网址大全 | 久久久99精品免费观看乱色 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 国产精品毛片一区二区在线看 | 国产精品成人品 | 欧美激情第一页xxx 午夜性福利 | 欧美一级视频免费 | 2024国产精品视频 | 五月天激情综合网 | 精品国产99国产精品 | www.亚洲在线| 天天操天天射天天插 | 9在线观看免费高清完整 | 国产精品毛片一区二区 | 久久精品99北条麻妃 | 免费福利在线播放 | 亚洲精品国久久99热 | 午夜视频亚洲 | 色综合久久精品 | 国产打女人屁股调教97 | 久久精品国产精品亚洲 | www日韩精品 | 久久成人午夜 | 久草视频免费观 | 人人爽影院 | 在线观看小视频 | 日日干精品 | 麻豆传媒电影在线观看 | 国产九九热视频 | 99这里只有| 国产一级二级视频 | 久久国产精品久久国产精品 | 在线中文字幕网站 | 欧美久久久久久久久久久 | 亚洲精品午夜aaa久久久 | 又爽又黄又刺激的视频 | 9999亚洲 | 国产三级香港三韩国三级 | 欧美高清视频不卡网 | 色综合久久综合中文综合网 | 国产精品久久在线 | 黄色软件在线看 | 国产精品激情偷乱一区二区∴ | 欧美性脚交 | 午夜精品久久久久久久久久久 | 亚洲网久久 | 精品久久国产一区 | 97干com| 成人精品福利 | 亚洲 欧美日韩 国产 中文 | 99久久综合精品五月天 | 欧美激情视频一区 | 亚洲成人av一区 | 国产高清成人在线 | 亚洲精品欧洲精品 | 亚洲国产精品久久 | 又色又爽又黄高潮的免费视频 | 色综久久 | 日本大片免费观看在线 | 麻豆成人精品视频 | 免费视频a | 亚洲最新av网站 | 国产黄a三级三级 | 国产视频精品免费 | 国产成人黄色av | 亚洲免费视频在线观看 | 狠狠躁夜夜av | 日本动漫做毛片一区二区 | 99re在线视频观看 | 中文网丁香综合网 | 国产中文字幕三区 | 亚洲精品99久久久久久 | 国产成人久久av免费高清密臂 | 九九热1 | 人人干在线观看 | 亚洲第五色综合网 | 91成品人影院| 国产成人1区 | 欧美久久久久久久久久 | 久久久久免费精品 | 久久婷婷国产色一区二区三区 | 久草在线电影网 | 亚洲一二三久久 | 亚洲精品三级 | 麻豆播放 | 国产在线黄 | 香蕉视频网站在线观看 | 国产最新在线视频 | 国产在线 一区二区三区 | 91福利社区在线观看 | 国内丰满少妇猛烈精品播 | 国产91丝袜在线播放动漫 | 综合色综合| 久草在线播放视频 | 午夜久久网站 | 福利视频一区二区 | 日韩试看 | 亚州精品天堂中文字幕 | 99久久99久久综合 | 国产自制av | 99精品久久99久久久久 | 国产美女精品视频 | 在线观看中文字幕第一页 | 中文亚洲欧美日韩 | 香蕉免费在线 | 日韩理论电影在线观看 | 亚洲成人黄色在线 | 亚洲国产三级在线 | 日韩高清在线不卡 | 日本三级中文字幕在线观看 | 国产精品欧美久久 | 在线视频日韩 | 精品国产91亚洲一区二区三区www | 国产成人久久av免费高清密臂 | 91丨九色丨蝌蚪丨老版 | 91.dizhi永久地址最新 | 香蕉影视在线观看 | 亚洲最新视频在线播放 | 中文字幕在 | av高清网站在线观看 | 8x8x在线观看视频 | 国产色婷婷 | 国产精品免费一区二区三区 | 综合婷婷| 99欧美| 中文字幕资源在线 | 国产黄色资源 | 色综合亚洲精品激情狠狠 | 日韩在线免费电影 | 日韩xxxxxxxxx| 香蕉97视频观看在线观看 | 欧美一进一出抽搐大尺度视频 | 日本三级在线观看中文字 | 免费网站黄| 久久午夜鲁丝片 | 国产不卡在线视频 | 久久tv | 亚洲日本在线视频观看 | 久久香蕉国产精品麻豆粉嫩av | 一区二区三区在线免费播放 | 在线观看视频一区二区三区 | 91av久久| 婷婷六月天天 | 91一区二区三区久久久久国产乱 | 国产.精品.日韩.另类.中文.在线.播放 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产亚洲精品av | 国内精品视频久久 | 色噜噜色噜噜 | 黄色小视频在线观看免费 | 一区二区理论片 | 欧美日韩免费观看一区=区三区 | av在线激情| 日韩精品一区二区三区视频播放 | 亚洲免费公开视频 | 久久精品影视 | 日韩午夜电影院 | 99久久精品电影 | 伊人久久一区 | av一区在线播放 | 日日夜夜天天 | 国内精品中文字幕 | 国产黄色一级大片 | 成人av一区二区在线观看 | 一区二区三区av在线 | 国内精品久久久久久久久 | 视频在线一区二区三区 | 欧美日韩在线观看不卡 | 亚洲精品综合一区二区 | 开心激情五月婷婷 | 欧美日韩中文国产一区发布 | 九九九热精品免费视频观看网站 | 日韩亚洲精品电影 | 精品久久久99 | 国产黄色一级大片 | 久久国产精品99久久久久久进口 | 精品一区二区三区久久 | 国产系列精品av | 国产在线不卡视频 | 国产福利av在线 | 中文字幕免费一区 | 国产精品成人在线观看 | 国模视频一区二区三区 | 成人亚洲精品久久久久 | 久久深夜 | 欧美一级电影 | 激情网站免费观看 | 国产精品乱码在线 | 日韩欧美高清免费 | 日韩一区二区三区视频在线 | 婷婷丁香狠狠爱 | 亚洲综合在 | 欧美日韩亚洲精品在线 | 欧美色图视频一区 | 黄色资源网站 | 视频一区二区视频 | 中文字幕免费一区 | 夜夜夜草 | 亚av在线| 天天操天天干天天爱 | 久久精品国产精品亚洲精品 | 国产 在线 高清 精品 | 国产精品九九视频 | 狠狠色丁香婷综合久久 | 在线导航福利 | 91一区二区三区在线观看 | 国产电影一区二区三区四区 | 欧美国产在线看 | 久久人人爽人人片 | 成人免费网视频 | 五月天婷亚洲天综合网精品偷 | 高清在线一区二区 | 成人在线黄色电影 | 久久精品91视频 | 曰韩精品 | 丁香激情综合 | 久久中国精品 | 六月丁香在线视频 | 超碰人人国产 | 久久黄色免费 | 三级黄色片在线观看 | 日韩一区二区三区观看 | avav片| 亚洲成a人片在线www | 欧美另类xxx| 黄网站色视频 | 国产精品久久久久久久av大片 | 日韩一级成人av | 欧美成人亚洲 | 午夜美女视频 | 天天干夜夜夜操天 | 中文字幕在线乱 | 最新av在线网址 | 最新高清无码专区 |