zoukankan      html  css  js  c++  java
  • 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/

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

  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/imist/p/11417360.html
Copyright © 2011-2022 走看看