xposed模块入门开发

具体的配置环境和手机环境就不再赘述了。
电脑端:
Android studio
Android sdk
XposedBridgeApi jar包
手机端:
root
安装了xposed installer
已安装并激活xposed框架

创建Android工程

其实就是一路next,创建工程完成后等待gradle加载完毕。

xposed模块入门开发_第1张图片
xposed模块入门开发_第2张图片
xposed模块入门开发_第3张图片
xposed模块入门开发_第4张图片
xposed模块入门开发_第5张图片

导入XposedBridgeApi jar包

导入完成后,修改下app/build.gradle中的依赖声明。将XposedBridgeApi的依赖由implementation改成provided。改完后记得sync一下gradle。

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    provided files('lib/XposedBridgeApi-54.jar')
}

修改AndroidManifest



        
        
        

        
            
                

                
            
        

    

xposedmodule: 表示这是一个xposed模块
xposeddescription: 描述该模块的用途,可以引用string.xml中的字符串
xposedminversion:要求支持的Xposed Framework最低版本

模块实现

创建一个或者几个类,并实现IXposedHookLoadPackage,IXposedHookZygoteInit或者其他IXposedMod的子接口。

package de.robv.android.xposed.mods.tutorial;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
import android.util.Log;

public class TestDemo implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
        XposedBridge.log("Loaded app: " + lpparam.packageName);
        Log.d("YOUR_TAG", "Loaded app: " + lpparam.packageName )
    }
}

XposedBridge.log会将日志输出到logcat,并写入日志文件
也可以用 android.util.Log输出到logcat

开始hook

这里举个例子,实现一下xposed的模块自检,检查自己的模块是否启动。就是在程序启动时,判断模块是否激活了。如果激活了就弹个toast提示模块已开启,如果因为某种未知原因导致激活失败,那么久弹个toast提示模块未开启。

实现也很简单,就是在MainActivity实现一个boolean方法,然后用xposed hook自己。能hook成功,自然代表模块成功启动了,反之亦然。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (!isModuleActive()){
            Toast.makeText(this, "模块未启动", LENGTH_LONG).show();
        }
        else {
            Toast.makeText(this, "模块已启动", LENGTH_LONG).show();
        }
    }

    private boolean isModuleActive(){
        return false;
    }

hook isModuleActive函数

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        // Xposed模块自检测
        if (loadPackageParam.packageName.equals("com.johnhao.testdemo")){
            XposedHelpers.findAndHookMethod("com.johnhao.testdemo.MainActivity", loadPackageParam.classLoader, "isModuleActive", XC_MethodReplacement.returnConstant(true));
        }
    }

这样就ok了

声明xposed入口

我们需要新建一个assets文件夹,并创建文件xposed_init,在里面填上xposed模块的入口.
这里我们声明自己的类“com.johnhao.testdemo.TestDemo”

xposed模块入门开发_第6张图片
xposed模块入门开发_第7张图片

到这里,这个简单的模块就算开发完了。

模块安装

将这个工程,编译,打包,安装到已经支持Xposed的手机中。
需要注意的是,要关闭instant run功能!!!

xposed模块入门开发_第8张图片

下面看下实际效果(为什么gif不能自己动呢,还得点击图片查看):

勾选激活模块,重启设备

xposed模块入门开发_第9张图片

我们再来启动试试(gif怎么弄才能自动循环播放呢)

是不是ok了呢?
关于xposed简单的介绍就到这儿了

xposed模块入门开发_第10张图片
更多内容关注获取.jpg

你可能感兴趣的:(xposed模块入门开发)