Xposed源碼編譯踩坑實錄


參考博文

編譯Xposed

Xposed簡介

  • Xposed是Android平台上的有名的Hook工具,用它可以修改函數參數,函數返回值和類字段值等等,也可以用它來進行調試。Xposed有幾個部分組成:修改過的android_art,這個項目修改部分art代碼,使Hook成為可能
  • Xposed native部分,該部分主要提供給XposedBridge可調用api和調用修改過的android_art的api,還有生成可替換的app_process程序
  • XposedBridge,該項目是主要功能是提供給Xposed的模塊開發者api,它將編譯成XposedBridge.jar
  • XposedInstaller,該項目是Xposed安裝器,使得普通用戶在使用Xposed更方便,同時,它還可以管理手機上已經安裝的Xposed模塊,它編譯完成后將生成apk文件,本文不討論如何編譯它。

編譯准備

配置

  • Android-ART

    • 將Android源碼下的art目錄移動到其他路徑備份,比如Android源碼的上層路徑
    • 在Android源碼路徑執行git clone https://github.com/rovo89/android_art -b xposed-nougat-mr2 art,注意根據Android源碼版本選擇分支或者對應的標簽,或者git checkout xposed-marshmallow 直接切換到對應的遠程分支
  • Xposed Native

  • XposedBridge

    • 在任意目錄執行git clone https://github.com/rovo89/XposedBridge -b art,然后導入Android Studio中,點Build->Rebuild Project,會在app/build/intermediates/transform/preDex/release目錄下生成.jar文件,將生成的jar文件重命名為XposedBridge.jar,放入Android源碼目錄下的out/java/下。也可以直接生成apk,然后將生成的apk后綴改為jar
    • 將生成的jar導入aosp/out/target/product/hammerhead/system/framework/

這里jar文件存放的目錄不同的博文是不一致的,但是覺得framework里面靠譜一點

注:如果想生成供Xposed模塊調用的XposedBridge.jar,則在Android Studio的右側打開Gradle Project,雙擊jarStubs就會在app/build/api生成api.jar

  • XposedTools
    • 在任意目錄執行git clone https://github.com/rovo89/XposedTools,將XposedTools目錄下的build.conf.sample復制一份,並將它重命名為build.conf,build.conf文件用於配置構建環境,我們來看他的內容:
[General]
# 如果不編譯XposedBridge,需要自行將XposedBridge.jar放置到輸出目錄的 java文件夾下
outdir = /home/misty/bin/WORKING_DIRECTORY/out
#javadir = /android/XposedBridge

[Build]
# Please keep the base version number and add your custom suffix
version = 86 (custom build by xyz / %s)
# makeflags = -j4

[GPG]
sign = release
user = 852109AA!

# Root directories of the AOSP source tree per SDK version
[AospDir]
#19 = /android/aosp/440
#21 = /android/aosp/500
23 = /home/misty/bin/WORKING_DIRECTORY
                                                             
# SDKs to be used for compiling BusyBox
# Needs https://github.com/rovo89/android_external_busybox

#[BusyBox]
#arm = 23
#x86 = 23
#armv5 = 23



* outdir:指定Android源碼中的out目錄
* javadir:指定XposedBridge目錄,如果你不需要編譯XposedBridge.jar可以不指定
* version:Xposed版本,這個版本號將顯示在XposedInstaller上
* ApospDir下的數字:設置sdk版本對應的Android源碼
* [BusyBox]標簽:busybox,可以不指定
  • 配置完成后,就可以執行build.pl編譯了,以下有幾個例子:

./build.pl -a java

  • 編譯XposedBridge.jar,需要在build.conf里指定javadir

./build.pl -t arm64:23

  • 編譯生成供cpu架構為arm64,sdk為23平台使用的Xposed

  • 編譯完成后,將在Android源碼目錄/out/sdk23/arm生成可刷入手機的zip文件

配置 perl 環境

  • XposedTools 依賴於 perl,所以我們要跑起來就要有一個 perl 環境。首次運行 perl 需要安裝依賴 Config::IniFiles
    perl -MCPAN -e 'install Config::IniFiles'

  • 大概需要在安裝下面的兩個依賴(不同系統可能不同)
    perl -MCPAN -e 'install File::Tail'
    perl -MCPAN -e 'install File::ReadBackwards'

  • 如果還不成功,按照下面的方法安裝所需的模塊即可
    perl -MCPAN -e 'install [ModuleName]'

解決模塊安裝失敗的問題

  • 執行build.pl的時候提示找不到函數,比如提示找不到Config::IniFiles. 可以通過下面的方式來尋找並安裝依賴:
    • 執行apt-cache search Config::IniFiles尋找Config::IniFiles所依賴的庫文件
    • 執行sudo apt install libconfig-inifiles-perl安裝所依賴的庫
    libconfig-inifiles-perl - Read .ini-style configuration files
  • 使用aptitude工具下載依賴
    • sudo aptitude install Config::IniFiles
    • sudo aptitude install File::Tail
    • sudo aptitude install File::ReadBackwards

雖然可能會出現安裝失敗,但是會出現依賴提醒,按照提示安裝依賴即可

根據提示安裝依賴cpan -f Archive::Zip

Can't locate Archive/Zip.pm in @INC (you may need to install the Archive::Zip module) (@INC contains: /home/aosp/xposed/XposedTools /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at ./build.pl line 11.
BEGIN failed--compilation aborted at ./build.pl line 11.

root@a03e3a9cc004:/home/aosp/xposed/XposedTools# cpan -f Archive::Zip

常見問題

  • art更名替換導致如下錯誤,不可以在源碼根目錄下,需要移動到其他目錄,本例移動到上級目錄
	build/core/base_rules.mk:157: *** art_bak: MODULE.TARGET.FAKE.cpplint-art-phony already defined by art。 停止。

	   #### make failed to build some targets (6 seconds) ####

編譯XposedBridge問題

編譯android6.0源碼需要java1.7,而編譯xposedbridge需要java1.8,所以這里為了切換方便臨時指定java環境變量

misty@ubuntu:~/bin/xposed/XposedTools$ ./build.pl -a java 
Loading config file /home/misty/bin/xposed/XposedTools/build.conf...
Checking requirements...
Building the Java part...
Compiling...

FAILURE: Build failed with an exception.

  • Where:
    Build file '/home/misty/bin/xposed/XposedBridge/app/build.gradle' line: 3

  • What went wrong:
    A problem occurred evaluating project ':app'.

java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 0.682 secs

misty@ubuntu:~/bin/xposed/XposedTools$ vim /etc/profile
misty@ubuntu:~/bin/xposed/XposedTools$ export JAVA_HOME=/home/misty/MyFile/jdk1.8.0_211
misty@ubuntu:~/bin/xposed/XposedTools$ export PATH=$PATH:$JAVA_HOME/bin
misty@ubuntu:~/bin/xposed/XposedTools$ java -version

相關命令

getprop|grep arm 查看CPU相關的信息

小確幸

每一絲靈感都值得被記錄,每一筆記錄都是成長,每一點成長都值得歡呼

博主個人站: www.imisty.cn
CSDN博客: https://blog.csdn.net/lookinthefog
博客園 :https://imist.cnblogs.com/

希望能夠認識一些熱愛技術的小伙伴,歡迎友鏈接喲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM