热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Xposed免重启调试

如何配置AndroidStudio项目为Xposed插件?1、配置项目Gradle的依赖compileOnlyde.robv.android.xposed:api:

如何配置 Android Studio 项目为 Xposed 插件?

1、配置项目 Gradle 的依赖

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

注:需要 compileOnly 来依赖,如果不想通过 Gradle 配置,也可以下载 XposedBridgeApi.jar ,放到项目 libs 目录。

2、配置 AndroidManifest.xml




  • xposedmodule:是否配置为 Xposed 插件,设置为 true
  • xposeddescription:模块名称
  • xposedminversion:最低版本号

3、新建 Hook 入口类

该类需要实现接口 IXposedHookLoadPackage,并实现里面关键方法handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam),该方法会在每个软件被启动的时候回调,所以一般需要通过目标包名过滤。

/*** @author zhicheng.chen*/
public class TargetHook implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {//通过目标包名过滤if (lpparam.packageName.equals("com.xxx.xxx")) {XposedBridge.log("启动了xxx软件");}}
}

4、Xposed 免重启调试

Xposed插件每次代码改动,都需要重启手机才能生效,有时候重启一次还不生效(我的手机有一次重启 3 次,才看到生效,还好是公司测试机,不心疼),所以代码最好写上相关 Log 信息,来看代码生效没。

XposedBridge.log("启动了xxx软件");

不过这里分享一个免重启调试的方法,方法来自网上,感谢 DX :

/*** &#64;author DX*         这种方案建议只在开发调试的时候使用&#xff0c;因为这将损耗一些性能(需要额外加载apk文件)&#xff0c;调试没问题后&#xff0c;直接修改xposed_init文件为正确的类即可*         可以实现免重启&#xff0c;由于存在缓存&#xff0c;需要杀死宿主程序以后才能生效*         这种免重启的方式针对某些特殊情况的hook无效*         例如我们需要implements IXposedHookZygoteInit,并将自己的一个服务注册为系统服务&#xff0c;这种就必须重启了*         Created by DX on 2017/10/4.*/public class HookLoader2 implements IXposedHookLoadPackage {//按照实际使用情况修改下面几项的值/*** 当前Xposed模块的包名,方便寻找apk文件*/private final String modulePackage &#61; "com.xxx.plugin";/*** 宿主程序的包名(允许多个),过滤无意义的包名,防止无意义的apk文件加载*/private static List hostAppPackages &#61; new ArrayList<>();static {// TODO: Add the package name of application your want to hook!hostAppPackages.add("com.eg.android.AlipayGphone");hostAppPackages.add("com.xxx.plugin");}/*** 实际hook逻辑处理类*/private final String handleHookClass &#61; TargetHook.class.getName();/*** 实际hook逻辑处理类的入口方法*/private final String handleHookMethod &#61; "handleLoadPackage";&#64;Overridepublic void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {if (hostAppPackages.contains(loadPackageParam.packageName)) {//将loadPackageParam的classloader替换为宿主程序Application的classloader,解决宿主程序存在多个.dex文件时,有时候ClassNotFound的问题XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {&#64;Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {Context context&#61;(Context) param.args[0];loadPackageParam.classLoader &#61; context.getClassLoader();invokeHandleHookMethod(context,modulePackage, handleHookClass, handleHookMethod, loadPackageParam);}});}}/*** 安装app以后&#xff0c;系统会在/data/app/下备份了一份.apk文件&#xff0c;通过动态加载这个apk文件&#xff0c;调用相应的方法* 这样就可以实现&#xff0c;只需要第一次重启&#xff0c;以后修改hook代码就不用重启了* &#64;param context context参数* &#64;param modulePackageName 当前模块的packageName* &#64;param handleHookClass   指定由哪一个类处理相关的hook逻辑* &#64;param loadPackageParam  传入XC_LoadPackage.LoadPackageParam参数* &#64;throws Throwable 抛出各种异常,包括具体hook逻辑的异常,寻找apk文件异常,反射加载Class异常等*/private void invokeHandleHookMethod(Context context, String modulePackageName, String handleHookClass, String handleHookMethod, XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {File apkFile&#61;findApkFile(context,modulePackageName);if (apkFile&#61;&#61;null){throw new RuntimeException("寻找模块apk失败");}//加载指定的hook逻辑处理类&#xff0c;并调用它的handleHook方法PathClassLoader pathClassLoader &#61; new PathClassLoader(apkFile.getAbsolutePath(), ClassLoader.getSystemClassLoader());Class cls &#61; Class.forName(handleHookClass, true, pathClassLoader);Object instance &#61; cls.newInstance();Method method &#61; cls.getDeclaredMethod(handleHookMethod, XC_LoadPackage.LoadPackageParam.class);method.invoke(instance, loadPackageParam);}/*** 根据包名构建目标Context,并调用getPackageCodePath()来定位apk* &#64;param context context参数* &#64;param modulePackageName 当前模块包名* &#64;return return apk file*/private File findApkFile(Context context, String modulePackageName){if (context&#61;&#61;null){return null;}try {Context moudleContext &#61; context.createPackageContext(modulePackageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);String apkPath&#61;moudleContext.getPackageCodePath();return new File(apkPath);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}return null;}
}

 


推荐阅读
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • Deepin 20 系统源更换指南及基础设置教程
    配置目标:创建一个适合基本娱乐、办公和直播的环境。安装方法:手动分区。系统要求:EFI分区需大于500MB,根分区建议至少20GB,以确保系统稳定运行和足够的存储空间。此外,建议分配适量的交换分区,以提升系统性能和响应速度。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
author-avatar
mobiledu2502876347
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有