关于android:Android源码定制3Xposed源码编译详解

41次阅读

共计 7374 个字符,预计需要花费 19 分钟才能阅读完成。

一、前言

在上篇帖子中咱们实现了 Android 6.0 从源码下载到源码编译的全过程,具体能够参考源码编译(1)——Android6.0 源码编译详解,本文次要解说 Xposed 框架源码编译到源码定制的具体过程,试验环境次要是 Android 6.0,在此过程中踩过不少坑,遇到各种问题,好在前面都一一解决了,这个过程中尤其感激一些大佬的博客贴子,从中学习到了很多。本文将从基于咱们编译的 Android 6.0,从 Xposed 源码编译到 Xposed 源码定制,具体记录全过程。此试验分为两局部:本文 Xposed 源码编译和下文 Xposed 源码定制

致谢:

首先感激世界美景大佬的定制 Xposed 框架,从外面学习到对 Xposed 框架特色的批改,然而因为集体程度无限,大佬的贴子不够具体,不能残缺复现,通过搜寻发现肉丝大佬的基于此的两篇具体的贴子解说:来自高纬的反抗:魔改 XPOSED 过框架检测 (上) 和来自高纬的反抗:魔改 XPOSED 过框架检测(下),本文的 Xposed 定制具体参考了大佬的贴子,一些 bug 也是从中失去了解决,而 Xposed 编译则参考博客:xposed 源码编译与集成,对于 Xposed 装置以及问题解决则参考:学习篇 -xposed 框架及高版本代替计划

二、Xposed 源码编译

1. 试验筹备

Xposed 源码编译的过程中,咱们须要具体的理解 Xposed 中不同模块对应的版本以及适配的 Android 版本状况,这样可能帮忙咱们缩小谬误,本文试验的环境搭建为:

试验平台: Ubuntu 16.0.4 (运行内存 4GB+CPU 4+ 磁盘 300G)
Android 源码: android-6.0.1_r1
试验手机: Google nexus5
XposedBridge: XposedBridge-art
XposedInstaller: 3.1.5

2. 编译流程

咱们在学习 Xposed 的源码编译之前,咱们先理解 Xposed 个各个模块的含意,具体参考官网:Xposed 官网

各个模块的含意(这里参考上文肉丝大佬博客(1)):

XposedInstaller:下载安装 Xposed.zip 刷机包、下载安装和治理模块
XposedBridge:位于 Java 层的 API 提供者,模块调用性能时首先就是到这里,而后再“转发”到 Native 办法
Xposed:位于 Native 层的 Xposed 理论实现,实现办法替换的理论逻辑等性能,次要是在 app_process 上进行的二次开发
android_art:在原版 art 上进行的二次开发,目录及文件基本上与原版 art 雷同,稍加批改提供对 Xposed 的反对
XposedTools:XposedInstaller 下载的那个刷机 zip 包,就是用 XposedTools 编译打包进去的

咱们理解 Xposed 的各个模块的作用,接着理解一下 Xposed 框架初始化的工作原理:

Xposed 源码编译的流程能够参考下图:

3.XposedBridge

(1)源码下载

咱们从官网上下载 XposedBridge,这里咱们最终下载的是 Xposed_art

git clone https://github.com/rovo89/XposedBridge.git

(2)编译生成 XposedBridge.jar

咱们在生成 XposedBridge.jar 的过程中有两种形式:mmm 编译和 Android Studio 编译(这里优先举荐应用 AndroidStudio 编译)

<1>mmm 编译

首先咱们须要在 XposedBridge 工程中编写 Android.mk 文件

    Android.mk 是 Android 提供的一种 makefile 文件,用来指定诸如编译生成 so 库名、援用的头文件目录、须要编译的.c/.cpp 文件和.a 动态库文件等。编写 android.mk 文件,将编译须要的源代码,编译生成的后果模式等信息告知 ndk build 编译系统。Android.mk 文件内容如下所示。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_DEX_PREOPT = false
LOCAL_MODULE := XposedBridge

LOCAL_SRC_FILES := \
     $(call all-java-files-under, src) \
     $(call all-java-files-under, lib/apache-commons-lang/external) \
     $(call all-java-files-under, hiddenapistubs/src)

include $(BUILD_JAVA_LIBRARY)

$(LOCAL_INTERMEDIA_TARGETS): PRIVATE_EXTRA_JAR_ARGS := -C "$(LOCAL_PATH)" \
assets -C "#(LOCAL_PATH)" NOTICE.txt

include $(call all-makefiles-under, $(LOCAL_PATH))

这里咱们须要留神版本,针对不同版本的 XposedBridge,咱们须要批改 LOCAL_SRC_FILES 中的文件选项,对于 Android.mk 的文件介绍,大家能够参考官网地址:Android.mk

咱们将 XposedBridge 文件夹放在 Android 源码目录下

而后咱们应用 mmm 针对模块编译:

## 初始化环境
source build/envsetup.sh
## 抉择设施
lunch 19
## 编译
mmm /home/tom/SourceCode/android-6.0.1_r1/XposedBridge/ 

咱们就能够在 /out/target/product/hammerhead/system/framework/ 文件夹下看见生成的 XposedBridge 包

<2>android Studio 编译

咱们先从官网上下载源码,而后咱们间接用 Android Studio 关上

而后咱们期待编译器默认配置,此时如果你的编译器没有装置 sdk23,可能会报错

这里咱们进入 File→Settings→Android SDK→勾选 Android 6.0(Marshmallow)→Apply→OK,就会开始下载 Sources for Android 23

下载实现后,咱们只须要将编译器从新敞开,再次关上即可

其余的问题只须要依照编译器提醒的缺失文件,点击装置,静静期待配置就能够了,具体的谬误解决也能够参考肉丝的博客(一)

而后咱们点击 build 下 Make Project 或 Rebuild Project 就能够编译胜利了,生成门路build/outputs/apk/app-release-unsigned.apk

这里就编译生成不签名的 apk,而后咱们能够把 apk 重命名 XposedBridge.jar

编译模块开发 api.jar

如果咱们须要提供给 app 调用的 api,那么咱们能够须要执行 android studio 的 gradle project 的 other 中的 generateAPI 选项,会在目录 build/api 中生成 apk.jar

这里的 api-sources.jar 和 XposedBridge 中的就是一样的

咱们在这里就能够取得 XposedBridge.jar 和 api.jar

(3)门路寄存

咱们 android studio 产生的 XposedBridge.jar 就能够搁置在 /out/target/product/hammerhead/system/framework/ 文件夹下,而 mmm 编译的主动存防在该门路下,就不须要管

4.android_art 和 Xposed

(1)源码下载

咱们从 Xposed 官网下载 android_artXposed源码,咱们这里是 android6.0,因而下载 Xposed_sdk23,参考地址:Xposed 官网地址

xposed 文件夹包含 xposed 批改之后的 app_process 等应用程序和 libxposed_*.so 等库文件的源码;art 文件夹次要包含 xposed 批改之后的 art 虚拟机的文件。

(2)android_art

咱们将咱们下载的 android_art 文件夹重命名为 art 文件夹,而后替换 android 源码下的 art 文件夹,这就相当于替换了 android 零碎的虚拟机

(3)xposed

将下载的 xposed 文件夹挪动到 /SourceCode/Android-6.0.1_r1/frameworks/base/cmds/ 文件夹下

注:这里咱们留神下载的 Xposed 的首字母为大写,咱们须要改成 xposed,不然前面会报错,具体咱们在谬误专区中介绍

5.XposedTools

(1)源码下载

咱们从官网上下载 XposedTools,官网地址:XposedTools

(2)build.conf 文件配置

    build.conf 文件是一个配置文件,会被 build.pl 读取应用。build 文件中次要定义了编译 xposed 的后果的寄存门路,android 源码的门路,还有一些版本信息之类的值。将下载的 zip 包解压,在文件夹下创立 build.conf 文件
[General]
outdir = /home/tom/SourceCode/XposedBridge
[Build]
version = 65(custom build by author)
makeflags = -j4
[AospDir]
23 =/home/tom/SourceCode/android-6.0.1_r1
outdir 指向的门路是 xposed 编译之后生成的文件的寄存门路。version 的值和后边的参数是本人设置的。编译之后会写入到 xposed.prop 文件中,前面会显示在咱们的 XposedInstaller 中
makeflags 是设置在后边编译过程中应用的线程数。AospDir 指向的门路是 android 源码寄存的门路,前边的值是源码对应的 SDK 的版本号。这里我指向的是 android6.0.1 的源码,对应的 android sdk 的版本是 23。

咱们还须要在 outdir 目录下创立一个 java 文件夹,而后将下面生成的 XposedBridge.jar 放到 java 文件夹下

(3)build.pl 编译 Xposed 源码

build.pl 文件在 xposed tools 文件夹下,在文件中有对 build.pl 文件的参数的设置规定等信息

    从上图能够看到 build.pl 次要能够实现的工作有四个,别离是编译生成 xposed 的可执行程序和库文件,将编译之后的文件拷贝到配置文件指定的输入门路下,创立 xposed.prop 文件,创立 flashable ZIP 文件。在参数中能够应用 -t 针对指定的指标进行创立, 在 xposed tools 目录下运行
./build.pl -t arm:23

而后报错,这个是咱们缺失依赖包

build arm files for SDK23(对应的是 Android6.0 零碎) 在执行过程中,可能会提醒短少一些依赖包,例如可能会短少 Config::IniFiles,应用 apt-cache search Config::IniFiles 搜寻,装置短少的包即可

装置 Config::IniFiles

先装置 perl 环境

apt-cache search Config::IniFiles
sudo apt install libconfig-inifiles-perl

而后咱们再装置 Config::IniFiles

sudo perl -MCPAN -e 'install Config::IniFiles'
sudo perl -MCPAN -e 'install File::Tail'
sudo perl -MCPAN -e 'install File::ReadBackwards'

这里咱们就装置了缺失的环境,而后咱们再次编译

(4)生成编译后果

build.pl - t 运行完结之后,会将生成的 xposed 的可执行程序和 so 库等文件放入到 build.conf 配置文件中指定的输入目录下。包含 lib 文件夹下的五个 so 库和 bin 文件加下的四个可执行程序以及一个配置文件。

咱们还能够发现 sdk23 下生成 xposed-v65-sdk23-arm-custom-build-by-author.zip,这就是咱们下载的 xposed 压缩文件

咱们能够看一下 Xposed 框架压缩文件与 SDK 的匹配关系,下载的参考网址:Xposedsdk(图片起源:学习篇 -xposed 框架及高版本代替计划)

6.XposedInstaller

(1)源码下载

咱们从官网上下载 XposedInstaller,官网地址:XposedInstaller

(2)源码编译

咱们间接通过 Android Studio 关上源码,进行环境配置,而后开始编译,生成 XposedInstaller.apk 即可

7. 源码编译

(1)替换

用编译生成的 bin 文件夹中文件替换 /out/target/product/hammerhead/system/ 文件夹下的 bin 文件夹中文件,进入 bin 文件夹下

cp /home/tom/SourceCode/XposedBridge/sdk23/arm/files/system/bin/* .

留神的是用 xposed 编译生成的 app_process32_xposed 替换 system/bin 文件夹下的 app_process32

用编译生成的 lib 文件夹中文件替换 /out/target/product/hammerhead/system/ 文件夹下的 lib 文件夹中文件,咱们进入 lib 文件夹下

cp /home/tom/SourceCode/XposedBridge/sdk23/arm/files/system/lib/* .

在 /out/target/product/hammerhead/system/ 文件夹下退出编译生成的 xposed.prop,咱们进入 system 文件夹下

 cp /home/tom/SourceCode/XposedBridge/sdk23/arm/files/system/xppsed.prop  .

(2)从新生成镜像文件

咱们进入 android 源码的根目录下:

source build/envsetup.sh
lunch 19
make snod  //make snod 命令的作用是从新生成镜像文件 system.img

(3)刷机

而后咱们只须要将 system.img 镜像刷入即可

fastboot flash system system.img

而后咱们须要获取 root 权限

咱们先刷入 twrp:

fastboot flash recovery twrp-2.8.7.1-hammerhead.img 

而后咱们将 SuperSU 推送到手机中

adb push SR5-SuperSU-v2.82-SR5-20171001224502.zip /sdcard

而后咱们进入 recovery 模式:

将 SuperSU 刷入,间接通过进行刷入即可,这样手机就取得 root 权限了,而后重启手机

8. 后果与测试

(1)后果

咱们关上手机,并输出命令抓取日志:

adb logcat | grep -i xposed

这是咱们还没有装置 XposedInstall.apk,而后咱们装置上 XposedInstaller.apk,而后重启

咱们就能够发现 Xposed 框架胜利激活

(2)测试

咱们导入模块来测试咱们的 Xposed 框架是否能应用

通过测试咱们编译的 Xposed 框架是能够失常应用的

9. 谬误解决

(1)谬误 1

问题剖析:

这是在应用 mmm 间接编译模块时,Android.mk 文件编写谬误,导致没有打包 de.robv.android.xposed.XposedBridge 该类

问题解决:

这里咱们应该在 Android.mk 中留神编写导入文件,更加举荐应用 AndroidStudio 间接编译,这样出错概率较少

(2)谬误 2

问题剖析:

这里是因为咱们下载的 Xposed 首字母大写

问题解决:

咱们须要留神大小写问题

(3)谬误 3

问题剖析:

这是因为 XposedBridge 版本和 XposedInstaller 版本不统一导致的,咱们进入源码发现该 XposedBridge 中函数并不蕴含此类,咱们须要抉择更高版本的源码

问题解决:

此类问题留神 XposedBridge 和 XposedInstaller 版本不统一的问题,须要采纳适合的 Xposed 版本源码

三、试验总结

在 Xposed 源码编译过程中,呈现了很多的问题,然而大部分问题通过查找对应的谬误,剖析源码根本都能够解决,其中很多问题大部分是因为你下载的 XposedBridge 源码和 XposedInstaller 源码不匹配引起的,而还有一部分起因是因为你生的 XposedBridge.jar 谬误引起的,在咱们激活 Xposed 框架时,咱们最好应用 adb logcat | grep "xposed" 来察看运行的状况,很多谬误的操作可能导致 Xposed 框架不能失常的激活,从而导致手机死机,启动不了,这个时候咱们能够进入 recovery 模式,wipe 革除数据,这里实际上是革除 XposedInstaller.apk,使得 xposed 不会被激活,手机就能够失常的进入,然而咱们还是要通过日志信息剖析起因,只有找到问题,从新编译源码,咱们就能够失常启动了

试验所用的文件材料,后续都会上传到 github 上:github 地址

四、参考文献

https://www.jianshu.com/p/6471bab49cb1
https://juejin.cn/post/6844903711714574344
https://juejin.cn/post/6844903709730668551
https://v2as.com/article/490aeab6-c2e2-4e28-a341-457ede3d7711
https://www.hellojava.com/a/78058.html
https://flysands.github.io/blog/2017-12-25-%E7%BC%96%E8%AF%91xposed%E6%BA%90%E7%A0%81.html
https://mp.weixin.qq.com/s/c97zoTxRrEeYLvD8YwIUVQ

本文由平安后厨团队分享,转载请注明起源,违者必究!

正文完
 0