Xposed源码剖析——Xposed初始化
承接上文?http://blog.csdn.net/yzzst/article/details/47829657
之前我們看過了app_main.cpp源碼,知道了在其中,啟動了XposedBridge.jar方法。那么,其中還做了些什么事情呢?
之前我們也看到了在app_main.cpp還有幾處新增的邏輯。xposed::initialize和onVmCreated回調。下面我在仔細的閱讀以下源碼。
xposed::initialize初始化
對于xposed::initalize的初始化工作,我們能夠在xposed.cpp中看到其具體的邏輯實現。
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">/** * 初始化xposed*/</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">bool</span> initialize(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">bool</span> zygote, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">bool</span> startSystemServer, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">char</span>* className, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">int</span> argc, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">char</span>* <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">const</span> argv[]) { <span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">#<span class="hljs-keyword" style="color:#444444;box-sizing: border-box;">if</span> !defined(XPOSED_ENABLE_FOR_TOOLS)</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!zygote)<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">false</span>; <span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">#<span class="hljs-keyword" style="color:#444444;box-sizing: border-box;">endif</span></span>xposed->zygote = zygote;xposed->startSystemServer = startSystemServer;xposed->startClassName = className;xposed->xposedVersionInt = xposedVersionInt;<span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">#<span class="hljs-keyword" style="color:#444444;box-sizing: border-box;">if</span> XPOSED_WITH_SELINUX</span>xposed->isSELinuxEnabled = is_selinux_enabled() == <span class="hljs-number" style="color:#06666;box-sizing: border-box;">1</span>;xposed->isSELinuxEnforcing = xposed->isSELinuxEnabled && security_getenforce() == <span class="hljs-number" style="color:#06666;box-sizing: border-box;">1</span>; <span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">#<span class="hljs-keyword" style="color:#444444;box-sizing: border-box;">else</span></span>xposed->isSELinuxEnabled = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">false</span>;xposed->isSELinuxEnforcing = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">false</span>; <span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">#<span class="hljs-keyword" style="color:#444444;box-sizing: border-box;">endif</span> // XPOSED_WITH_SELINUX</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (startSystemServer) {xposed::logcat::start();} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (zygote) {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// TODO Find a better solution for this</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// Give the primary Zygote process a little time to start first.</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// This also makes the log easier to read, as logs for the two Zygotes are not mixed up.</span>sleep(<span class="hljs-number" style="color:#06666;box-sizing: border-box;">10</span>);}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 打印rom信息</span>printRomInfo();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (startSystemServer) {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!xposed::service::startAll())<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">false</span>; <span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">#<span class="hljs-keyword" style="color:#444444;box-sizing: border-box;">if</span> XPOSED_WITH_SELINUX</span>} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (xposed->isSELinuxEnabled) {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!xposed::service::startMembased())<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">false</span>; <span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">#<span class="hljs-keyword" style="color:#444444;box-sizing: border-box;">endif</span> // XPOSED_WITH_SELINUX</span>}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// FIXME Zygote has no access to input devices, this would need to be check in system_server context</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (zygote && !isSafemodeDisabled() && detectSafemodeTrigger(shouldSkipSafemodeDelay()))disableXposed();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (isDisabled() || (!zygote && shouldIgnoreCommand(argc, argv)))<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">false</span>;<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 將XposedBridge.jar的路徑添加到環境變量classpath中</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> addJarToClasspath(); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li></ul>* onVmCreated 初始化后的準備工作 *
其具體的邏輯如下所示:
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/** * 向當前的runtime中載入libxposed_*.so */</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> onVmCreated(JNIEnv* env) {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// Determine the currently active runtime</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">char</span>* xposedLibPath = NULL;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!determineRuntime(&xposedLibPath)) {ALOGE(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Could not determine runtime, not loading Xposed"</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// Load the suitable libxposed_*.so for it</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">char</span> *error;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span>* xposedLibHandle = dlopen(xposedLibPath, RTLD_NOW);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!xposedLibHandle) {ALOGE(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Could not load libxposed: %s"</span>, dlerror());<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// Clear previous errors</span>dlerror();<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// Initialize the library</span>bool (*xposedInitLib)(XposedShared* shared) = NULL;*(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> **) (&xposedInitLib) = dlsym(xposedLibHandle, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"xposedInitLib"</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!xposedInitLib) {ALOGE(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Could not find function xposedInitLib"</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;}#<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> XPOSED_WITH_SELINUXxposed->zygoteservice_accessFile = &service::membased::accessFile;xposed->zygoteservice_statFile = &service::membased::statFile;xposed->zygoteservice_readFile = &service::membased::readFile; #endif <span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// XPOSED_WITH_SELINUX</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 這里的xposed變量,其實是一個全局的XposedShare。</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 調用XposedShare的onVmCreated則會根據不同的vm架構針對不同的實現。</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (xposedInitLib(xposed)) {xposed->onVmCreated(env);} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li></ul>* libxposed_dalvik.cpp hook環境初始化*
<code class="hljs scala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/** Called by Xposed's app_process replacement. * 在被替換后的app_process中調用*/</span> bool xposedInitLib(xposed::XposedShared* shared) {xposed = shared;<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 將自己的onVmCreated方法,指向onVmCreated方法</span>xposed->onVmCreated = &onVmCreated;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">true</span>; }<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/** Called very early during VM startup. * 在VM啟動的時候調用,而且調用時機比較早*/</span> void onVmCreated(JNIEnv* env) {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!initMemberOffsets(env))<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 找到小米系統的MIUI_RESOURCE做特殊處理</span>j<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">classMiuiResources</span> = <span class="hljs-title" style="color:#66066;box-sizing: border-box;">env</span>-><span class="hljs-title" style="color:#66066;box-sizing: border-box;">FindClass</span><span class="hljs-params" style="color:#66066;box-sizing: border-box;">(CLASS_MIUI_RESOURCES)</span>;</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (classMiuiResources != NULL) {ClassObject* clazz = (ClassObject*)dvmDecodeIndirectRef(dvmThreadSelf(), classMiuiResources);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (dvmIsFinalClass(clazz)) {ALOGD(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Removing final flag for class '%s'"</span>, CLASS_MIUI_RESOURCES);clazz->accessFlags &= ~ACC_FINAL;}}env->ExceptionClear();j<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">classXTypedArray</span> = <span class="hljs-title" style="color:#66066;box-sizing: border-box;">env</span>-><span class="hljs-title" style="color:#66066;box-sizing: border-box;">FindClass</span><span class="hljs-params" style="color:#66066;box-sizing: border-box;">(CLASS_XTYPED_ARRAY)</span>;</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (classXTypedArray == NULL) {ALOGE(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Error while loading XTypedArray class '%s':"</span>, CLASS_XTYPED_ARRAY);dvmLogExceptionStackTrace();env->ExceptionClear();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;}prepareSubclassReplacement(classXTypedArray);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 獲取到全局的XposedBridge</span>classXposedBridge = env->FindClass(CLASS_XPOSED_BRIDGE);classXposedBridge = reinterpret_cast<jclass>(env->NewGlobalRef(classXposedBridge));<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (classXposedBridge == NULL) {ALOGE(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Error while loading Xposed class '%s':"</span>, CLASS_XPOSED_BRIDGE);dvmLogExceptionStackTrace();env->ExceptionClear();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 注冊一些 XposedBridge 的 native 方法</span>ALOGI(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Found Xposed class '%s', now initializing"</span>, CLASS_XPOSED_BRIDGE);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (register_natives_XposedBridge(env, classXposedBridge) != JNI_OK) {ALOGE(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Could not register natives for '%s'"</span>, CLASS_XPOSED_BRIDGE);dvmLogExceptionStackTrace();env->ExceptionClear();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;}xposedLoadedSuccessfully = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">true</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li></ul>JNI方法注冊邏輯
這里注冊的幾個方法都是,Xposed核心的幾個方法函數。
<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">int</span> register_natives_XposedBridge(JNIEnv* env, jclass clazz) {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">const</span> JNINativeMethod methods[] = {NATIVE_METHOD(XposedBridge, getStartClassName, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"()Ljava/lang/String;"</span>),<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 獲得Runtime</span>NATIVE_METHOD(XposedBridge, getRuntime, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"()I"</span>),<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 啟動SystemServer</span>NATIVE_METHOD(XposedBridge, startsSystemServer, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"()Z"</span>),<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 獲取Xposed的版本信息</span>NATIVE_METHOD(XposedBridge, getXposedVersion, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"()I"</span>),<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 初始化navtive</span>NATIVE_METHOD(XposedBridge, initNative, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"()Z"</span>),<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// hook一個方法的native實現</span>NATIVE_METHOD(XposedBridge, hookMethodNative, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"(Ljava/lang/reflect/Member;Ljava/lang/Class;ILjava/lang/Object;)V"</span>), <span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">#ifdef ART_TARGET</span>NATIVE_METHOD(XposedBridge, invokeOriginalMethodNative,<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"(Ljava/lang/reflect/Member;I[Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;"</span>), <span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">#endif</span>NATIVE_METHOD(XposedBridge, setObjectClassNative, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"(Ljava/lang/Object;Ljava/lang/Class;)V"</span>),NATIVE_METHOD(XposedBridge, dumpObjectNative, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"(Ljava/lang/Object;)V"</span>),NATIVE_METHOD(XposedBridge, cloneToSubclassNative, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;"</span>),};<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> env->RegisterNatives(clazz, methods, NELEM(methods)); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li></ul>我們看到RegisterNatives這個方法的時候不是很理解,這里做一個簡介。
以前在jni中寫本地方法時,都會寫成 Java_com_example_hellojni_HelloJni_stringFromJNI的形式,函數名很長,而且當類名變了的時候,函數名必須一個一個的改,麻煩。?
現在好了有了RegisterNatives,可以簡化我們的書寫?
和傳統方法相比,使用RegisterNatives的好處有三點:?
1. C++中函數命名自由,不必像javah自動生成的函數聲明那樣,拘泥特定的命名方式;?
2. 效率高。傳統方式下,Java類call本地函數時,通常是依靠VM去動態尋找.so中的本地函數(因此它們才需要特定規則的命名格式),而使用RegisterNatives將本地函數向VM進行登記,可以讓其更有效率的找到函數;?
3. 運行時動態調整本地函數與Java函數值之間的映射關系,只需要多次call RegisterNatives()方法,并傳入不同的映射表參數即可。
原文地址: http://blog.csdn.net/yzzst/article/details/47834077
總結
以上是生活随笔為你收集整理的Xposed源码剖析——Xposed初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xposed源码剖析——app_proc
- 下一篇: Xposed源码剖析——hook具体实现