日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Xposed源码剖析——概述

發(fā)布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Xposed源码剖析——概述 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

XPosed是與Cydia其名的工具,它能夠讓Android設(shè)備在沒有修改源碼的情況下修改系統(tǒng)中的API運行結(jié)果。我們通常稱之為:God Mode(上帝模式)。

之前享大家分享了Xposed的基礎(chǔ),Xposed的作用和最簡單的用法。那么,它的原理和它的內(nèi)部構(gòu)造是如何構(gòu)成的?下面,我們從Github上看看,rovo89大神是如何制作的。

rovo89的github地址:https://github.com/rovo89

在主頁上我們看到了,xposed其實主要是由三個項目來組成的,如下圖所示;?

三個分別是:

項目 說明
Xposed Xposed框架的native部分(主要是改性app_process二進(jìn)制文件)
XposedInstaller Xposed框架的Android端本地管理,環(huán)境架構(gòu)搭建,以及第三方module資源下載的工具。
XposedBridge Xposed向開發(fā)者提供的API與相應(yīng)的工具類庫

XposedInstaller的構(gòu)成

Xposed項目使我們最常用的項目,當(dāng)然,他也是構(gòu)造Xposed的核心部分。(也許你會說,其實是xposed項目更重要,它主要是替換app_process,ok我們后面再說它)。

如下圖所示,是我們在XPosedInstaller apk中見到的,安裝xposed框架的界面。?

InstallerFragment我們能夠在其中找到install方法,其中主要就是針對使用不同方式的將自定義的app_process文件替換掉系統(tǒng)的app_process文件。

<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 install* @return 安裝成功返回true,否則false*/</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">private</span> boolean <span class="hljs-title" style="box-sizing: border-box;">install</span>() {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 獲取安裝的方式,直接寫入 or 使用 recovery進(jìn)行安裝</span>final <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">int</span> installMode = getInstallMode();<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 檢查獲取Root權(quán)限</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!startShell())<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>;List<String> messages = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> LinkedList<String>();boolean showAlert = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">true</span>;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">try</span> {messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.sdcard_location, XposedApp.getInstance().getExternalFilesDir(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>)));messages.add(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>);messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_copying, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Xposed-Disabler-Recovery.zip"</span>));<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 把Xposed-Disabler-Recovery.zip文件 從asset copy到sdcard中</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (AssetUtil.writeAssetToSdcardFile(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Xposed-Disabler-Recovery.zip"</span>, <span class="hljs-number" style="color:#06666;box-sizing: border-box;">00644</span>) == <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>) {messages.add(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>);messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_extract_failed, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Xposed-Disabler-Recovery.zip"</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;">false</span>;}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 將編譯后的app_process二進(jìn)制文件,從asset文件夾中,copy到/data/data/de.robv.android.xposed.installer/bin/app_process下</span>File appProcessFile = AssetUtil.writeAssetToFile(APP_PROCESS_NAME, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> File(XposedApp.BASE_DIR + <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"bin/app_process"</span>), <span class="hljs-number" style="color:#06666;box-sizing: border-box;">00700</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (appProcessFile == <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>) {showAlert(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_extract_failed, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"app_process"</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;">false</span>;}<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (installMode == INSTALL_MODE_NORMAL) {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 普通安裝模式</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 重新掛載/system為rw模式</span>messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_mounting_writable, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"/system"</span>));<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (mRootUtil.executeWithBusybox(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"mount -o remount,rw /system"</span>, messages) != <span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>) {messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_mount_writable_failed, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"/system"</span>));messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_trying_to_continue));}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 查看原有的app_process文件是否已經(jīng)備份,如果沒有備份,現(xiàn)將原有的app_process文件備份一下</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> File(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"/system/bin/app_process.orig"</span>).exists()) {messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_backup_already_exists, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"/system/bin/app_process.orig"</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> (mRootUtil.executeWithBusybox(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"cp -a /system/bin/app_process /system/bin/app_process.orig"</span>, messages) != <span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>) {messages.add(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>);messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_backup_failed, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"/system/bin/app_process"</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;">false</span>;} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">else</span> {messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_backup_successful, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"/system/bin/app_process.orig"</span>));}mRootUtil.executeWithBusybox(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"sync"</span>, messages);}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 將項目中的自定義app_process文件copy覆蓋系統(tǒng)的app_process,修改權(quán)限</span>messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_copying, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"app_process"</span>));<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (mRootUtil.executeWithBusybox(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"cp -a "</span> + appProcessFile.getAbsolutePath() + <span class="hljs-string" style="color:#0880;box-sizing: border-box;">" /system/bin/app_process"</span>, messages) != <span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>) {messages.add(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>);messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_copy_failed, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"app_process"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"/system/bin"</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;">false</span>;}<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (mRootUtil.executeWithBusybox(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"chmod 755 /system/bin/app_process"</span>, messages) != <span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>) {messages.add(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>);messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_set_perms_failed, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"/system/bin/app_process"</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;">false</span>;}<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (mRootUtil.executeWithBusybox(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"chown root:shell /system/bin/app_process"</span>, messages) != <span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>) {messages.add(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>);messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_set_owner_failed, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"/system/bin/app_process"</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;">false</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> (installMode == INSTALL_MODE_RECOVERY_AUTO) {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 自動進(jìn)入Recovery</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!prepareAutoFlash(messages, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Xposed-Installer-Recovery.zip"</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;">false</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> (installMode == INSTALL_MODE_RECOVERY_MANUAL) {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 手動進(jìn)入Recovery</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!prepareManualFlash(messages, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Xposed-Installer-Recovery.zip"</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;">false</span>;}File blocker = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> File(XposedApp.BASE_DIR + <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"conf/disabled"</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (blocker.exists()) {messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_removing, blocker.getAbsolutePath()));<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (mRootUtil.executeWithBusybox(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"rm "</span> + blocker.getAbsolutePath(), messages) != <span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>) {messages.add(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>);messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_remove_failed, blocker.getAbsolutePath()));<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;">// copy XposedBridge.jar 到私有目錄 XposedBridge.jar是Xposed提供的jar文件,負(fù)責(zé)在Native層與FrameWork層進(jìn)行交互</span>messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_copying, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"XposedBridge.jar"</span>));File jarFile = AssetUtil.writeAssetToFile(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"XposedBridge.jar"</span>, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> File(JAR_PATH_NEWVERSION), <span class="hljs-number" style="color:#06666;box-sizing: border-box;">00644</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (jarFile == <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>) {messages.add(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>);messages.add(getString(R.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">string</span>.file_extract_failed, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"XposedBridge.jar"</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;">false</span>;}mRootUtil.executeWithBusybox(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"sync"</span>, messages);showAlert = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">false</span>;messages.add(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (installMode == INSTALL_MODE_NORMAL) {offerReboot(messages);} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">else</span> {offerRebootToRecovery(messages, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Xposed-Installer-Recovery.zip"</span>, installMode);}<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-keyword" style="color:#0088;box-sizing: border-box;">finally</span> {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 刪除busybox 工具庫</span>AssetUtil.removeBusybox();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (showAlert)showAlert(TextUtils.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">join</span>(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"\n"</span>, messages).trim());}}</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><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li></ul>

ok,我們看完了代碼,發(fā)現(xiàn)所有的工作都是為了app_process文件的替換。那么,系統(tǒng)中這個app_process是做什么的?為什么我們需要替換?替換成什么樣?替換后對于我們么來說有什么幫助呢?


Xposed原理

我們在android的源碼中的init.rc文件可以看到

<code class="hljs livecodeserver 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;">service zygote /<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">system</span>/bin/app_process -Xzygote /<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">system</span>/bin –zygote –start-<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">system</span>-server <span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">socket</span> zygote stream <span class="hljs-number" style="color:#06666;box-sizing: border-box;">666</span> onrestart <span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">write</span> /sys/android_power/request_state wake onrestart <span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">write</span> /sys/power/state <span class="hljs-command" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">on</span></span> onrestart restart media onrestart restart netd</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></ul>

app_process是andriod app的啟動程序(具體形式是zygote fork()調(diào)用一個 app_process作為Android app的載體)

Xposed的實現(xiàn)方案

針對Hook的不同進(jìn)程來說又可以分為全局Hook與單個應(yīng)用程序進(jìn)程Hook,我們知道在Android系統(tǒng)中,應(yīng)用程序進(jìn)程都是由Zygote進(jìn)程孵化出來的,而Zygote進(jìn)程是由Init進(jìn)程啟動的。

Zygote進(jìn)程在啟動時會創(chuàng)建一個Dalvik虛擬機(jī)實例,每當(dāng)它孵化一個新的應(yīng)用程序進(jìn)程時,都會將這個Dalvik虛擬機(jī)實例復(fù)制到新的應(yīng)用程序進(jìn)程里面去,從而使得每一個應(yīng)用程序進(jìn)程都有一個獨立的Dalvik虛擬機(jī)實例。所以如果選擇對Zygote進(jìn)程Hook,則能夠達(dá)到針對系統(tǒng)上所有的應(yīng)用程序進(jìn)程Hook,即一個全局Hook。如下圖所示:



原文地址: http://blog.csdn.net/yzzst/article/details/47659987

總結(jié)

以上是生活随笔為你收集整理的Xposed源码剖析——概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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