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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android SystemServer分析

發布時間:2025/3/15 Android 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android SystemServer分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.Zygote到SystemServer

??SystemServer是由Zygote fork生成的,進程名為system_server,這個進程包含里framework中的核心服務,在Zygote的分析中有提到,SystemServer是在zygote中通過startSystemServer來調用起來

1.1 ZygoteInit.java中的startSystemServer函數

private static boolean startSystemServer(String abiList, String socketName)throws MethodAndArgsCaller, RuntimeException {…………../* Hardcoded command line to start the system server */// 啟動參數設置String args[] = {"--setuid=1000","--setgid=1000","--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007","--capabilities=" + capabilities + "," + capabilities,"--nice-name=system_server","--runtime-args","com.android.server.SystemServer",};ZygoteConnection.Arguments parsedArgs = null;int pid;try {// 解析參數,將上面的字符串數據轉換成Arguments對象parsedArgs = new ZygoteConnection.Arguments(args);ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);/* Request to fork the system server process */// fork一個子進程,子進程就是system_server進程pid = Zygote.forkSystemServer(parsedArgs.uid, parsedArgs.gid,parsedArgs.gids,parsedArgs.debugFlags,null,parsedArgs.permittedCapabilities,parsedArgs.effectiveCapabilities);} catch (IllegalArgumentException ex) {throw new RuntimeException(ex);}/* For child process */// ford返回值等于0,表明是子進程即system_server所在分支代碼if (pid == 0) {if (hasSecondZygote(abiList)) {waitForSecondaryZygote(socketName);}// system_server進程所做的工作,在這里會啟動各種支撐系統運行的System serverhandleSystemServerProcess(parsedArgs);}return true; }

1.2 Zygote.java中的forSystemServer函數

public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {VM_HOOKS.preFork();int pid = nativeForkSystemServer(uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);// Enable tracing as soon as we enter the system_server.if (pid == 0) {Trace.setTracingEnabled(true);}VM_HOOKS.postForkCommon();return pid; }

??nativeForkSystemServer會通過JNI調用com_android_internal_os_Zygote.cpp中的com_
android_internal_os_Zygote_nativeForkSystemServer方法。

1.3 Com_android_internal_os_Zygote.cpp中com_internal_os_Zygote_nativeForkSystemServer方法

static jint com_android_internal_os_Zygote_nativeForkSystemServer(JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,jint debug_flags, jobjectArray rlimits, jlong permittedCapabilities,jlong effectiveCapabilities) {// 下面的調用會fork一個子進程pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,debug_flags, rlimits,permittedCapabilities, effectiveCapabilities,MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,NULL, NULL);if (pid > 0) {// pid>0 代表在Zygote進程內,下面檢測system_server進程是否已經創建// The zygote process checks whether the child process has died or not.ALOGI("System server process %d has been created", pid);gSystemServerPid = pid;// There is a slight window that the system server process has crashed// but it went unnoticed because we haven't published its pid yet. So// we recheck here just to make sure that all is well.int status;// 等待子進程退出,WNOHANG表示非阻塞if (waitpid(pid, &status, WNOHANG) == pid) {// 如果system_server剛剛創建就crash,重啟zygoteALOGE("System server process %d has died. Restarting Zygote!", pid);RuntimeAbort(env);}}return pid; }

??當system_server進程創建失敗時,將會重啟zygote進程。這里需要注意,對于Android 5.0以上系統,有兩個zygote進程,分別是zygote、zygote64兩個進程,system_server的父進程,一般來說64位系統其父進程是zygote64進程。

  • 當kill system_server進程后,只重啟zygote64和system_server,不重啟zygote;
  • 當kill zygote64進程后,只重啟zygote64和system_server,也不重啟zygote;
  • 當kill zygote進程,則重啟zygote、zygote64以及system_server。
  • 1.4 com_android_internal_os_Zygote.cpp中ForkAndSpecializeCommon函數

    ??這個函數有點復雜,設置處理信號這邊大家還是看原生注釋吧,有些地方我這邊也不是看得特別明白。

    // Utility routine to fork zygote and specialize the child process. static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,jint debug_flags, jobjectArray javaRlimits,jlong permittedCapabilities, jlong effectiveCapabilities,jint mount_external,jstring java_se_info, jstring java_se_name,bool is_system_server, jintArray fdsToClose,jstring instructionSet, jstring dataDir) {// 設置子進程的signal信號處理函數SetSigChldHandler();sigset_t sigchld;sigemptyset(&sigchld);sigaddset(&sigchld, SIGCHLD);// Temporarily block SIGCHLD during forks. The SIGCHLD handler might// log, which would result in the logging FDs we close being reopened.// This would cause failures because the FDs are not whitelisted.//// Note that the zygote process is single threaded at this point.// 大概意思是暫時屏蔽SIGCHLD信號,不然SIGCHLD會產生log,而被我們關閉掉的// logging文件描述符會對這個信號進行相應,所以會報錯if (sigprocmask(SIG_BLOCK, &sigchld, NULL) == -1) {ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno));RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_BLOCK, { SIGCHLD }) failed.");}// Close any logging related FDs before we start evaluating the list of// file descriptors.__android_log_close();// If this is the first fork for this zygote, create the open FD table.// If it isn't, we just need to check whether the list of open files has// changed (and it shouldn't in the normal case).if (gOpenFdTable == NULL) {gOpenFdTable = FileDescriptorTable::Create();if (gOpenFdTable == NULL) {RuntimeAbort(env, __LINE__, "Unable to construct file descriptor table.");}} else if (!gOpenFdTable->Restat()) {RuntimeAbort(env, __LINE__, "Unable to restat file descriptor table.");}// Linux fork調用,創建子進程pid_t pid = fork();if (pid == 0) {// The child process.gMallocLeakZygoteChild = 1;// Clean up any descriptors which must be closed immediately// 清除一部分文件描述符DetachDescriptors(env, fdsToClose);// Re-open all remaining open file descriptors so that they aren't shared// with the zygote across a fork.if (!gOpenFdTable->ReopenOrDetach()) {RuntimeAbort(env, __LINE__, "Unable to reopen whitelisted descriptors.");}if (sigprocmask(SIG_UNBLOCK, &sigchld, NULL) == -1) {ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno));RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed.");}// Keep capabilities across UID change, unless we're staying root.// 非root,禁止動態改變進程權限if (uid != 0) {EnableKeepCapabilities(env);}// 取消進程已有的Capabilities權限DropCapabilitiesBoundingSet(env);bool use_native_bridge = !is_system_server && (instructionSet != NULL)&& android::NativeBridgeAvailable();if (use_native_bridge) {ScopedUtfChars isa_string(env, instructionSet);use_native_bridge = android::NeedsNativeBridge(isa_string.c_str());}if (use_native_bridge && dataDir == NULL) {// dataDir should never be null if we need to use a native bridge.// In general, dataDir will never be null for normal applications. It can only happen in// special cases (for isolated processes which are not associated with any app). These are// launched by the framework and should not be emulated anyway.use_native_bridge = false;ALOGW("Native bridge will not be used because dataDir == NULL.");}if (!MountEmulatedStorage(uid, mount_external, use_native_bridge)) {ALOGW("Failed to mount emulated storage: %s", strerror(errno));if (errno == ENOTCONN || errno == EROFS) {// When device is actively encrypting, we get ENOTCONN here// since FUSE was mounted before the framework restarted.// When encrypted device is booting, we get EROFS since// FUSE hasn't been created yet by init.// In either case, continue without external storage.} else {ALOGE("Cannot continue without emulated storage");RuntimeAbort(env);}}if (!is_system_server) {// 對于非system_server,創建進程組int rc = createProcessGroup(uid, getpid());if (rc != 0) {if (rc == -EROFS) {ALOGW("createProcessGroup failed, kernel missing CONFIG_CGROUP_CPUACCT?");} else {ALOGE("createProcessGroup(%d, %d) failed: %s", uid, pid, strerror(-rc));}}}// 設置組代碼SetGids(env, javaGids);// 設置資源限制SetRLimits(env, javaRlimits);if (use_native_bridge) {ScopedUtfChars isa_string(env, instructionSet);ScopedUtfChars data_dir(env, dataDir);android::PreInitializeNativeBridge(data_dir.c_str(), isa_string.c_str());}// 設置真實的、有效的和保存過的組IDint rc = setresgid(gid, gid, gid);if (rc == -1) {ALOGE("setresgid(%d) failed: %s", gid, strerror(errno));RuntimeAbort(env);}// 設置真實的、有效的和保存過的用戶IDrc = setresuid(uid, uid, uid);if (rc == -1) {ALOGE("setresuid(%d) failed: %s", uid, strerror(errno));RuntimeAbort(env);}if (NeedsNoRandomizeWorkaround()) {// Work around ARM kernel ASLR lossage (http://b/5817320).int old_personality = personality(0xffffffff);int new_personality = personality(old_personality | ADDR_NO_RANDOMIZE);if (new_personality == -1) {ALOGW("personality(%d) failed: %s", new_personality, strerror(errno));}}// 設置新的capabilities權限SetCapabilities(env, permittedCapabilities, effectiveCapabilities);// 設置調度策略SetSchedulerPolicy(env);const char* se_info_c_str = NULL;ScopedUtfChars* se_info = NULL;if (java_se_info != NULL) {se_info = new ScopedUtfChars(env, java_se_info);se_info_c_str = se_info->c_str();if (se_info_c_str == NULL) {ALOGE("se_info_c_str == NULL");RuntimeAbort(env);}}const char* se_name_c_str = NULL;ScopedUtfChars* se_name = NULL;if (java_se_name != NULL) {se_name = new ScopedUtfChars(env, java_se_name);se_name_c_str = se_name->c_str();if (se_name_c_str == NULL) {ALOGE("se_name_c_str == NULL");RuntimeAbort(env);}}// 設置selinux domain上下文rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str);if (rc == -1) {ALOGE("selinux_android_setcontext(%d, %d, \"%s\", \"%s\") failed", uid,is_system_server, se_info_c_str, se_name_c_str);RuntimeAbort(env);}// Make it easier to debug audit logs by setting the main thread's name to the// nice name rather than "app_process".if (se_info_c_str == NULL && is_system_server) {se_name_c_str = "system_server";}if (se_info_c_str != NULL) {SetThreadName(se_name_c_str);}delete se_info;delete se_name;// 將子進程system_server的SIGCHLD信號的處理函數修改回系統默認函數UnsetSigChldHandler();// JNI調,相當于zygote.callPostForkChildHooks()env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, debug_flags,is_system_server ? NULL : instructionSet);if (env->ExceptionCheck()) {ALOGE("Error calling post fork hooks.");RuntimeAbort(env);}} else if (pid > 0) {// 父進程中取消上面被屏蔽的SIGCHLD信號處理// the parent process// We blocked SIGCHLD prior to a fork, we unblock it here.if (sigprocmask(SIG_UNBLOCK, &sigchld, NULL) == -1) {ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno));RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed.");}}return pid; }

    ??至此,fork的工作就基本做完了,剩下的就是在handleSystemServerProcess中對SystemServer的剩余工作進行處理了。

    1.5 ZygoteInit.java中的handleSystemServerProcess函數

    /*** Finish remaining work for the newly forked system server process.*/ private static void handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs)throws ZygoteInit.MethodAndArgsCaller {// 關閉從父進程Zygote中繼承得來的sServersocketcloseServerSocket();// set umask to 0077 so new files and directories will default to owner-only permissions.Os.umask(S_IRWXG | S_IRWXO);// 設置進程名為system_serverif (parsedArgs.niceName != null) {Process.setArgV0(parsedArgs.niceName);}//?SYSTEMSERVERCLASSPATH=/system/framework/services.jar:/system/framework/ethernet-service.jar:/system/framework/wifi-service.jarfinal String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");if (systemServerClasspath != null) {// 進行dexopt優化performSystemServerDexOpt(systemServerClasspath);}// system_server的invokeWith為nullif (parsedArgs.invokeWith != null) {String[] args = parsedArgs.remainingArgs;// If we have a non-null system server class path, we'll have to duplicate the// existing arguments and append the classpath to it. ART will handle the classpath// correctly when we exec a new process.if (systemServerClasspath != null) {String[] amendedArgs = new String[args.length + 2];amendedArgs[0] = "-cp";amendedArgs[1] = systemServerClasspath;System.arraycopy(parsedArgs.remainingArgs, 0, amendedArgs, 2, parsedArgs.remainingArgs.length);}// 啟動應用程序WrapperInit.execApplication(parsedArgs.invokeWith,parsedArgs.niceName, parsedArgs.targetSdkVersion,VMRuntime.getCurrentInstructionSet(), null, args);} else {// system_server走該分支ClassLoader cl = null;if (systemServerClasspath != null) {// 創建類加載器cl = new PathClassLoader(systemServerClasspath, ClassLoader.getSystemClassLoader());// 設置當前進程即system_server的類加載器Thread.currentThread().setContextClassLoader(cl);}/** Pass the remaining arguments to SystemServer.*/// 最后調用zygoteinitRuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);}/* should never reach here */ }

    1.6 ZygoteInit.java中的performSystemServerDexOpt函數

    /*** Performs dex-opt on the elements of {@code classPath}, if needed. We* choose the instruction set of the current runtime.*/ private static void performSystemServerDexOpt(String classPath) {final String[] classPathElements = classPath.split(":");// 創建一個InstallerConnection對象final InstallerConnection installer = new InstallerConnection();// 等待,直到與installed服務端連通為止installer.waitForConnection();final String instructionSet = VMRuntime.getRuntime().vmInstructionSet();try {for (String classPathElement : classPathElements) {final int dexoptNeeded = DexFile.getDexOptNeeded(classPathElement, "*", instructionSet, false /* defer */);if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {// 以system身份,執行dex優化installer.dexopt(classPathElement, Process.SYSTEM_UID, false,instructionSet, dexoptNeeded);}}} catch (IOException ioe) {throw new RuntimeException("Error starting system_server", ioe);} finally {// 斷開與installed的socket連接installer.disconnect();} }

    1.7 RuntimeInit.java中的ZygoteInit函數

    public static final void zygoteInit(int targetSdkVersion, String[] argv) throws MethodAndArgsCaller {redirectLogStreams(); // 重定向Log輸出commonInit(); // 通用初始化nativeZygoteInit(); // Zygote初始化applicationInit(targetSdkVersion, argv); // 應用初始化 }

    1.8 RuntimeInit.java中的commonInit函數

    private static final void commonInit() {// 設置當前線程的未捕獲異常處設置為默認處理方法Thread.setDefaultUncaughtExceptionHandler(new RuntimeInit.UncaughtHandler(null));// 設置時區TimezoneGetter.setInstance(new TimezoneGetter() {public String getId() {return SystemProperties.get("persist.sys.timezone");}});TimeZone.setDefault((TimeZone)null);// 重置Log設置LogManager.getLogManager().reset();// 設置Android Lognew AndroidConfig();// 獲取默認的userAgentString userAgent = getDefaultUserAgent();// 獲取默認的HTTP user-agent,用于HttpURLConnection連接System.setProperty("http.agent", userAgent);// 設置網絡流量統計NetworkManagementSocketTagger.install();// 如果是通過模擬器啟動Android,可以通過F9/F10隨時追蹤kernel運行情況String trace = SystemProperties.get("ro.kernel.android.tracing");if(trace.equals("1")) {Slog.i("AndroidRuntime", "NOTE: emulator trace profiling enabled");Debug.enableEmulatorTraceOutput();}initialized = true; }

    1.9 AndroidRuntime.cpp中的com_android_internal_os_RuntimeInit_nativeZygoteInit方法

    static void com_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv* env, jobject clazz) {gCurRuntime->onZygoteInit(); }

    ??onZygote的代碼在app_main.cpp中,代碼如下:

    virtual void onZygoteInit() {// 獲取ProcessState對象sp proc = ProcessState::self();ALOGV("App process: starting thread pool.\n");// 啟動線程池proc->startThreadPool(); }

    1.10 RuntimeInit.java中的applicationInit方法

    private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)throws ZygoteInit.MethodAndArgsCaller {// If the application calls System.exit(), terminate the process// immediately without running any shutdown hooks. It is not possible to// shutdown an Android application gracefully. Among other things, the// Android runtime shutdown hooks close the Binder driver, which can cause// leftover running threads to crash before the process actually exits.// true代表在退出的時候不調用AppRuntime.onExit()nativeSetExitWithoutCleanup(true);// We want to be fairly aggressive about heap utilization, to avoid// holding on to a lot of memory that isn't needed.// 設置虛擬機內存堆利用率為%75VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);final Arguments args;try {// 解析傳入的參數args = new Arguments(argv);} catch (IllegalArgumentException ex) {Slog.e(TAG, ex.getMessage());// let the process exitreturn;}// The end of of the RuntimeInit event (see #zygoteInit).Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);// Remaining arguments are passed to the start class's static main// 調用startClass=“com.android.server.Systemserver”的static main方法invokeStaticMain(args.startClass, args.startArgs, classLoader); }

    1.11 RuntimeInit.java中的invokeStaticMain方法

    /*** Invokes a static "main(argv[]) method on class "className".* Converts various failing exceptions into RuntimeExceptions, with* the assumption that they will then cause the VM instance to exit.** @param className Fully-qualified class name* @param argv Argument vector for main()* @param classLoader the classLoader to load {@className} with*/ // 用于啟動className指向的類的static main(argv[])方法 private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)throws ZygoteInit.MethodAndArgsCaller {Class<?> cl;try {// 裝載className=”com.android.server.Systemserver”類,并初始化cl = Class.forName(className, true, classLoader);} catch (ClassNotFoundException ex) {throw new RuntimeException("Missing class when invoking static main " + className,ex);}Method m;try {// 獲取className=”com.android.server.Systemserver”中的main方法m = cl.getMethod("main", new Class[] { String[].class });} catch (NoSuchMethodException ex) {throw new RuntimeException("Missing static main on " + className, ex);} catch (SecurityException ex) {throw new RuntimeException("Problem getting static main on " + className, ex);}// 獲取main方法的修飾符int modifiers = m.getModifiers();// main方法的修飾符需要是public staticif (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {throw new RuntimeException("Main method is not public and static on " + className);}/** This throw gets caught in ZygoteInit.main(), which responds* by invoking the exception's run() method. This arrangement* clears up all the stack frames that were required in setting* up the process.*/// 通過拋出異常的方式,將調用返回到ZygoteInit.main函數中throw new ZygoteInit.MethodAndArgsCaller(m, argv); }

    ??上面的函數調用最后是通過拋出ZygoteInit.MethodAndArgsCaller異常的方法,將方法的調用棧返回到ZygoteInit.main()函數中,下面我們在重新看看ZygoteInit的main函數是怎么處理這個異常的。

    1.12 ZygoteInit.java中的main函數

    public static void main(String argv[]) {// 前面的代碼在前面分析了,這里就省略不貼出來………………/// M: Added for BOOTPROFaddBootEvent(new String("Zygote:Preload End"));if (startSystemServer) {startSystemServer(abiList, socketName);}Log.i(TAG, "Accepting command socket connections");runSelectLoop(abiList);closeServerSocket();} catch (MethodAndArgsCaller caller) {// 在RuntimeInit.java的invokeStaticMain方法中拋出的異常在這里捕獲// 然后調用MethodAndArgsCaller的run方法caller.run();} catch (RuntimeException ex) {Log.e(TAG, "Zygote died with exception", ex);closeServerSocket();throw ex;} }

    1.13 ZygoteInit.java中的MethodAndArgsCaller類

    /*** Helper exception class which holds a method and arguments and* can call them. This is used as part of a trampoline to get rid of* the initial process setup stack frames.*/ public static class MethodAndArgsCaller extends Exceptionimplements Runnable {/** method to call */private final Method mMethod;/** argument array */private final String[] mArgs;public MethodAndArgsCaller(Method method, String[] args) {// com.android.server.SystemServer類的main方法mMethod = method;// 傳給main方法的參數mArgs = args;}public void run() {try {// 調用com.android.server.SystemServer類的main方法mMethod.invoke(null, new Object[] { mArgs });} catch (IllegalAccessException ex) {throw new RuntimeException(ex);} catch (InvocationTargetException ex) {Throwable cause = ex.getCause();if (cause instanceof RuntimeException) {throw (RuntimeException) cause;} else if (cause instanceof Error) {throw (Error) cause;}throw new RuntimeException(ex);}} }

    2. SystemServer的實際內容

    ??第一部分介紹到Zygote最后會執行com.android.server.Systemserver的main函數,那程序就會直接跳轉到main函數。

    2.1 SystemServer.java中的main函數

    /*** The main entry point from zygote.*/ public static void main(String[] args) {new SystemServer().run(); }

    2.2 SystemServer.java中的run函數

    private void run() {// If a device's clock is before 1970 (before 0), a lot of// APIs crash dealing with negative numbers, notably// java.io.File#setLastModified, so instead we fake it and// hope that time from cell towers or NTP fixes it shortly.// 如果時間早于1970年,這里就將時間強制設置為1970年if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {Slog.w(TAG, "System clock is before 1970; setting to 1970.");SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);}// If the system has "persist.sys.language" and friends set, replace them with// "persist.sys.locale". Note that the default locale at this point is calculated// using the "-Duser.locale" command line flag. That flag is usually populated by// AndroidRuntime using the same set of system properties, but only the system_server// and system apps are allowed to set them.//// NOTE: Most changes made here will need an equivalent change to// core/jni/AndroidRuntime.cppif (!SystemProperties.get("persist.sys.language").isEmpty()) {final String languageTag = Locale.getDefault().toLanguageTag();SystemProperties.set("persist.sys.locale", languageTag);SystemProperties.set("persist.sys.language", "");SystemProperties.set("persist.sys.country", "");SystemProperties.set("persist.sys.localevar", "");}// Here we go!Slog.i(TAG, "Entered the Android system server!");EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis());/// M: BOOTPROF @{mMTPROF_disable = "1".equals(SystemProperties.get("ro.mtprof.disable"));addBootEvent(new String("Android:SysServerInit_START"));/// @}// In case the runtime switched since last boot (such as when// the old runtime was removed in an OTA), set the system// property so that it is in sync. We can't do this in// libnativehelper's JniInvocation::Init code where we already// had to fallback to a different runtime because it is// running as root and we need to be the system user to set// the property. http://b/11463182SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());// Enable the sampling profiler.// 啟動SampleingProfilerIntegration進行性能統計if (SamplingProfilerIntegration.isEnabled()) {SamplingProfilerIntegration.start();mProfilerSnapshotTimer = new Timer();mProfilerSnapshotTimer.schedule(new TimerTask() {@Overridepublic void run() {SamplingProfilerIntegration.writeSnapshot("system_server", null);}// SNAPSHOT_INTERVAL=60*60*1000,所以是一個小時進行一次性能統計// 保存的snapshot保存到/data/snapshots/system_server中}, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);}// Mmmmmm... more memory!// 清除虛擬機運行時內存增長上限VMRuntime.getRuntime().clearGrowthLimit();// The system server has to run all of the time, so it needs to be// as efficient as possible with its memory usage.// 設置虛擬機運行時內存堆利用率為80%VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);// Some devices rely on runtime fingerprint generation, so make sure// we've defined it before booting further.// 確認ro.build.fingerprint屬性值是否存在,如果不存在則設置該屬性值Build.ensureFingerprintProperty();// Within the system server, it is an error to access Environment paths without// explicitly specifying a user.// 需要設置指定用戶后才能夠訪問環境變量Environment.setUserRequired(true);// Ensure binder calls into the system always run at foreground priority. // 確保binder系統調用運行在前臺優先級BinderInternal.disableBackgroundScheduling(true);// Prepare the main looper thread (this thread).// 設置system_server的優先級為前臺優先級android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);// 禁止system_server將自身設置為后臺優先級android.os.Process.setCanSelfBackground(false);// 創建主線程looperLooper.prepareMainLooper();// Initialize native services.// 加載android_servers.so庫System.loadLibrary("android_servers");///M:Add for low storage feature,to delete the reserver file.@{try {Runtime.getRuntime().exec("rm -r /data/piggybank");} catch (IOException e) {Slog.e(TAG, "system server init delete piggybank fail" + e);}///@}// Check whether we failed to shut down last time we tried.// This call may not return.// 檢查上次是否是正常關閉,該方法可能不會返回performPendingShutdown();// Initialize the system context.// 初始化系統上下文createSystemContext();// Create the system service manager.// 創建SystemServiceManagermSystemServiceManager = new SystemServiceManager(mSystemContext);// 將SystemServiceManager成員添加到本地service對象中LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);// Start services.try {// 啟動引導服務startBootstrapServices();// 啟動核心服務startCoreServices();// 啟動剩余的其他服務startOtherServices();} catch (Throwable ex) {Slog.e("System", "******************************************");Slog.e("System", "************ Failure starting system services", ex);/// M: RecoveryManagerService @{if (mRecoveryManagerService != null && ex instanceof RuntimeException) {mRecoveryManagerService.handleException((RuntimeException) ex, true);} else {throw ex;}/// @}}// For debug builds, log event loop stalls to dropbox for analysis.if (StrictMode.conditionallyEnableDebugLogging()) {Slog.i(TAG, "Enabled StrictMode for system server main thread.");}/// M: BOOTPROFaddBootEvent(new String("Android:SysServerInit_END"));// Loop forever.// 進入消息處理循環Looper.loop();throw new RuntimeException("Main thread loop unexpectedly exited"); }

    2.3 SystemServer.java中的performPendingShutdown函數

    private void performPendingShutdown() {// SHUTDOWN_ACTION_PROPERTY=”sys.shutdown.requested”final String shutdownAction = SystemProperties.get(ShutdownThread.SHUTDOWN_ACTION_PROPERTY, "");if (shutdownAction != null && shutdownAction.length() > 0) {boolean reboot = (shutdownAction.charAt(0) == '1');final String reason;if (shutdownAction.length() > 1) {reason = shutdownAction.substring(1, shutdownAction.length());} else {reason = null;}// 如果sys.shutdown.requested的值不為空,就會重啟或者關機ShutdownThread.rebootOrShutdown(null, reboot, reason);} }

    2.4 SystemServer.java中的createSystemcontext函數

    private void createSystemContext() {// 獲取ActivityThread對象ActivityThread activityThread = ActivityThread.systemMain();// 創建并獲取ContextImpl對象mSystemContext = activityThread.getSystemContext();// 設置系統主題 mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar); }

    2.5 SystemServer.java中的startBootstrapServices函數

    /*** Starts the small tangle of critical services that are needed to get* the system off the ground. These services have complex mutual dependencies* which is why we initialize them all in one place here. Unless your service* is also entwined in these dependencies, it should be initialized in one of* the other functions.*/ private void startBootstrapServices() {// Wait for installd to finish starting up so that it has a chance to// create critical directories such as /data/user with the appropriate// permissions. We need this to complete before we initialize other services.// 啟動Installer系統服務Installer installer = mSystemServiceManager.startService(Installer.class);/// M: MSG Logger Manager @{if (!IS_USER_BUILD) {try {MessageMonitorService msgMonitorService = null;msgMonitorService = new MessageMonitorService();Slog.e(TAG, "Create message monitor service successfully .");// Add this service to service managerServiceManager.addService(Context.MESSAGE_MONITOR_SERVICE,msgMonitorService.asBinder());} catch (Throwable e) {Slog.e(TAG, "Starting message monitor service exception ", e);}}/// MSG Logger Manager @}// Activity manager runs the show.// 啟動AMS,同時設置AMS的SystemServiceManager和InstallermActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);// Power manager needs to be started early because other services need it.// Native daemons may be watching for it to be registered so it must be ready// to handle incoming binder calls immediately (including being able to verify// the permissions for those calls).// 啟動PowerManagerServicemPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);// Now that the power manager has been started, let the activity manager// initialize power management features.// 初始化PowerManagerServicemActivityManagerService.initPowerManagement();// Manages LEDs and display backlight so we need it to bring up the display.// 啟動LightServicemSystemServiceManager.startService(LightsService.class);// Display manager is needed to provide display metrics before package manager// starts up.// 啟動DisplayManagerServicemDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);// We need the default display before we can initialize the package manager.// 等待Display默認顯示mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);// Only run "core" apps if we're encrypting the device.// 當設備處于加密過程中,則只運行核心應用程序String cryptState = SystemProperties.get("vold.decrypt");if (ENCRYPTING_STATE.equals(cryptState)) {Slog.w(TAG, "Detected encryption in progress - only parsing core apps");mOnlyCore = true;} else if (ENCRYPTED_STATE.equals(cryptState)) {Slog.w(TAG, "Device encrypted - only parsing core apps");mOnlyCore = true;}// Start the package manager.Slog.i(TAG, "Package Manager");// 啟動PackageManagerServicemPackageManagerService = PackageManagerService.main(mSystemContext, installer,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);// 判斷手機是否是第一次啟動mFirstBoot = mPackageManagerService.isFirstBoot();// 獲取PakcageManager對象mPackageManager = mSystemContext.getPackageManager();Slog.i(TAG, "User Service");// 啟動UserManagerService,并添加到ServiceManager中ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance());// Initialize attribute cache used to cache resources from packages.// 初始化屬性緩存AttributeCache.init(mSystemContext);// Set up the Application instance for the system process and get started.// 設置AMSmActivityManagerService.setSystemProcess();// The sensor service needs access to package manager service, app ops// service, and permissions service, therefore we start it after them.// 啟動SensorServicestartSensorService(); }

    2.6 SystemServer.java中的startCoreServices函數

    /*** Starts some essential services that are not tangled up in the bootstrap process.*/ private void startCoreServices() {// Tracks the battery level. Requires LightService.// 啟動BatteryService,用于統計電池電量信息mSystemServiceManager.startService(BatteryService.class);// Tracks application usage stats.// 啟動UsageStatsService,用于統計應用使用情況mSystemServiceManager.startService(UsageStatsService.class);mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));// Update after UsageStatsService is available, needed before performBootDexOpt.mPackageManagerService.getUsageStatsIfNoPackageUsageInfo();// Tracks whether the updatable WebView is in a ready state and watches for update installs.// 啟動WebViewUpdateServicemSystemServiceManager.startService(WebViewUpdateService.class); }

    2.7 其余Service

    ??最后就是通過SystemServer.java中的startOtherService方法啟動的service了,因為start OtherService這個方法里面啟動的service比較多,例如:AudioService、CameraService、AccountService等,而且方法內容長,所以就不貼出來了,各位有興趣可以自己去看,后續如果有分析到具體的某一個service,到時候再拿出來看就好了。

    2.8 小總結

    ??從代碼中可以看到,System_server啟動service的方法主要是通過兩種方式:一種是通過SystemServiceManager的startService(),這個方法主要是用來啟動繼承于SystemService的服務。主要過程為,首先創建serviceClass類的對象,然后將剛剛創建的serviceClass類對象添加到SystemServiceManager的成員對象mServices(是一個Arraylist),然后再調用剛創建對象的onStart方法。對于那些啟動到一定階段的服務,進入到相應階段的Phase后,還會調用到SystemServiceManager的startBootPhase()回掉方法,這個方法會循環遍歷所有向SystemServiceManager注冊過的service的onBootPhase()方法;另外一種就是通過ServiceManager的addService(String name, IBinder service),該方法用于初始化繼承于IBinder的服務。

    ??啟動過程中各個Phase所代表的階段如下:

    /** Boot Phases*/ // 該階段需要等待Display有默認顯示 public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100; // maybe should be a dependency?/*** After receiving this boot phase, services can obtain lock settings data.*/ // 該階段后服務可以獲取到鎖屏設置的數據了 public static final int PHASE_LOCK_SETTINGS_READY = 480;/*** After receiving this boot phase, services can safely call into core system services* such as the PowerManager or PackageManager.*/ // 該階段后,服務可以安全的調用核心系統服務了,例如Power Manager和PackageManager public static final int PHASE_SYSTEM_SERVICES_READY = 500;/*** After receiving this boot phase, services can broadcast Intents.*/ // 該階段后,服務可以接收到廣播Intents public static final int PHASE_ACTIVITY_MANAGER_READY = 550;/*** After receiving this boot phase, services can start/bind to third party apps.* Apps will be able to make Binder calls into services at this point.*/ // 該階段后,服務可以啟動/綁定到第三方的app了 public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;/*** After receiving this boot phase, services can allow user interaction with the device.* This phase occurs when boot has completed and the home application has started.* System services may prefer to listen to this phase rather than registering a* broadcast receiver for ACTION_BOOT_COMPLETED to reduce overall latency.*/ // 該階段后,允許用戶和設備進行交互了,該階段發生再啟動完成以及home ap已經啟動了,系統的服務更傾向于注冊監聽該廣播而非ACTION_BOOT_COMPLETED public static final int PHASE_BOOT_COMPLETED = 1000;

    贊過:

    http://blog4jimmy.com/2018/01/328.html

    總結

    以上是生活随笔為你收集整理的Android SystemServer分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    国产在线观看二区 | 亚洲色影爱久久精品 | 欧美色精品天天在线观看视频 | 亚洲国产精品电影在线观看 | 中文字幕在线第一页 | 超级av在线 | 成年人免费在线观看网站 | 亚色视频在线观看 | 在线你懂的视频 | 一区二区精品久久 | 亚洲美女在线国产 | 深夜国产福利 | 国产精久久久久久妇女av | 久久99热国产 | 精品国产乱码久久久久久1区2匹 | 黄视频色网站 | 91久久在线观看 | 99av国产精品欲麻豆 | 精品国产一区二区三区噜噜噜 | 人人干人人艹 | 色永久免费视频 | 91人人射| 亚洲精品456在线播放第一页 | 国产精品自产拍在线观看 | 欧美日韩在线观看一区二区 | 亚洲成aⅴ人片久久青草影院 | 精品国产免费人成在线观看 | 精品国产亚洲一区二区麻豆 | 精品国产自在精品国产精野外直播 | 国产美腿白丝袜足在线av | 亚洲美女免费精品视频在线观看 | 成人免费看片网址 | 国产资源网 | 国产精品久久久久久久久搜平片 | 丁香网婷婷 | 久草免费福利在线观看 | 国产免费观看久久 | 国产亚洲人成网站在线观看 | 精品国模一区二区 | 日韩美女一级片 | 亚洲综合视频在线 | 天堂av在线免费观看 | 日韩成人免费观看 | 九九九电影免费看 | 日韩a免费 | 精品视频免费观看 | av黄色免费在线观看 | 国产小视频网站 | 久久久久久久免费观看 | 久草在线这里只有精品 | 国产精品大尺度 | 美女视频永久黄网站免费观看国产 | 国产亚洲精品久久久久久网站 | 国产精品成人免费 | 这里有精品在线视频 | 日本久久中文字幕 | 日韩在线观看视频在线 | 欧美日韩视频在线观看免费 | 国产一二三区av | 九九综合久久 | 中文字幕一区二区三区四区 | 欧美日韩高清在线观看 | 99精品在线播放 | 国产高清在线精品 | 国产精品99久久久久久宅男 | 伊香蕉大综综综合久久啪 | 欧美精品在线免费 | 日韩大片免费观看 | 色多多视频在线观看 | 国产在线理论片 | 成人av网址大全 | 狠狠干狠狠插 | 999毛片| 福利电影久久 | 久久精品中文字幕少妇 | 国产精品美女999 | aaa黄色毛片| 色综合久久88色综合天天6 | av成人免费 | 一级成人免费视频 | 一区二区男女 | 麻豆视频在线观看免费 | 天天干天天操天天操 | 97视频人人澡人人爽 | 天天操天天摸天天射 | 在线视频欧美精品 | 欧美亚洲久久 | 天天爽人人爽夜夜爽 | 91成人短视频在线观看 | 国际精品久久久 | 日韩视频中文字幕在线观看 | 国产成人精品一区二区三区 | 伊人干综合 | 黄色小网站免费看 | 亚洲视频免费在线观看 | 91视频首页 | 九九热视频在线免费观看 | av在线免费网 | 久久视频这里有久久精品视频11 | 九色精品在线 | 国内精品久久久久影院男同志 | 精品欧美一区二区精品久久 | 久久午夜免费观看 | 在线看片视频 | 欧美国产不卡 | 国产精品短视频 | 五月开心色 | 国产在线最新 | 日韩精品在线观看av | 色噜噜狠狠狠狠色综合 | 亚洲国产视频直播 | 日本中文字幕系列 | 久久综合日 | 曰本免费av | 丁香在线| 日韩在线二区 | 国产精品一区二区三区电影 | 成人一区二区三区在线观看 | 国产一区二区在线免费播放 | 99riav1国产精品视频 | 美女黄频在线观看 | 久久se视频| 一区二区精品在线观看 | 日韩在线色 | 97精品国产97久久久久久粉红 | 三级免费黄 | www.伊人色.com| 成年人在线观看视频免费 | 在线免费观看黄色 | 亚洲国产精品一区二区久久hs | 久久精品一区八戒影视 | 欧美激情一区不卡 | 亚洲成人动漫在线观看 | 日本公乱妇视频 | 久久国色夜色精品国产 | 97日日碰人人模人人澡分享吧 | 久久精品一区二区三区视频 | 国产成人免费观看久久久 | 精品久久久久久久久久久久久久久久 | 91精品国产自产在线观看永久 | 麻豆手机在线 | 91网址在线观看 | 久久视频一区 | 国产麻豆剧果冻传媒视频播放量 | 韩国av在线播放 | 亚洲成人午夜在线 | 国产精品18p | 久久成电影 | 国产精品一区二区中文字幕 | 久久人人爽视频 | 日韩欧美大片免费观看 | 91最新在线 | 国产成人av电影在线观看 | 亚洲美女在线一区 | 99久高清在线观看视频99精品热在线观看视频 | 久久综合干 | 久久艹国产视频 | 久久人人爽人人爽人人片av免费 | 超碰97人人干 | 国产精品国产三级国产aⅴ入口 | 欧美日韩高清一区二区 | 亚洲精品小区久久久久久 | 香蕉久久久久久av成人 | 亚州精品天堂中文字幕 | 韩日三级av| 久久人人做| 久久这里只有精品首页 | 91精品国产一区二区三区 | 亚洲综合国产精品 | 久久理伦片 | 亚洲精品视频在线 | 中文字幕 国产精品 | 国产一区二区三区免费观看视频 | 69视频在线播放 | 色婷婷av一区二 | 麻豆av一区二区三区在线观看 | 91传媒视频在线观看 | 日韩av线观看 | 中文字幕国产在线 | 免费av观看| 国产精品网站一区二区三区 | 人人精品久久 | 久久在线免费视频 | 欧美日韩精品在线 | 国产精品国产三级国产不产一地 | 国产大陆亚洲精品国产 | 久草久草在线 | 国产精品成人av在线 | 精品久久久久一区二区国产 | 97色在线观看 | 成人av观看| 国产精品视频久久 | 亚洲精品人人 | 日韩精品久久久久 | 97在线观看视频 | 97色涩| 久久中国精品 | 91免费视频黄 | 免费福利在线播放 | 亚洲播播| 涩涩伊人 | 中日韩免费视频 | 欧美专区亚洲专区 | 日韩电影中文字幕在线 | 亚洲黄色一级电影 | 国产一卡久久电影永久 | 麻豆视频免费入口 | 中文字幕黄色 | 人人澡人人草 | 亚洲最大av网 | av成人动漫| 欧美一级黄色片 | 中文字幕免费高清在线观看 | 久久久久久97三级 | 国内精品久久久久久久 | 久久久免费观看完整版 | 国产精品激情在线观看 | 在线亚洲精品 | 香蕉一区 | 三级动态视频在线观看 | 久久久久亚洲国产精品 | 日韩激情av在线 | 国产精品video爽爽爽爽 | 正在播放国产91 | 亚洲九九爱 | 久久99精品波多结衣一区 | 国产小视频你懂的在线 | 天天看天天干 | 免费在线精品视频 | 99国产视频| 亚洲综合激情网 | 西西444www大胆高清图片 | 福利av影院 | 久久毛片高清国产 | 亚洲精品国产综合久久 | 最近中文字幕免费 | 天天操天天色综合 | 在线视频日韩精品 | 久久久精品午夜 | 西西444www大胆高清视频 | 欧美在线99 | 成人av动漫在线观看 | 三级黄色理论片 | 欧美日韩视频网站 | 99这里只有精品视频 | 国产无套精品久久久久久 | 婷婷国产v亚洲v欧美久久 | 日韩成人看片 | 欧美激情视频在线观看免费 | 免费在线看v | 国产a级精品 | 丁香五月亚洲综合在线 | 97国产大学生情侣酒店的特点 | 美女视频黄免费网站 | 高清视频一区二区三区 | 国产麻豆视频 | 色偷偷88888欧美精品久久久 | 中文字幕一区二区三区乱码不卡 | 欧美日韩国产在线精品 | 黄色软件网站在线观看 | 国产美女精品人人做人人爽 | 蜜臀久久99精品久久久无需会员 | 91麻豆精品91久久久久同性 | 色之综合网 | 国产精品第10页 | 午夜成人免费影院 | 久久午夜精品影院一区 | 99久久婷婷国产 | 国产精品免费视频观看 | 日本久久综合网 | 色偷偷av男人天堂 | 久久天天躁狠狠躁亚洲综合公司 | 麻豆精品视频 | 毛片视频电影 | 日本中文字幕免费观看 | 黄色亚洲| 久久国产成人午夜av影院宅 | 日本精品久久久久中文字幕5 | 精品福利网 | 久久精品影视 | 青春草视频在线播放 | 麻豆一区在线观看 | 成人一级在线 | 久久久国产精品一区二区三区 | 免费国产ww | 97爱| 久久无码精品一区二区三区 | 91麻豆国产福利在线观看 | 91福利视频免费观看 | 超碰免费成人 | 91伊人影院 | 国色综合 | 久草在线视频网站 | 超碰97人人干 | 国产手机视频精品 | 91传媒91久久久 | 日韩高清三区 | 亚洲在线高清 | 超碰999| 成人av高清在线 | 国产亚洲精品女人久久久久久 | 国产精品久久久久久久久久久杏吧 | 黄a在线 | 日韩精品中文字幕在线不卡尤物 | 天天色天天爱天天射综合 | 手机在线中文字幕 | 国产午夜三级一区二区三桃花影视 | 天天操夜夜曰 | 亚洲精品视频在线看 | 国产精品美女久久久久久久网站 | 黄色www免费| 日本久久不卡视频 | 久久精品久久久精品美女 | 国产精品视频你懂的 | 国产精品久久久久一区二区三区 | 欧美日韩有码 | 午夜国产在线观看 | 成人a视频片观看免费 | 婷婷在线免费观看 | 欧美a级一区二区 | 精品人妖videos欧美人妖 | 99久久久国产精品免费99 | 午夜18视频在线观看 | 亚洲成人国产精品 | 亚洲一区视频免费观看 | 久久综合亚洲鲁鲁五月久久 | 激情五月婷婷丁香 | 日本三级香港三级人妇99 | 深爱婷婷久久综合 | 国产成人精品亚洲a | 一区二区三区四区影院 | 亚洲小视频在线观看 | 久久久午夜精品福利内容 | 美女av免费看| 国产成人精品午夜在线播放 | 日日爽天天爽 | 精品美女久久久久久免费 | 波多野结衣视频一区二区 | 婷婷久久综合网 | 最近av在线| 香蕉视频免费在线播放 | 在线观看精品视频 | 天天色欧美 | 国产白浆在线观看 | 国产丝袜在线 | 麻豆精品传媒视频 | 婷婷六月综合亚洲 | 麻豆精品传媒视频 | 久久av影院 | 国产成人精品一区二区三区在线 | 色婷在线 | 午夜手机电影 | 亚洲视频aaa | 亚洲精品久久久久久久不卡四虎 | 色视频 在线 | 久草www| 久久国产精品网站 | 国产一级免费观看视频 | 伊人婷婷 | 日韩欧美国产激情在线播放 | 亚洲乱码国产乱码精品天美传媒 | 丁香五月亚洲综合在线 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久久国产一区二区三区四区小说 | 91精品蜜桃 | 久久影视中文字幕 | 久久高清免费视频 | 五月天久久激情 | 国产精品久久久久久久久久不蜜月 | 欧美日韩视频在线观看免费 | 99热.com | 午夜av在线电影 | 色播99| 国产91成人在在线播放 | 四虎影视国产精品免费久久 | 天天操夜夜爱 | 久久99国产精品视频 | 中文字幕免费一区 | 天天曰天天射 | 亚洲国产精品电影在线观看 | 字幕网资源站中文字幕 | 国产精品免费一区二区三区在线观看 | 99在线精品视频观看 | av综合 日韩| 国内成人精品2018免费看 | 9ⅰ精品久久久久久久久中文字幕 | 国内成人综合 | 香蕉网在线 | 国内精品视频在线 | 亚洲免费一级电影 | 天天操天天添 | 国产成人精品日本亚洲999 | 国产精品久久伊人 | 99热精品国产一区二区在线观看 | 在线看国产一区 | 国产大片免费久久 | 97电影院在线观看 | 人人干人人干人人干 | 高清免费av在线 | 国产黄色在线网站 | 92av视频 | 国产经典三级 | 国产成人av一区二区三区在线观看 | 91看片淫黄大片91 | 深夜免费福利视频 | 九九九热精品免费视频观看网站 | 深爱婷婷激情 | 欧美精品久久久久久久久免 | 天堂av官网 | 免费福利小视频 | 国产午夜精品一区二区三区 | av短片在线 | 精品中文字幕在线播放 | 99久久精品久久亚洲精品 | 久久精品美女视频 | 亚洲欧美日韩一级 | 很黄很污的视频网站 | 日韩精品中文字幕av | 日韩国产精品久久久久久亚洲 | 久久免费久久 | 国产一级片在线播放 | 97精产国品一二三产区在线 | 欧美一级大片在线观看 | 97视频在线观看视频免费视频 | 亚洲免费av电影 | 精品亚洲一区二区 | 91九色自拍| 黄网av在线 | 欧美成人基地 | 国产专区在线播放 | 久久久久久久久艹 | 一区二区三区手机在线观看 | 午夜免费视频网站 | 国产精品久久久久三级 | 国产一区在线视频播放 | 激情婷婷欧美 | 欧美福利视频一区 | 欧美日韩性 | 日本激情视频中文字幕 | 黄色aaa毛片| 色九九在线 | 成人福利在线 | 亚洲va欧洲va国产va不卡 | 日韩在线不卡av | 久久免费观看视频 | 91在线亚洲 | 欧美日韩18 | 青草视频在线 | 色视频网站在线观看一=区 a视频免费在线观看 | 国产一区在线不卡 | 69国产盗摄一区二区三区五区 | 精品国产一区二区三区久久久蜜臀 | 福利区在线观看 | 夜色成人网 | 欧美999| av电影不卡 | av资源免费观看 | 色综合天天狠天天透天天伊人 | 亚洲伦理中文字幕 | 可以免费看av | 亚洲精品国产自产拍在线观看 | 在线观看日韩精品视频 | 精品1区2区3区 | 视频在线观看亚洲 | 国产精品欧美一区二区 | 亚洲高清久久久 | 毛片精品免费在线观看 | av福利资源| 亚洲特级片 | 一级片视频在线 | 综合影视 | av韩国在线 | 午夜久久久久久久久久影院 | 欧美看片 | 久保带人 | bayu135国产精品视频 | 99久久久国产精品免费99 | 国产在线精品播放 | av综合 日韩 | 午夜精品视频免费在线观看 | 国产成人高清 | 欧美日韩性生活 | 免费一级黄色 | 在线观看成人毛片 | 在线免费观看视频a | 九九免费精品视频 | 超碰97人人干 | 亚洲午夜久久久综合37日本 | 欧美日韩一级久久久久久免费看 | 色五月情| 五月婷婷在线视频观看 | 中文字幕亚洲精品在线观看 | 亚洲欧美日韩国产一区二区三区 | 亚洲精品网址在线观看 | 中文字幕在线网 | 91九色网址| 黄色动态图xx | av一区二区三区在线播放 | 国产精品毛片一区二区在线看 | 国产精品久久久久久久久岛 | 欧美日韩高清一区二区 国产亚洲免费看 | 一区二区三区精品在线 | 国产精品久久久久av福利动漫 | 国产精品自产拍在线观看网站 | 91香蕉国产 | 91亚洲精品久久久久图片蜜桃 | 国产在线日韩 | 精品国产色 | 四虎小视频 | 99这里只有久久精品视频 | 欧美日韩视频在线观看免费 | 国产午夜精品一区二区三区四区 | 国产精品av免费在线观看 | 91理论电影 | 不卡av免费在线观看 | 亚洲闷骚少妇在线观看网站 | 国产精品嫩草在线 | 中文字幕久久精品一区 | 日韩精品一区二区三区高清免费 | 欧美综合在线观看 | 色吧av色av | 丝袜制服综合网 | 亚洲开心激情 | 美女久久99| 免费看片在线观看 | 一区二区三区精品久久久 | 免费美女av | se视频网址 | 亚洲涩综合 | 日日夜夜添 | 亚洲视频第一页 | www夜夜| 成人av一级片 | 亚洲国产成人精品电影在线观看 | 亚洲国产中文字幕在线 | 日韩精品免费在线播放 | 国产不卡在线观看 | av在观看| 国产精品免费大片视频 | 日韩高清免费在线观看 | 国产无吗一区二区三区在线欢 | 日韩在线观看视频网站 | 成人v| 久久永久视频 | 国产精国产精品 | 日本老少交| 骄小bbw搡bbbb揉bbbb | 久久激情综合网 | 欧美三人交 | 玖玖在线看 | 精品久久国产 | 四虎免费在线观看 | 992tv在线| 日韩精品视频在线免费观看 | 国产一区二区三区高清播放 | 91黄色影视 | 国产一区久久久 | 国产精品理论片 | 亚洲另类在线视频 | 亚洲精品国产第一综合99久久 | 成人在线免费视频 | 天天色成人网 | 天天操天天草 | 91热爆视频 | 久久毛片视频 | av在线电影网站 | 国产在线播放观看 | 91porny九色91啦中文 | 成人午夜影院在线观看 | 免费电影播放 | 你操综合 | 91久久精品一区 | 国产精品一区二区久久国产 | 婷婷丁香激情网 | 综合网伊人| 国产美女精品人人做人人爽 | 国产日产精品久久久久快鸭 | 91香蕉国产在线观看软件 | 播五月综合 | 免费亚洲成人 | 97电影在线观看 | 热精品 | 久久九九影院 | 亚洲理论在线观看 | 国产欧美在线一区二区三区 | 免费看的黄色 | 中文字幕视频网站 | 国产精品久久久久久爽爽爽 | 免费进去里的视频 | 99九九99九九九视频精品 | 中文字幕av免费在线观看 | 激情影音 | 婷婷丁香社区 | 91 在线视频播放 | 最新日韩视频在线观看 | 久久免费公开视频 | 色五月成人 | 成人在线免费av | 久草成人在线 | 麻豆成人精品 | www.亚洲视频 | 亚洲国产精品一区二区久久,亚洲午夜 | 激情网色| 在线看中文字幕 | 天天av在线播放 | 在线观看黄色的网站 | 福利视频网站 | 国产系列在线观看 | 中文字幕在线观看一区二区 | 中文字幕亚洲不卡 | 久久精品中文字幕少妇 | 国产一区二区三区视频在线 | 九九视频精品免费 | 国产成人99久久亚洲综合精品 | 国产特级毛片aaaaaaa高清 | 国产亚洲精品久久久久久久久久 | 久久久国产精品麻豆 | 五月婷在线| 午夜婷婷在线观看 | 久久观看| 国产婷婷视频在线 | 亚洲天天综合网 | 中文字幕av免费在线观看 | 丁香一区二区 | 国产一区在线免费观看 | 亚洲va韩国va欧美va精四季 | 欧美精品久久久久久久亚洲调教 | 中文在线中文a | 在线免费高清 | 欧美精品久久99 | 婷婷丁香花 | 天天躁日日 | 国产美女精品在线 | 久久久久久久久久影院 | 日韩精品免费在线 | 午夜久久网 | 狠狠操精品| 国产精品一区二区三区久久久 | 色综合久久网 | 国产精品18久久久久久不卡孕妇 | 69精品视频| 98超碰人人 | 精品国产一区二区三区久久久蜜月 | 九九影视理伦片 | 国产91九色蝌蚪 | 日韩av午夜在线观看 | av福利第一导航 | 日韩精品久久久久 | 久章草在线 | 国产精品自在线拍国产 | 美女精品久久久 | 久久久久成人精品 | 国产精品久久久av久久久 | 国产精品一区二区三区免费视频 | 色视频网站在线观看一=区 a视频免费在线观看 | 日本大片免费观看在线 | 成年美女黄网站色大片免费看 | 欧美久久影院 | 亚洲成人免费观看 | 91久久国产露脸精品国产闺蜜 | 日日干日日色 | 成人永久免费 | 在线观看视频99 | av一区二区三区在线观看 | av免费在线免费观看 | 婷婷久久亚洲 | a在线观看视频 | 国产网站在线免费观看 | 成人在线你懂得 | 亚洲综合视频在线 | 综合网婷婷 | 国产亚洲精品久久久久秋 | 午夜少妇一区二区三区 | 国产午夜一级毛片 | 午夜久久影视 | 91最新地址永久入口 | 亚洲播放一区 | 日韩免费一二三区 | 日韩av黄| 久久综合狠狠综合 | 国产分类视频 | 91欧美日韩国产 | 日韩区在线观看 | 日韩国产精品久久久久久亚洲 | 91九色最新地址 | 欧美视频在线观看免费网址 | 国产精品成人av在线 | 国产精品av在线 | 国产生活一级片 | 成人国产网站 | 亚洲 中文 在线 精品 | 911精品视频 | 日韩二区三区在线 | 色在线视频网 | 美女网站黄免费 | 中文字幕在线观看完整版电影 | 青草视频在线 | 免费看搞黄视频网站 | 综合影视 | 精品特级毛片 | 97在线免费观看视频 | 丁香九月婷婷 | 天天操天天射天天 | 国模一区二区三区四区 | 国产在线久久久 | 亚洲精品久久久久久中文传媒 | 99色| 亚洲精品在线观看网站 | www.天天草| 日韩有码网站 | 久久字幕网 | 天天曰天天干 | 99re8这里有精品热视频免费 | 五月激情婷婷丁香 | 中文字幕av免费观看 | 久久99欧美 | 日韩久久精品一区二区三区 | 国产精品色婷婷 | 国产成人av综合色 | av中文在线观看 | 亚洲乱亚洲乱亚洲 | 国产精品福利在线 | 中国成人一区 | www中文在线 | 国产清纯在线 | 天天综合网 天天 | 色在线视频 | 国产精品免费观看在线 | 久久综合色播五月 | 亚洲国产精彩中文乱码av | 国产麻豆剧传媒免费观看 | 久艹视频免费观看 | 91人人澡人人爽人人精品 | 伊人五月天| 国精产品999国精产 久久久久 | 国产高清不卡av | 一区二区三区国产欧美 | 93久久精品日日躁夜夜躁欧美 | 亚州国产精品久久久 | 欧美性一级观看 | 亚洲国产字幕 | 在线一区av| 国产视频精品在线 | 亚洲日日射 | 麻豆传媒视频在线免费观看 | 午夜免费视频网站 | 国产欧美最新羞羞视频在线观看 | 久久黄色精品视频 | 国产精品国产亚洲精品看不卡 | 欧美精品久久久久久 | 一区二区三区四区精品 | 91试看 | 香蕉视频网址 | 91传媒视频在线观看 | 黄色资源网站 | 久久综合精品国产一区二区三区 | 国产第一页在线观看 | 国产日韩欧美网站 | 四虎4hu永久免费 | 中文字幕在线中文 | 天天干夜夜操视频 | 91污视频在线 | av看片网址 | 成人免费观看大片 | 国产精品白丝av | 亚洲一区av | 日韩精品首页 | 在线日韩一区 | 成人精品99| 人人搞人人干 | www.五月婷 | 欧美久久久久久久久久久久久 | 特级黄录像视频 | 久久久久免费视频 | 国产精品成人自产拍在线观看 | 麻豆91精品视频 | 国内综合精品午夜久久资源 | 久久国产精品久久久久 | 国产黄色片免费观看 | av在线永久免费观看 | 久久久久电影 | 在线一区电影 | 91视视频在线直接观看在线看网页在线看 | 美女国产精品 | 超碰在线网 | 成人免费视频播放 | 成人av影视在线 | 久久香蕉电影网 | 国产成人免费av电影 | 国产精品美女网站 | 久久综合五月天婷婷伊人 | 美女网站色 | 成人在线观看网址 | 日韩欧美视频在线免费观看 | 欧美激情精品久久久久久变态 | 国产精品乱码一区二区视频 | 国产精品久免费的黄网站 | 97视频在线播放 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产a国产a国产a | 久久理论片| 国产精品一区在线 | 黄色在线看网站 | 欧美日韩99 | 伊人www22综合色 | 丁香六月色 | 久久综合久久综合这里只有精品 | 日韩电影在线视频 | 日韩视| 国内免费的中文字幕 | 欧美 国产 视频 | 美女网站在线免费观看 | 日韩免费视频播放 | 久久少妇免费视频 | 色噜噜噜噜| 在线免费观看的av | 色综合天天综合 | 激情 一区二区 | 国产精品久久久久久妇 | 日韩在线中文字幕视频 | 国产精品a久久久久 | 免费一级日韩欧美性大片 | 91av美女| 超碰av在线播放 | 精品久久1 | 国产精品theporn | 久久怡红院 | 免费视频一级片 | 亚洲精选99 | av线上看| 色婷婷综合在线 | 国产成人在线播放 | 精品国产欧美 | 国产精品久久久久9999吃药 | 97国产大学生情侣白嫩酒店 | 免费十分钟 | 麻豆视频在线 | 欧美精品网站 | 欧美亚洲国产日韩 | 国产精品久久久av久久久 | 色资源网在线观看 | 日韩视频一区二区 | 色在线免费 | 久久精品久久久久久久 | 九九99| 91一区啪爱嗯打偷拍欧美 | 欧美精品一二 | 日韩精品中文字幕在线不卡尤物 | 国产精品视频最多的网站 | 九九99| 国产一区二三区好的 | 久久在线电影 | 国产精品激情偷乱一区二区∴ | 国产成人一二片 | 91久久偷偷做嫩草影院 | 最新国产在线 | 久草免费手机视频 | 麻豆国产精品视频 | 中文字幕高清在线 | 天堂久久电影网 | 91天堂在线观看 | 91高清完整版在线观看 | 在线国产视频一区 | 国产亚洲精品久久网站 | 国产高清 不卡 | 中文字幕二区在线观看 | 免费看的黄色录像 | 精品国产自在精品国产精野外直播 | 韩国在线视频一区 | av色一区| 国产亚洲在线观看 | 亚洲国产中文在线观看 | 天天干天天玩天天操 | 久久久亚洲国产精品麻豆综合天堂 | 草在线 | 国产精品久久久久久久免费观看 | 久久99爱视频 | 国产精品18久久久久久久 | 免费a网 | 黄网站免费大全入口 | 久久精品牌麻豆国产大山 | 欧美xxxx性xxxxx高清 | 精品国产人成亚洲区 | 色视频网址 | 欧美精品你懂的 | 欧美一级日韩免费不卡 | 精品国产激情 | 国产精品久久99综合免费观看尤物 | 欧美午夜剧场 | 国产网站色 | 成人免费91 | 日韩成人看片 | 日韩精品免费一区 | 中文字幕一区二区三区久久蜜桃 | 中文字幕在线观看一区二区三区 | 操老逼免费视频 | 丁香婷婷激情网 | 国产一区二区在线播放 | 337p西西人体大胆瓣开下部 | 97国产 | 大荫蒂欧美视频另类xxxx | 91精品色 | 狠狠操导航 | 日日爱夜夜爱 | 狠狠色综合网站久久久久久久 | 超碰人人超 | 五月婷婷在线播放 | 国产高清视频色在线www | 91成人精品在线 | 欧美成人性网 | 波多野结衣在线视频免费观看 | 成人播放器 | 久久久蜜桃 | 手机色在线 | 国产最新在线视频 | 日本久久综合网 | 欧美精品在线观看 | 少妇视频一区 | 亚洲欧美一区二区三区孕妇写真 | 碰超在线 | 三级动态视频在线观看 | 中文字幕视频一区二区 | 久久久久国产成人精品亚洲午夜 | av超碰在线观看 | 婷婷久操| 青草草在线视频 | 美国av大片 | 天堂av在线7| 国产亚洲精品久久久久久 | 丰满少妇久久久 | 最近中文字幕大全 | 欧美一二三在线 | 一区二区三区四区不卡 | 亚洲精品伦理在线 | 日本成人中文字幕在线观看 | 男女啪啪视屏 | 国产精品福利在线播放 | 97福利 | 久久久久亚洲国产 | 97视频人人澡人人爽 | 久热超碰 | 中文字幕在线看片 | 亚洲欧美日韩国产一区二区三区 | 国产精品乱码在线 | 日韩欧美高清视频在线观看 | 久久成人一区二区 | 国产高清视频免费最新在线 | 亚洲精品激情 | 久久久www免费电影网 | 国产成人三级一区二区在线观看一 | 成人免费视频播放 | 97麻豆视频 | 久久精品久久精品久久精品 | 国产免费亚洲高清 | 一本—道久久a久久精品蜜桃 | 夜夜躁日日躁狠狠久久av | 干干日日 | 久久一区国产 | 免费观看的黄色片 | 国产精品99久久久久久武松影视 | 国产免费一区二区三区最新6 | 六月天色婷婷 | 日本久久精品 | 中文字幕中文字幕在线中文字幕三区 | 国产一区二区三区 在线 | 天天爽天天碰狠狠添 | 色婷婷综合五月 | 黄色毛片大全 | 久久久精品国产一区二区三区 | 久久久网页 | 欧美网址在线观看 | 亚洲va欧洲va国产va不卡 | 久久久久久久久福利 | 午夜影视剧场 | 激情五月婷婷 | 成人91在线 | 久久久精品久久日韩一区综合 | 亚洲一级二级三级 | 粉嫩av一区二区三区四区 | 九九视频免费观看视频精品 | 中文字幕在线中文 | 免费麻豆 | 成人小视频在线免费观看 | 操操日| 人人舔人人 | 亚洲激情在线视频 | 欧美美女激情18p | 精品美女在线观看 | 久久五月婷婷丁香社区 | 国产精品不卡在线观看 | 国产玖玖视频 | 亚洲日日夜夜 | 久久av免费观看 | 精品在线观 | 在线国产高清 | 欧美影院久久 | 中文字幕av在线不卡 | 香蕉在线播放 |