热门标签 | 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;}
}

 


推荐阅读
  • 一、在androidStudio中实现tabs比较简单,新建项目就可以选择tabs模板进行创建,默认实现tabs功能:直接运行项目就可以看到效果:可以说非常简单,但是我们在实际开发 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 突然觉得服务器ssh密码登录总是浪费一定量的时间,就想试试用sshKey进行登录。生成服务器sshkey和本地sshkey$ssh-keygen在服务器上生成一个authorize ... [详细]
  • 问题说明最近看到Spring事务,在学习过程中遇到一个很苦恼问题搭建好Spring的启动环境后出现了一点小问题在启动时候却出现[java.lang.NullPointerExcep ... [详细]
  • IamusingmaterialDateTimepickerformyAndroidapp.ButIwanttocombinetheDateandTimepic ... [详细]
  • The“travellingsalesmanproblem”asksthefollowingquestion:“Givenalistofcitiesandthedistancesb ... [详细]
  • 一、概述ceph为k8s提供存储服务主要有两种方式,cephfs和cephrdb;cephfs方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ... [详细]
  • 本文整理了Java中javax.swing.Action.addPropertyChangeListener()方法的一些代码示例,展示了Action.ad ... [详细]
  • 序本文主要研究一下nacosServiceManager的removeInstanceServiceManagernacos-1.1.3namingsrcmainjavacomal ... [详细]
  • Maven 无法打包jar到 Tomcat
    今天新来的同事,让他调试短信验证的接口。跟我说添加的aliyun的短信验证服务无法在tomcat上运行。然后给我看了报错信息:java.lang.NoClassDefFoundEr ... [详细]
  • 祖先|目的地_logback架构
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了logback架构相关的知识,希望对你有一定的参考价值。logback的架构 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
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社区 版权所有