xposed installer3.0版本之后,傳統(tǒng)的xposed框架的使用方法是從官網(wǎng)上下載xposed installer.apk以及xposed-arm-sdk22.zip包。然后具體的使用方法是將xposed installer.apk安裝到手機(jī),然后在手機(jī)上進(jìn)入recovery模式,將下載的xposed-arm-sdk22.zip刷入手機(jī)。完成之后xposed installer才可以正常使用。本文寫(xiě)了另一種xposed框架的使用辦法:編譯xposed源碼,生成xposed相關(guān)的應(yīng)用程序和so庫(kù)等文件,然后將這些應(yīng)用程序和so庫(kù)文件集成到android系統(tǒng)中,重新打包生成鏡像文件,燒入手機(jī)。
文檔主要用于xposed源碼的編譯以及xposed的集成工作。在編譯過(guò)程中,主要是通過(guò)Xposed Tools進(jìn)行編譯;在集成過(guò)程中,將xposed的編譯之后生成的文件替換到android系統(tǒng)中,打包之后重新生成鏡像文件,將鏡像文件刷入到手機(jī)查看日志信息來(lái)判斷是否成功。
由于在集成過(guò)程中是將xposed的編譯生成文件打包到android5.1系統(tǒng)中重新生成鏡像文件,然后將鏡像文件燒入到nexus5手機(jī),所以需要對(duì)android源碼進(jìn)行編譯,并在執(zhí)行l(wèi)unch選擇對(duì)應(yīng)源碼代號(hào)時(shí)選擇nexus5對(duì)應(yīng)的android源碼代號(hào)。
環(huán)境配置
-
源碼版本
在整個(gè)過(guò)程中,使用到了android系統(tǒng)源碼和xposed源碼。
android系統(tǒng)源碼版本是 LYM48M
查看源碼版本的方法:在源碼路徑下,查看
/build/core/build_id.mk文件中的BUILD_ID即為源碼的版本號(hào)。如下圖所示。
BUILD ID
xposed源碼版本需要是android5.1源碼對(duì)應(yīng)的版本。可以在github上進(jìn)行下載,具體的下載方法后文中會(huì)詳細(xì)說(shuō)明。
-
系統(tǒng)環(huán)境
電腦系統(tǒng)是ubuntu 14.04
jdk安裝的是openjdk-7-jdk具體信息如下圖所示
fasjava版本信息
android5.1源碼編譯需要使用openjdk,不再使用oracle的jdk。
-
測(cè)試機(jī)環(huán)境
測(cè)試機(jī)使用的是nexus 5手機(jī),nexus5對(duì)應(yīng)的android源碼代號(hào)是aosp_hammerhead_userdebug
文檔主要通過(guò)如下六個(gè)步驟完成xposed源碼的編譯和集成
- 編譯android源碼
- 將android 5.1的img文件刷入手機(jī)
- 編譯XposedBridge
- 使用Xposed Tools
- 將xposed框架集成到Android系統(tǒng)
- 集成測(cè)試
一 編譯android源碼
為了將xposed框架集成到nexus5手機(jī),需要先編譯nexus5手機(jī)對(duì)應(yīng)的android源碼。具體步驟如下
下載android 5.1源代碼
使用repo下載android5.1源代碼。-
初始化編譯環(huán)境
在源碼目錄下運(yùn)行source ./build/envsetup.sh。如圖所示。
envsetup -
選擇版本
執(zhí)行命令lunch,選擇后續(xù)驗(yàn)證時(shí)使用的手機(jī)對(duì)應(yīng)的版本。
由于我在驗(yàn)證xposed編譯結(jié)果的時(shí)候是在nexus5上進(jìn)行的,所以在選擇版本的時(shí)候選擇的是nexus5對(duì)應(yīng)的版本。
lunch
nexus5對(duì)應(yīng)的是aosp_hammerhead_userdebug
- 編譯android源碼
接著在android源碼目錄下執(zhí)行make命令編譯源碼。第一次編譯android源碼建議使用make命令進(jìn)行編譯。為了加快編譯速度,可以開(kāi)多個(gè)線程進(jìn)行編譯。例如make -j16命令,開(kāi)16線程編譯android源碼。
編譯android源碼
make編譯android源碼的所有模塊,mmm僅編譯指定的模塊。在使用mmm編譯指定模塊之前,需要保證之前使用make命令對(duì)整個(gè)源代碼進(jìn)行編譯。
編譯后會(huì)將編譯結(jié)果放到out文件夾下。

其中img文件路徑是out/target/product/hammerhead下。

二 將android5.1的img文件刷入手機(jī)
- 進(jìn)入fastboot模式
終端執(zhí)行sudo adb reboot bootloader命令,手機(jī)進(jìn)入fastboot模式。 - 將img文件刷入到手機(jī)
在這一步會(huì)將boot.img,userdata.img,cache.img,system.img。
以system.img為例。在進(jìn)入fastboot模式之后,在終端繼續(xù)執(zhí)行命令
fastboot flash system system.img
創(chuàng)建system分區(qū),將system.img文件刷入system分區(qū)中。由于fastboot對(duì)刷入的img文件大小有限制,所以可能存在因?yàn)閕mg文件太大導(dǎo)致刷入失敗,這是可以添加了-S 50M參數(shù),將system.img分成小塊來(lái)刷入到手機(jī),完整的命令如下
fastboot -S 50M flash system system.img
運(yùn)行結(jié)果如下圖所示。
將system.img刷入到手機(jī)
從圖中可以看到,添加了參數(shù)之后,分成了一些小塊將system.img文件刷入到手機(jī)。
- 重啟手機(jī)
在將img文件全部刷入到手機(jī)之后執(zhí)行fastboot reboot命令,重新啟動(dòng)手機(jī),之后可以看到手機(jī)現(xiàn)在的系統(tǒng)的android5.1系統(tǒng)。刷機(jī)成功
三 編譯XposedBridge
- 下載XposedBridge的源代碼
從github上下載XposedBridge。點(diǎn)擊右側(cè)下載
Xposed Bridge -
編寫(xiě)Android.mk文件
Android.mk是Android提供的一種makefile文件,用來(lái)指定諸如編譯生成so庫(kù)名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態(tài)庫(kù)文件等。編寫(xiě)android.mk文件,將編譯需要的源代碼,編譯生成的結(jié)果形式等信息告知ndk build編譯系統(tǒng)。Android.mk文件內(nèi)容如下所示。
Android.mk -
移動(dòng)Xposed Bridge工程
將Android.mk文件放到XposedBridge源碼目錄下,然后將整個(gè)工程放到Android源碼目錄下。如下圖所示。
xposedbridge -
編譯Xposed Bridge
因?yàn)樵谇斑吘幾gandroid5.1源碼的時(shí)候,已經(jīng)使用make命令進(jìn)行了一次編譯,所以在這里直接使用mmm命令編譯XposedBridge模塊。在android源碼下使用mmm命令編譯xposedbridge模塊。命令形式為mmm [模塊路徑]。
編譯XposedBridge
/home/sakura/Android-5.1.1-r14-compiled/XposedBridge-art/是我電腦上Xposed Bridge源碼路徑
編譯成功之后,生成XposedBridge.jar包,存放在/out/target/product/hammerhead/system/framework/文件夾下。
四 使用xposed tools
- 下載xposed tools
在github上下載xposed tools文件。點(diǎn)擊xposed tools進(jìn)入到github頁(yè)面,如下圖
點(diǎn)擊上圖中紅色部分選擇的按鈕,下載xposed tools的zip包。xposedtools下載 - 配置build.conf文件
build.conf文件是一個(gè)配置文件,會(huì)被build.pl讀取使用。build文件中主要定義了編譯xposed的結(jié)果的存放路徑,android源碼的路徑,還有一些版本信息之類(lèi)的值。
將下載的zip包解壓,在文件夾下創(chuàng)建build.conf文件。然后編輯build.conf文件。build.conf內(nèi)容如下圖所示。
[General]
outdir = /home/xposed/out
[Build]
version = 65(custom build by author )
makeflags = -j16
[AospDir]
22 = /home/Android-5.1.1
outdir指向的路徑是xposed編譯之后生成的文件的存放路徑。
version的值和后邊的參數(shù)是自己設(shè)置的。編譯之后會(huì)寫(xiě)入到xposed.prop文件中。
makeflags是設(shè)置在后邊編譯過(guò)程中使用的線程數(shù)。
AospDir指向的路徑是android源碼存放的路徑,前邊的值是源碼對(duì)應(yīng)的SDK的版本號(hào)。這里我指向的是android5.1.1的源碼,對(duì)應(yīng)的android sdk的版本是22。
- 替換文件
在進(jìn)行文件替換之前,請(qǐng)將被替換的文件做一個(gè)備份,便于以后恢復(fù)時(shí)使用
3.1 下載xposed相關(guān)文件
從github上克隆xposed兩個(gè)倉(cāng)庫(kù)到本地。分別是xposed和art。點(diǎn)擊下載zip包,解壓壓縮包得到xposed文件夾和art文件夾。xposed文件夾包括xposed修改之后的app_process等應(yīng)用程序和libxposed_*.so等庫(kù)文件的源碼;art文件夾主要包括xposed修改之后的art虛擬機(jī)的文件。
在下載art時(shí),要選擇android 5.1對(duì)應(yīng)的art分支。如下圖紅色部分
art下載
3.2 替換文件
用3.1中下載的art文件夾替換/home/Android-5.1.1目錄下的art文件夾。

將3.1中下載的xposed文件夾移動(dòng)到/home/Android-5.1.1/frameworks/base/cmds/文件夾下。

在build.conf文件中outdir目錄下創(chuàng)建一個(gè)java文件夾,然后將第三部分中生成的XposedBridge.jar包放到j(luò)ava文件夾下。如下圖所示。

- 使用build.pl編譯xposed源碼
build.pl文件在xposed tools文件夾下。在文件中有對(duì)build.pl文件的參數(shù)的設(shè)置規(guī)則等信息,如下所示
build.pl
從上圖可以看到build.pl主要可以完成的工作有四個(gè),分別是編譯生成xposed的可執(zhí)行程序和庫(kù)文件,將編譯之后的文件拷貝到配置文件指定的輸出路徑下,創(chuàng)建xposed.prop文件,創(chuàng)建flashable ZIP文件。在參數(shù)中可以使用-t 針對(duì)指定的目標(biāo)進(jìn)行創(chuàng)建。在xposed tools目錄下運(yùn)行
./build.pl -t arm:22
build arm files for SDK22(對(duì)應(yīng)的是Android5.1系統(tǒng))
在執(zhí)行過(guò)程中,可能會(huì)提示缺少一些依賴包,例如可能會(huì)缺少Config::IniFiles,使用apt-cache search Config::IniFiles搜索,安裝缺少的包即可。
-
結(jié)果
build.pl -t運(yùn)行結(jié)束之后,會(huì)將生成的xposed的可執(zhí)行程序和so庫(kù)等文件放入到build.conf配置文件中指定的輸出目錄下。包括lib文件夾下的五個(gè)so庫(kù)和bin文件加下的四個(gè)可執(zhí)行程序以及一個(gè)配置文件。如下圖所示。
xposed結(jié)果
五 將xposed框架集成到Android系統(tǒng)
- 替換文件
用第四部分中生成的bin文件夾和lib文件夾下的文件替換Android-5.1.1/out/target/product/hammerhead/system/文件夾下的bin文件和lib文件里的相同的文件。需要注意的是用xposed編譯生成的app_process32_xposed替換system/bin文件夾下的app_process32 -
移動(dòng)文件
將xposed.prop文件移動(dòng)到system文件夾下。
移動(dòng)xposed.prop - 重新生成鏡像文件
替換完成之后在android源碼目錄執(zhí)行一遍
source ./build/envsetup.sh
lunch
make snod
make snod命令的作用是重新生成鏡像文件。
六 集成測(cè)試
- 將修改之后的img文件刷入手機(jī)
具體步驟請(qǐng)看第二部分 - 查看結(jié)果
重啟手機(jī),抓取日志,查看xposedbridge.jar包是否成功導(dǎo)入。
日志查看命令
adb logcat | grep -i xposed
成功日志















