• 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/

    希望能够认识一些热爱技术的小伙伴,欢迎友链接哟

  • 相关阅读:
    logback学习二
    logback学习
    弱类型、强类型、动态类型、静态类型语言的区别
    BlockingQueue
    ExecutorService
    Future学习
    SetTimeout()多次运行函数后越来越快的问题
    LISTAGG函数
    Oracle字段
    使用powerdesigner进行数据库设计
  • 原文地址:https://www.cnblogs.com/imist/p/11417360.html
Copyright © 2020-2023  润新知