d在网上,关于Xposed模块编写的博客文章可谓是一抓一大把。但由于时间的推移,很多工具和方法都发生了变化,也正因此,网上的文章往往有一些时限性,比如现如今 provide 这个关键字已经被舍弃了却仍有人在用,还有些说要把jar包放到lib文件夹而非libs文件夹。。。

我当前使用的AndroidStuido版本为

Magisk与EdXposed框架安装

由于现在Android新版本的普及,新上市的手机基本都是8.0以上了。所以以前的Xposed框架已经不适用。EdXposed团队成为了后续版本研发的继任者,从Xpsoed的wikipedia中可以查到交接历史:

2017年7月,abforce在GitHub上发布了支持Nougat的xposed,不过此发布需在编译ROM前集成在源码中而不是以前直接卡刷的形式。
2017年10月,Xposed框架开始支持。[3]
2019年1月,ElderDrivers完成了EdXposed的开发。EdXp是一个Magisk模块,依赖于riru框架,成功将Xposed移植到了Android Pie上,成为最接近原版Xposed的框架。
2019年9月,EdXposed正式支持Android Q。
2020年1月,EdXposed与Xposed原开发团队达成共识,成为Xposed停止更新后的官方接任者。

当然,android8.0之前的系统依然可以下载官方的资源来进行刷机:https://repo.xposed.info/module/de.robv.android.xposed.installer

TWRP Recovery、Magisk、EdXposed

由于我的测试机是Android 10,所以要刷EdXposed。大致思路很简单,也是最容易成功的步骤:先刷三方Rec(这里是TWRP),然后装Magisk,最后通过Magisk装EdXposed。

在开始介绍步骤之前,我想说其实 https://magisk.me/ 是有热门刷机机型ROOT教程的,比起那些乱七八糟的二手资料要好很多,不过里面博客中的各种下载链接都打不开,后来我找到了替代的网站 https://www.androidjungles.com/

下面开始:

1、这里默认电脑已经安装好 adbfastboot 命令工具。

2、各机型对应的Recovery很可能是不同的,先找自己设备对应的下载:https://twrp.me/Devices/ ,比如我这里的机型打开后是这样:

我们点Download Links中的链接,2选1即可,反正不管美洲还是欧洲速度都很慢。进去后选最新版本的img文件,再点进去进行下载。我这里最后下载下来是:twrp-3.3.0-0-beryllium.img ,下载完后我们把它重命名成 recovery.img ,后面有用。

3、下载 Disable-Force-Encryption-Treble.zip ,后面在Rec中要用到,不过这个和机型有关,部分机型可能不需要,具体可查看 https://magisk.me/ 中的教程。

4、到Magisk的官方下载页面下载最新的Zip和Apk:https://www.download-magisk.com ,最终资源文件其实都在Github仓库中。我这里对应要下载的就是:

https://github.com/topjohnwu/Magisk/releases  这里下载你想要下载的Magisk版本,点击对应版本下载即可

https://github.com/topjohnwu/Magisk/releases/download  下载最新的MagiskManager.apk

5、上面下载好的两个zip都拷贝到手机里,然后打开终端,开始搞事情:

# 手机电脑连起来,先重启手机进入fastboot模式,命令和手动均可

adb reboot bootloader

# 然后把刚才下载并重命名好的img刷入

fastboot flash recovery recovery.img

# 执行完此就会自动进入Recovery模式

fastboot boot recovery.img

6、(无需安装这个zip的机型可忽略这一步)进入Rec后,可能第一次会有提示,点选 Keep Read Only ,然后在主界面点 Install ,选择刚才下载的 DisableForceEncryption_Treble.zip ,右滑Swipe安装。安装完后别急着点Reboot System,为了方便,按返回键到主界面中点击 Reboot ,选 Recovery 重启后自动进入Rec模式。

7、再次进入Rec,还是点Install,然后选刚才下载的Magisk-xxx.zip,进行安装(操作图文可见官方:https://www.download-magisk.com)。完事直接点Reboot System重启进入系统即可。

8、不出意外,进入系统后,桌面上就会出现 Magisk Manager 的图标(这里图片中请忽略EdXposed,那是后续手动装的),说明安装成功(所以刚才下载的Apk并没有太大用哈哈,当然可以覆盖安装一下保证版本最新)。打开Manager应该可以看到两项都安装成功了。我这里使用的是21版本,因为最新版手机启动不了,经过多次试验,Magsik.zip  v21.0是可用的

 

9、后面就简单了,参考EdXposed官方文档(https://github.com/ElderDrivers/EdXposed)的Install步骤即可:

小米手机怎么Root

1、首先去官网登录小米账户,下载root工具https://www.miui.com/unlock/index.html

点击下载后,解压压缩包,点击unlock.exe,按照提示操作即可,具体步骤参考官方指导  https://www.xiaomi.cn/post/3892846

如果小米手机因为更新了magsik manage的某个版本变成砖头了,大概率是你的magisk版本导致的,这时候只需要执行如下命令就可以让你手机恢复正常开启,

# 手机电脑连起来,先重启手机进入fastboot模式,命令和手动均可

adb reboot bootloader

# 然后把刚才下载并重命名好的img刷入

fastboot flash recovery recovery.img

# 执行完此就会自动进入Recovery模式

fastboot boot recovery.img  

进入twrp界面后重新走上面6,7步骤,安装原来的magsk.zip版本就可以了,当然也可以直接线刷系统

魅族手机怎么root

打开魅族手机官网  https://www.flyme.com/firmware.html

选择你要root的机型,然后下载对应的刷机包

如果你的魅族手机变成砖头无法开机了,长按电源键和音量+,会进入这个界面,你选择USB传输文件,把上面官网下载的update.zip发送到手机,然后点击开始就可以重装系统了

待系统安装完毕就可以愉快root了

Xposed简介

Xposed 框架的原理就不多说了,它部署在ROOT后的安卓手机上,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。可以让我们在不修改APK源码的情况下,通过自己编写的模块来影响程序运行的框架服务,实现类似于自动抢红包、微信消息自动回复等功能。

其实,从本质上来讲,Xposed 模块也是一个 Android 程序。但与普通程序不同的是,想要让写出的Android程序成为一个Xposed 模块,要额外多完成以下四个硬性任务:

  1. 让手机上的xposed框架知道我们安装的这个程序是个xposed模块
  2. 模块里要包含有xposed的API的jar包,以实现下一步的hook操作。
  3. 这个模块里面要有对目标程序进行hook操作的方法。
  4. 要让手机上的xposed框架知道,我们编写的xposed模块中,哪一个方法是实现hook操作

这就引出我即将要介绍的四大件(与前四步一一对照):

  1. AndroidManifest.xml
  2. compileOnly 'de.robv.android.xposed:api:82'
    compileOnly 'de.robv.android.xposed:api:82:sources'
  3. 实现hook操作的具体代码
  4. assets下的xposed_Init文件

下面开始实操

新建Android项目就省了,新建项目后在AndroidManifest文件中添加如下配置

        <meta-data
            android:name="xposedmodule"
            android:value="true" />   告诉xposed这是基于他的一个模块
        <meta-data
            android:name="xposeddescription"
            android:value="ido" />    你对这个模块的描述
        <meta-data
            android:name="xposedminversion"
            android:value="82" />     xposed的最低版本要求

gradle中添加依赖

    compileOnly 'de.robv.android.xposed:api:82'
    compileOnly 'de.robv.android.xposed:api:82:sources'

编译通过后,在assets文件夹里面新建xposed_init文件,xposed框架会根据这个文件中的配置路径找到你hook操作的类

在MainActivity中调用


public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private TextView textView;
    private TextView textView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.info);
        textView2 = findViewById(R.id.info2);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, toastMessage(), Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        AppInfo.getInstance().ValidateEnvironment(this);

        boolean boolResult = AppInfo.getInstance().isXposedInstall();
        textView.setText(boolResult ? "V" + AppInfo.getInstance().getXposedVersionName() : "未安装");
        boolResult = AppInfo.getInstance().isXposedActive();
        textView2.setText(boolResult ? "已激活" : "未激活");
    }

    public String toastMessage() {
        return "我未被劫持";
    }

调用结果

判断xposed是否激活

public class AppUtils {
    public static final String PACKAGE_NAME_XPOSED = "de.robv.android.xposed.installer";
    public static String getAppVersionName(Context context, String packageName) {
        PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);
        for (PackageInfo packageInfo : packageInfos) {
            if (packageInfo.packageName.equals(packageName)) {
                return packageInfo.versionName;
            }
        }
        return "";
    }

    public static boolean isModuleActive() {
        return false;
    }
}

public class StringUtils {
    public static  boolean isEmpty(final CharSequence s) {
        return s == null || s.length() == 0;
    }
}
public class AppInfo {
    private boolean mIsXposedInstall;
    private String mXposedVersionName;

    private static volatile AppInfo mInstance = null;

    private AppInfo() {

    }

    public static AppInfo getInstance() {
        if (mInstance == null) {
            synchronized (AppInfo.class) {
                if (mInstance == null) {
                    mInstance = new AppInfo();
                }
            }
        }
        return mInstance;
    }

    public void ValidateEnvironment(Context context) {
        mXposedVersionName = AppUtils.getAppVersionName(context, AppUtils.PACKAGE_NAME_XPOSED);
        mIsXposedInstall = !StringUtils.isEmpty(getmXposedVersionName());
    }

    public boolean isXposedActive() {
        return AppUtils.isModuleActive();
    }

    public boolean ismIsXposedInstall() {
        return mIsXposedInstall;
    }

    public void setmIsXposedInstall(boolean xposedInstall) {
        mIsXposedInstall = xposedInstall;
    }

    public String getmXposedVersionName() {
        return mXposedVersionName;
    }

    public void setmXposedVersionName(String xposedVersionName) {
        mXposedVersionName = xposedVersionName;
    }
}

具体调用

    AppInfo.getInstance().ValidateEnvironment(this);

    AppInfo appInfo = AppInfo.getInstance();
    boolean isInstall = appInfo.ismIsXposedInstall();
    boolean isActive = appInfo.isXposedActive();
    String xposedVersionName = appInfo.getmXposedVersionName();

    String msg = (isInstall ? xposedVersionName : "未安装") + " " + (isActive ? "已激活" : "未激活");

    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();

 

注意某些细节

1、可能你做完上面所有操作后xposed框架还是没激活,有可能是没有启用xposed

打开Edxposed Manager-->模块  找到你自己写的应用,打开图示按钮

2、可能你下载Riru.core的时候会提示你版本不对什么的,你根据提示去GitHub下载对应的zip包保存到手机,然后通过本地安装进行安装即可

具体的下载路径,可以在app上面看到git地址

部分操作参考自:https://ysy950803.blog.csdn.net/article/details/107118656,感谢作者的分享

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐