一、前言
在上篇帖子中咱们实现了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 = falseLOCAL_MODULE := XposedBridgeLOCAL_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.txtinclude $(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_art
和Xposed
源码,咱们这里是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::IniFilessudo 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.shlunch 19make 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/6471bab49cb1https://juejin.cn/post/6844903711714574344https://juejin.cn/post/6844903709730668551https://v2as.com/article/490aeab6-c2e2-4e28-a341-457ede3d7711https://www.hellojava.com/a/78058.htmlhttps://flysands.github.io/blog/2017-12-25-%E7%BC%96%E8%AF%91xposed%E6%BA%90%E7%A0%81.htmlhttps://mp.weixin.qq.com/s/c97zoTxRrEeYLvD8YwIUVQ
本文由平安后厨团队分享,转载请注明起源,违者必究!