{"id":13955,"date":"2024-07-11T17:20:10","date_gmt":"2024-07-11T09:20:10","guid":{"rendered":"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955"},"modified":"2024-07-13T09:32:25","modified_gmt":"2024-07-13T01:32:25","slug":"zygoteinit%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90","status":"publish","type":"post","link":"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955","title":{"rendered":"ZygoteInit\u6e90\u7801\u5206\u6790"},"content":{"rendered":"<p>\u6e90\u7801\u4f4d\u7f6e\uff1aframeworks\/base\/core\/java\/com\/android\/internal\/os\/ZygoteInit.java<\/p>\n<p><a href=\"https:\/\/blog.csdn.net\/yiranfeng\/article\/details\/103550262\">https:\/\/blog.csdn.net\/yiranfeng\/article\/details\/103550262<\/a><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_16 counter-hierarchy counter-decimal ez-toc-grey\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\">\u76ee\u5f55<\/p>\n<span class=\"ez-toc-title-toggle\"><a class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" style=\"display: none;\"><i class=\"ez-toc-glyphicon ez-toc-icon-toggle\"><\/i><\/a><\/span><\/div>\n<nav><ul class=\"ez-toc-list ez-toc-list-level-1\"><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-1\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955\/#main%E6%96%B9%E6%B3%95\" title=\"main\u65b9\u6cd5\">main\u65b9\u6cd5<\/a><ul class=\"ez-toc-list-level-3\"><li class=\"ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-2\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955\/#1forkSystemServer%E6%96%B9%E6%B3%95\" title=\"1.forkSystemServer\u65b9\u6cd5\">1.forkSystemServer\u65b9\u6cd5<\/a><ul class=\"ez-toc-list-level-4\"><li class=\"ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-3\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955\/#%E2%86%92ZygoteforkSystemServer%EF%BC%88%E5%88%9B%E5%BB%BASystemServer%E5%AD%90%E8%BF%9B%E7%A8%8B%EF%BC%89\" title=\"\u2192Zygote.forkSystemServer\uff08\u521b\u5efaSystemServer\u5b50\u8fdb\u7a0b\uff09\">\u2192Zygote.forkSystemServer\uff08\u521b\u5efaSystemServer\u5b50\u8fdb\u7a0b\uff09<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-4\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955\/#%E2%86%92handleSystemServerProcess%E6%96%B9%E6%B3%95%EF%BC%88%E5%8F%8D%E5%B0%84SystemServer%E7%B1%BB%E7%9A%84main%E6%96%B9%E6%B3%95%EF%BC%89\" title=\"\u2192handleSystemServerProcess\u65b9\u6cd5\uff08\u53cd\u5c04SystemServer\u7c7b\u7684main\u65b9\u6cd5\uff09\">\u2192handleSystemServerProcess\u65b9\u6cd5\uff08\u53cd\u5c04SystemServer\u7c7b\u7684main\u65b9\u6cd5\uff09<\/a><ul class=\"ez-toc-list-level-5\"><li class=\"ez-toc-heading-level-5\"><a class=\"ez-toc-link ez-toc-heading-5\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955\/#%E2%86%92%E2%86%92createSystemServerClassLoader\" title=\"\u2192\u2192createSystemServerClassLoader\">\u2192\u2192createSystemServerClassLoader<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-5\"><a class=\"ez-toc-link ez-toc-heading-6\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955\/#%E2%86%92%E2%86%92zygoteInit\" title=\"\u2192\u2192zygoteInit\">\u2192\u2192zygoteInit<\/a><ul class=\"ez-toc-list-level-6\"><li class=\"ez-toc-heading-level-6\"><a class=\"ez-toc-link ez-toc-heading-7\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955\/#%E2%86%92%E2%86%92%E2%86%92RuntimeInitcommonInit\" title=\"\u2192\u2192\u2192RuntimeInit.commonInit()\">\u2192\u2192\u2192RuntimeInit.commonInit()<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-6\"><a class=\"ez-toc-link ez-toc-heading-8\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955\/#%E2%86%92%E2%86%92%E2%86%92RuntimeInitapplicationInit\" title=\"\u2192\u2192\u2192RuntimeInit.applicationInit\">\u2192\u2192\u2192RuntimeInit.applicationInit<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-9\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13955\/#2zygoteServerrunSelectLoop%E6%96%B9%E6%B3%95\" title=\"2.zygoteServer.runSelectLoop\u65b9\u6cd5\">2.zygoteServer.runSelectLoop\u65b9\u6cd5<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"main%E6%96%B9%E6%B3%95\"><\/span>main\u65b9\u6cd5<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<pre><code class=\"language-java\">823     @UnsupportedAppUsage\n 824     public static void main(String argv[]) {\n 825         ZygoteServer zygoteServer = null;\n 826 \n 827         \/\/ Mark zygote start. This ensures that thread creation will throw\n 828         \/\/ an error.\n 829         ZygoteHooks.startZygoteNoThreadCreation();\n 830 \n 831         \/\/ Zygote goes into its own process group.\n 832         try {\n 833             Os.setpgid(0, 0);\n 834         } catch (ErrnoException ex) {\n 835             throw new RuntimeException(&quot;Failed to setpgid(0,0)&quot;, ex);\n 836         }\n 837 \n 838         Runnable caller;\n 839         try {\n 840             \/\/ Report Zygote start time to tron unless it is a runtime restart\n 841             if (!&quot;1&quot;.equals(SystemProperties.get(&quot;sys.boot_completed&quot;))) {\n 842                 MetricsLogger.histogram(null, &quot;boot_zygote_init&quot;,\n 843                         (int) SystemClock.elapsedRealtime());\n 844             }\n 845 \n 846             String bootTimeTag = Process.is64Bit() ? &quot;Zygote64Timing&quot; : &quot;Zygote32Timing&quot;;\n 847             TimingsTraceLog bootTimingsTraceLog = new TimingsTraceLog(bootTimeTag,\n 848                     Trace.TRACE_TAG_DALVIK);\n 849             bootTimingsTraceLog.traceBegin(&quot;ZygoteInit&quot;);\n 850             RuntimeInit.enableDdms();\n 851 \n 852             boolean startSystemServer = false;\n 853             String zygoteSocketName = &quot;zygote&quot;;\n 854             String abiList = null;\n 855             boolean enableLazyPreload = false;\n856             for (int i = 1; i &lt; argv.length; i++) {\n 857                 if (&quot;start-system-server&quot;.equals(argv[i])) {\n 858                     startSystemServer = true;\n 859                 } else if (&quot;--enable-lazy-preload&quot;.equals(argv[i])) {\n 860                     enableLazyPreload = true;\n 861                 } else if (argv[i].startsWith(ABI_LIST_ARG)) {\n 862                     abiList = argv[i].substring(ABI_LIST_ARG.length());\n 863                 } else if (argv[i].startsWith(SOCKET_NAME_ARG)) {\n 864                     zygoteSocketName = argv[i].substring(SOCKET_NAME_ARG.length());\n 865                 } else {\n 866                     throw new RuntimeException(&quot;Unknown command line argument: &quot; + argv[i]);\n 867                 }\n 868             }\n 869 \n 870             final boolean isPrimaryZygote = zygoteSocketName.equals(Zygote.PRIMARY_SOCKET_NAME);\n 871 \n 872             if (abiList == null) {\n 873                 throw new RuntimeException(&quot;No ABI list supplied.&quot;);\n 874             }\n 875 \n 876             \/\/ In some configurations, we avoid preloading resources and classes eagerly.\n 877             \/\/ In such cases, we will preload things prior to our first fork.\n 878             if (!enableLazyPreload) {\n 879                 bootTimingsTraceLog.traceBegin(&quot;ZygotePreload&quot;);\n 880                 EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,\n 881                         SystemClock.uptimeMillis());\n 882                 preload(bootTimingsTraceLog);\n 883                 EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,\n 884                         SystemClock.uptimeMillis());\n 885                 bootTimingsTraceLog.traceEnd(); \/\/ ZygotePreload\n 886             } else {\n 887                 Zygote.resetNicePriority();\n 888             }\n890             \/\/ Do an initial gc to clean up after startup\n 891             bootTimingsTraceLog.traceBegin(&quot;PostZygoteInitGC&quot;);\n 892             gcAndFinalize();\n 893             bootTimingsTraceLog.traceEnd(); \/\/ PostZygoteInitGC\n 894 \n 895             bootTimingsTraceLog.traceEnd(); \/\/ ZygoteInit\n 896             \/\/ Disable tracing so that forked processes do not inherit stale tracing tags from\n 897             \/\/ Zygote.\n 898             Trace.setTracingEnabled(false, 0);\n 899 \n 900 \n 901             Zygote.initNativeState(isPrimaryZygote);\n 902 \n 903             ZygoteHooks.stopZygoteNoThreadCreation();\n 904 \n 905             zygoteServer = new ZygoteServer(isPrimaryZygote);\n 906 \n 907             if (startSystemServer) {\n 908                 Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);\n 909 \n 910                 \/\/ {@code r == null} in the parent (zygote) process, and {@code r != null} in the\n 911                 \/\/ child (system_server) process.\n 912                 if (r != null) {\n 913                     r.run();\n 914                     return;\n 915                 }\n 916             }\n 917 \n 918             Log.i(TAG, &quot;Accepting command socket connections&quot;);\n 919 \n 920             \/\/ The select loop returns early in the child process after a fork and\n 921             \/\/ loops forever in the zygote.\n 922             caller = zygoteServer.runSelectLoop(abiList);\n923         } catch (Throwable ex) {\n 924             Log.e(TAG, &quot;System zygote died with exception&quot;, ex);\n 925             throw ex;\n 926         } finally {\n 927             if (zygoteServer != null) {\n 928                 zygoteServer.closeServerSocket();\n 929             }\n 930         }\n 931 \n 932         \/\/ We&#039;re in the child process and have exited the select loop. Proceed to execute the\n 933         \/\/ command.\n 934         if (caller != null) {\n 935             caller.run();\n 936         }\n 937     }<\/code><\/pre>\n<p>\u6838\u5fc3\u4ee3\u7801\u622a\u53d6\uff1a<br \/>\n1)\u521b\u5efaZygoteServer\u5b9e\u4f8b<br \/>\n2)forkSystemServer<br \/>\n3)zygoteServer.runSelectLoop<\/p>\n<pre><code class=\"language-java\">Runnable caller;\ntry{\n...\n                zygoteServer = new ZygoteServer(isPrimaryZygote);\n 906 \n 907             if (startSystemServer) {\n 908                 Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);\n 909 \n 910                 \/\/ {@code r == null} in the parent (zygote) process, and {@code r != null} in the\n 911                 \/\/ child (system_server) process.\n 912                 if (r != null) {\n                         \/\/\u8c03\u7528SystemServer\u7684main\u65b9\u6cd5\n 913                     r.run();\n 914                     return;\n 915                 }\n 916             }\n 917 \n 918             Log.i(TAG, &quot;Accepting command socket connections&quot;);\n 919 \n 920             \/\/ The select loop returns early in the child process after a fork and\n 921             \/\/ loops forever in the zygote.\n 922             caller = zygoteServer.runSelectLoop(abiList);\n923         } catch (Throwable ex) {\n 924             Log.e(TAG, &quot;System zygote died with exception&quot;, ex);\n 925             throw ex;\n 926         } finally {\n 927             if (zygoteServer != null) {\n 928                 zygoteServer.closeServerSocket();\n 929             }\n 930         }\n 931 \n 932         \/\/ We&#039;re in the child process and have exited the select loop. Proceed to execute the\n 933         \/\/ command.\n 934         if (caller != null) {\n 935             caller.run();\n 936         }\n<\/code><\/pre>\n<h3><span class=\"ez-toc-section\" id=\"1forkSystemServer%E6%96%B9%E6%B3%95\"><\/span>1.forkSystemServer\u65b9\u6cd5<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u65b9\u6cd5\u7684\u4e00\u5f00\u59cb\u5c31\u5b9a\u4e49\u4e86args\u6570\u7ec4\uff0c\u5176\u4e2d\u6700\u540e\u4e3a&quot;com.android.server.SystemServer&quot;\uff0c\u5373SystemServer\u5168\u7c7b\u540d\uff0c\u4f1a\u4e00\u76f4\u5f80\u540e\u9762\u4f20\u9012\u3002<\/p>\n<h4><span class=\"ez-toc-section\" id=\"%E2%86%92ZygoteforkSystemServer%EF%BC%88%E5%88%9B%E5%BB%BASystemServer%E5%AD%90%E8%BF%9B%E7%A8%8B%EF%BC%89\"><\/span>\u2192Zygote.forkSystemServer\uff08\u521b\u5efaSystemServer\u5b50\u8fdb\u7a0b\uff09<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><a href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13969\">http:\/\/xinyiworld.top\/wordpress_it\/?p=13969<\/a><\/p>\n<h4><span class=\"ez-toc-section\" id=\"%E2%86%92handleSystemServerProcess%E6%96%B9%E6%B3%95%EF%BC%88%E5%8F%8D%E5%B0%84SystemServer%E7%B1%BB%E7%9A%84main%E6%96%B9%E6%B3%95%EF%BC%89\"><\/span>\u2192handleSystemServerProcess\u65b9\u6cd5\uff08\u53cd\u5c04SystemServer\u7c7b\u7684main\u65b9\u6cd5\uff09<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<pre><code class=\"language-java\"> 534             createSystemServerClassLoader();\n 535             ClassLoader cl = sCachedSystemServerClassLoader;\n 536             if (cl != null) {\n 537                 Thread.currentThread().setContextClassLoader(cl);\n 538             }\n 539 \n 540             \/*\n 541              * Pass the remaining arguments to SystemServer.\n 542              *\/\n 543             return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,\n 544                     parsedArgs.mRemainingArgs, cl);<\/code><\/pre>\n<h5><span class=\"ez-toc-section\" id=\"%E2%86%92%E2%86%92createSystemServerClassLoader\"><\/span>\u2192\u2192createSystemServerClassLoader<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<pre><code class=\"language-java\"> 556     private static void createSystemServerClassLoader() {\n 557         if (sCachedSystemServerClassLoader != null) {\n 558             return;\n 559         }\n 560         final String systemServerClasspath = Os.getenv(&quot;SYSTEMSERVERCLASSPATH&quot;);\n 561         \/\/ TODO: Should we run optimization here?\n 562         if (systemServerClasspath != null) {\n 563             sCachedSystemServerClassLoader = createPathClassLoader(systemServerClasspath,\n 564                     VMRuntime.SDK_VERSION_CUR_DEVELOPMENT);\n 565         }\n 566     }<\/code><\/pre>\n<p>\u6253\u5370\u73af\u5883\u53d8\u91cfSYSTEMSERVERCLASSPATH<\/p>\n<pre><code class=\"language-bat\">kona:\/ # set | grep SYSTEMSERVERCLASSPATH\nSYSTEMSERVERCLASSPATH=\/system\/framework\/services.jar:\/system\/framework\/ethernet-service.jar:\/system\/framework\/wifi-service.jar:\/system\/framework\/com.android\n.location.provider.jar<\/code><\/pre>\n<p>\u6211\u4eec\u77e5\u9053SystemServer.java\u5c31\u662f\u7f16\u8bd1\u5230\/system\/framework\/services.jar\u91cc\u7684\u3002<\/p>\n<h5><span class=\"ez-toc-section\" id=\"%E2%86%92%E2%86%92zygoteInit\"><\/span>\u2192\u2192zygoteInit<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<pre><code class=\"language-java\"> 977     public static final Runnable zygoteInit(int targetSdkVersion, String[] argv,\n 978             ClassLoader classLoader) {\n 979         if (RuntimeInit.DEBUG) {\n 980             Slog.d(RuntimeInit.TAG, &quot;RuntimeInit: Starting application from zygote&quot;);\n 981         }\n 982 \n 983         Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, &quot;ZygoteInit&quot;);\n 984         RuntimeInit.redirectLogStreams();\n 985 \n 986         RuntimeInit.commonInit();\n 987         ZygoteInit.nativeZygoteInit();\n 988         return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);\n 989     }<\/code><\/pre>\n<h6><span class=\"ez-toc-section\" id=\"%E2%86%92%E2%86%92%E2%86%92RuntimeInitcommonInit\"><\/span>\u2192\u2192\u2192RuntimeInit.commonInit()<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>commonInit()\u7684\u53ef\u89c1\u6027\u4fee\u9970\u7b26\u4e3aprotected\uff0cZygoteInit.java\u4e0eRuntimeInit.java\u5728\u540c\u4e00\u5305\u540d\u4e0b\uff0c\u6240\u4ee5\u80fd\u76f4\u63a5\u8c03\u7528\u3002<br \/>\n\u89c1\uff1a<a href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13980\">http:\/\/xinyiworld.top\/wordpress_it\/?p=13980<\/a><\/p>\n<p>\u5d29\u6e83\u6027\u7684\u5f02\u5e38\u6355\u83b7<\/p>\n<pre><code class=\"language-java\"> 67     \/**\n 68      * Logs a message when a thread encounters an uncaught exception. By\n 69      * default, {@link KillApplicationHandler} will terminate this process later,\n 70      * but apps can override that behavior.\n 71      *\/\n 72     private static class LoggingHandler implements Thread.UncaughtExceptionHandler {\n 73         public volatile boolean mTriggered = false;\n 74 \n 75         @Override\n 76         public void uncaughtException(Thread t, Throwable e) {\n 77             mTriggered = true;\n 78 \n 79             \/\/ Don&#039;t re-enter if KillApplicationHandler has already run\n 80             if (mCrashing) return;\n 81 \n 82             \/\/ mApplicationObject is null for non-zygote java programs (e.g. &quot;am&quot;)\n 83             \/\/ There are also apps running with the system UID. We don&#039;t want the\n 84             \/\/ first clause in either of these two cases, only for system_server.\n 85             if (mApplicationObject == null &amp;&amp; (Process.SYSTEM_UID == Process.myUid())) {\n 86                 Clog_e(TAG, &quot;*** FATAL EXCEPTION IN SYSTEM PROCESS: &quot; + t.getName(), e);\n 87             } else {\n 88                 StringBuilder message = new StringBuilder();\n 89                 \/\/ The &quot;FATAL EXCEPTION&quot; string is still used on Android even though\n 90                 \/\/ apps can set a custom UncaughtExceptionHandler that renders uncaught\n 91                 \/\/ exceptions non-fatal.\n 92                 message.append(&quot;FATAL EXCEPTION: &quot;).append(t.getName()).append(&quot;\\n&quot;);\n 93                 final String processName = ActivityThread.currentProcessName();\n 94                 if (processName != null) {\n 95                     message.append(&quot;Process: &quot;).append(processName).append(&quot;, &quot;);\n 96                 }\n 97                 message.append(&quot;PID: &quot;).append(Process.myPid());\n 98                 Clog_e(TAG, message.toString(), e);\n 99             }\n100         }\n101     }<\/code><\/pre>\n<h6><span class=\"ez-toc-section\" id=\"%E2%86%92%E2%86%92%E2%86%92RuntimeInitapplicationInit\"><\/span>\u2192\u2192\u2192RuntimeInit.applicationInit<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>RuntimeInit.applicationInit\u65b9\u6cd5\u89c1\uff1a<a href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13980\">http:\/\/xinyiworld.top\/wordpress_it\/?p=13980<\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"2zygoteServerrunSelectLoop%E6%96%B9%E6%B3%95\"><\/span>2.zygoteServer.runSelectLoop\u65b9\u6cd5<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u89c1\uff1a<a href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=13990\">http:\/\/xinyiworld.top\/wordpress_it\/?p=13990<\/a><\/p>\n<button class=\"simplefavorite-button\" data-postid=\"13955\" data-siteid=\"1\" data-groupid=\"1\" data-favoritecount=\"0\" style=\"\">\u6536\u85cf <i class=\"sf-icon-star-empty\"><\/i><\/button>","protected":false},"excerpt":{"rendered":"<p>\u6e90\u7801\u4f4d\u7f6e\uff1aframeworks\/base\/core\/java\/com\/android\/interna [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1047],"tags":[],"_links":{"self":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/13955"}],"collection":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=13955"}],"version-history":[{"count":21,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/13955\/revisions"}],"predecessor-version":[{"id":14004,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/13955\/revisions\/14004"}],"wp:attachment":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13955"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}