首页
社区
课程
招聘
[原创]Android6.0.1_r77集成SuperSU和Xposed
发表于: 2020-4-25 00:35 9963

[原创]Android6.0.1_r77集成SuperSU和Xposed

2020-4-25 00:35
9963

Android6.0.1_r77集成SuperSU和Xposed

写在前面

经历了两天的苦苦编译,终于我的Android 6.0.1_r77集成了我想要的Xposed环境,经此一役,又再次验证了那一句话,我果然是一个自带Bug的男人。

环境

  • Ubuntu 16.04
  • Nexus 5
  • Android6.0.1_r77

Android 6.0.1_r77源码编译

与我之前的这篇文章几乎一样,只是下载源码的版本不一样,具体不再赘述,多说一嘴,我选择lunch的是aosp_hammerhead-userdebug,这个很重要!

集成SuperSU

为了使得XposedInstaller安装上的时候,能够获取root权限,需要在环境中集成SuperSU

安装修改过的su

由于系统自带的su文件,存在着一系列限制,比如只能root用户或者shell执行,这部分其实可以改动源码实现去除,但在实际操作时,即使改了,我的Superuser.apk仍然不可以检测到root环境的存在,所以使用了SuperSU.zip中的su,而将原本的su屏蔽掉了,su的文件夹位置为system/extras/su,你可以选取删除su文件夹或者直接将这个文件夹下的Android.mk文件改名就行。我这里直接改了名字

 

 

然后拷贝出SuperSU.zip下的su,libsupol.so,supolicy(这里的文件必须选择对应设备版本的文件,我这里使用的是N5,所以选择的是armv7文件夹下的),到源码根目录下的packages文件夹下,创建了名为su的文件夹,同时将这三个文件paste进去,并将su可执行文件复制一份并重命名为daemonsu放到同一目录,
然后,在这个文件夹里面新建一个Android.mk,具体内容如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := su
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_UNSTRIPPED_PATH := $(LOCAL_MODULE_PATH)
include $(BUILD_PREBUILT)


include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := daemonsu
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_UNSTRIPPED_PATH := $(LOCAL_MODULE_PATH)
include $(BUILD_PREBUILT)


include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := supolicy
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_UNSTRIPPED_PATH := $(LOCAL_MODULE_PATH)
include $(BUILD_PREBUILT)


include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libsupol.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
LOCAL_SRC_FILES := $(LOCAL_MODULE)
OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
include $(BUILD_PREBUILT)

最终目录结构如下

 

 

之后,为了能够apk申请root权限时,能够弹框询问,将SuperSU.zip下的common/Superuser.apk拷贝,放到源码根目录下的packages/apps/SuperSU文件夹下,这里的SuperSU文件夹需要自己建立,在文件夹里新建一个Android.mk,具体内容如下

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := SuperSU

LOCAL_SRC_FILES := Superuser.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED

include $(BUILD_PREBUILT)

最终目录结构如下:

 

关闭SELinux

进入源码根目录下的/device/目录下,选择对应编译的设备版本,具体目录如下

 

 

可以看到支持很多设备,我之前说了,我编译的是N5的版本,所以选择lge/hammerhead,进入对应目录,修改BoardConfig.mk文件,在BOARD_KERNEL_CMDLINE :=下一行加上
BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive,具体如下

 

 

网上有博客说,也可以把permissive改为disabled,具体效果我没试。有兴趣可以试试。

“安装”su等文件

在与关闭SELinux操作的相同目录下,
打开device.mk,增加如下文本

# SuperSU
PRODUCT_PACKAGES += \
    su \
    daemonsu \
    supolicy \
    libsupol.so \
    SuperSU

使得在重新编译源码时,将这些文件"安装"到对应目录,比如su安装到/system/xbin/目录下等等。

更新su等文件权限

打开源码根目录下的system/core/libcutilsfs_config.c文件,增加相关文件权限

    { 04750, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },
    { 07777, AID_ROOT,      AID_ROOT,     0, "system/xbin/daemonsu" },
    { 06755, AID_ROOT,      AID_ROOT,     0, "system/xbin/supolicy" },

效果如下

 

配置SuperSUdeamon

打开system/core/rootdir/init.rc,增加以下代码

# SuperSU
service daemonsu /system/xbin/daemonsu --auto-daemon &
    class main
    oneshot

使得在系统启动时,劫持app_process,作为守护进程存在

 

至此,我们的SuperSU就集成完毕了。最终效果如下

 

集成Xposed

Xposed一共由3部分组成:Xposed Installer + Xposed native部分 + XposedBridge.jar.各自的作用不再赘述。下面开始设置编译

替换Xposed-art

首先,由于Android 6.0基于ARTXposed在实现ART模式下的hook时,修改了部分ART虚拟机代码,为此需要下载Xposed-art替换原本源码根目录下的art文件夹,并切换到6.0的分支,具体操作如下

rm -rf art
git clone https://github.com/rovo89/android_art.git art
cd art
git checkout xposed-marshmallow


下载"安装"Xposed-native部分

进入源码根目录下的frameworks/base/cmds文件夹,下载Xposed-native部分

cd frameworks/base/cmds
git clone https://github.com/rovo89/Xposed.git

编译安装XposedBridge.jar

这个部分的编译我是使用的IDEA去编译的。。。
具体过程不再赘述。最后实际上编译出一个apk,将这个文件改名为XposedBridge.jar并拷贝到源码根目录下的out/target/product/hammerhead/system/framework文件夹下

“安装”XposedInstaller

从网上下载XposedInstaller-3.15.apk放到源码根目录下的packages/apps/XposedInstaller文件夹下,这里的XposedInstaller文件夹同样需要自己建立,同样地,新建一个Android.mk,内容类似于SuperSU的。这里也贴出来吧

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := XposedInstaller
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

目录结构如下

 

 

同样地,为了使得编译源码时,XposedInstaller“安装”上,需要修改/device/lge/hammerhead文件夹下device.mk文件,在刚才增加的地方后面再加上XposedInstaller,当然这里也要对应自己的设备。

# XposedInstaller
PRODUCT_PACKAGES += \
    XposedInstaller

 

然后再次编译一下源码

编译Xposed相关

最后一步,但也是最重要的一步,下载XposedTools

cd ~
git clone https://github.com/rovo89/XposedTools.git
cd XposedTools

然后在XposedTools根目录下,参照已有的build.conf.example创建一个build.conf文件,我的文件内容如下

[General]
# 注释,可删除:指定,输出编译结果目录
outdir = /home/simp1er/XposedTools/out

[Build]
# 版本大于89就行
version = 99(custom build by author )
# 根据CPU情况设置线程
makeflags = -j6

[GPG]
sign = release
user = Simp1er

[AospDir]
# 23代表SDK版本,等于号后接的是Android源码根目录
23 = /home/simp1er/android-6.0.1_r77

然后新建out文件夹并进入out文件夹下新建java文件夹,将之前编译生成的XposedBridge.jar拷贝到这个目录下,最终XposedTools目录结构如下

 

 

然后,进入XposedTools根目录,开始编译!

./build.pl -t arm:23

这里的arm代表我的设备是arm架构的,23代表SDK版本。由于这个脚本是基于perl的,在执行过程中,可能会提示缺少一些依赖包,例如可能会缺少Config::IniFiles,使用apt-cache search Config::IniFiles搜索,然后sudo apt-get install安装缺少的包即可。我这边缺失的库以及解决的办法如下

 

 

然后重新编译

 

 

之后

cd out/sdk23/arm/files/system/bin
mv app_process32_xposed app_process32 #修改文件名
cd ../../ 
cp -r system ~/android-6.0.1_r77/out/target/product/hammerhead/ #将编译好的`Xposed`相关文件复制到对应文件夹

 

最后重新编译下系统源码

cd ~/android-6.0.1_r77
source build/envsetup.sh
lunch 19
make -j6 snod #只打包文件

 

然后fastboot重新刷所有img,注意第一次启动手机由于此时无XposedInstaller数据目录,所以是会报错XposedInstaller意外中止的。忽略不管,直接上最终效果

 

Xposed效果图

 

 

安装GravityBox,并测试更改状态栏效果,观察下图,可以明显地看到状态栏地WIFI信号变成了红色。

 

 

可见集成编译成功!

参考

深入理解 Android(三):Xposed 详解

 

Xposed 集成 Android 6.0.1环境中,总结

 

给 Android ROM(AOSP)集成 SuperSU 的方法

 

XPOSED魔改一:获取特征

写在最后

其实这个编译过程中还参考了很多其他博客,就不一一列举了,在此表示感谢,另外感谢@r0ysue师傅,感谢提示使用SuperSU帮助Xposed获取root.最后写的不好的地方敬请指摘.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (11)
雪    币: 27
活跃值: (836)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Xposed魔改了没有 楼主
2020-4-25 09:09
0
雪    币: 2153
活跃值: (5347)
能力值: ( LV8,RANK:146 )
在线值:
发帖
回帖
粉丝
3
amwpecel Xposed魔改了没有 楼主
并没有,下一步吧
2020-4-25 12:14
0
雪    币: 2484
活跃值: (3077)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
有没有整合Magisk?
2020-4-25 13:31
0
雪    币: 27
活跃值: (836)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
小白abc 并没有,下一步吧
期待
2020-4-25 13:58
0
雪    币: 2153
活跃值: (5347)
能力值: ( LV8,RANK:146 )
在线值:
发帖
回帖
粉丝
6
熊猫吃鱼 有没有整合Magisk?
Magisk和Xposed冲突 没弄
2020-4-26 15:15
0
雪    币: 2484
活跃值: (3077)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
小白abc Magisk和Xposed冲突 没弄
能请教一下怎么整合magisk么?
2020-4-26 21:27
0
雪    币: 2153
活跃值: (5347)
能力值: ( LV8,RANK:146 )
在线值:
发帖
回帖
粉丝
8
熊猫吃鱼 能请教一下怎么整合magisk么?
没做过 具体不清楚
2020-4-27 13:16
0
雪    币: 3542
活跃值: (239)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
优秀
2020-5-12 17:36
0
雪    币: 758
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
666
2020-5-13 17:21
0
雪    币: 91
活跃值: (1127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
还是关掉了selinux,不太完美
2020-5-13 21:47
0
雪    币: 2122
活跃值: (9998)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
宝藏啊
2022-11-25 15:08
0
游客
登录 | 注册 方可回帖
返回
//