替换Boolean, Color, Integer, int[], String and String[]类型的简单资源
1.替换系统框架(Android Framwork)资源
替换系统框架资源(对所有app 起作用)需要实现 IXposedHookZygoteInit
接口的 initZygote
方法,并在该方法中调用Resources.setSystemWideReplacement(...)
方法替换资源
1 | package de.robv.android.xposed.mods.tutorial; |
2.替换app应用资源
替换app应用资源需要实现 IXposedHookInitPackageResources
类的andleInitPackageResources
方法,并在该方法中调用res.setReplacement(...)
方法替换资源,注意在该方法中不要使用XResources.setSystemWideReplacement
方法
1 | package de.robv.android.xposed.mods.tutorial; |
替换复杂的资源
对于复制的资源,如动画资源 ,我们也能够替换,下面我们来替换battery icon
动画资源布局
1 |
|
代码:
1 | package de.robv.android.xposed.mods.tutorial; |
Xposed框架会将模块请求资源的请求指向你模块中的资源
替换布局
你可以用替换资源的方法来替换布局文件,但这样你不得不将目标apk中的整个layout文件复制出来进行修改,这样会使模块的Rom兼容性降低。并且如果两个以上的模块修改布局后,最后修改布局的模块会起作用。更重要的是,布局中指向其它资源的ID很难确定下来。推荐使用下面的方法修改布局:
1 | package de.robv.android.xposed.mods.tutorial; |
回调方法handleLayoutInflated
会在layout文件被填充后回调,在方法的 LayoutInflatedParam 对象 参数中,你可以找到你想修改的View组件。你也可以通过调用resNames
来确定加载的那一个布局文件。用 variant
来确定加载的布局的目录’layout-land‘。res
同时也会帮你获取资源的ID和其它的资源。
五、用反射来hook方法
每当应用加载的时候,IXposedHookLoadPackPage接口的handLoadPackage方法就会被调用执行,为了让我们在正确的进程中执行,需要先判断被加载的包是不是正确的包
1 | package de.robv.android.xposed.mods.tutorial; |
一旦我们进入到正确的进程进后,我们就能用param变中的ClassLoad来访问该进程中加载的类
1 | package de.robv.android.xposed.mods.tutorial; |
XposedHelpers是一个重要的工具类,推荐用Eclipse的同学静态导入该类中的方法 import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
。该类能够通过反射机制来访问方法、构造器、域。findAndHookMehthod(String packageName,Class clazz, String methodName, Object... args))
方法来对函数进行Hook。如果在方法前和方法后Hook,该方法最后一个参数需要实现XC_MethodHook
类的beforeHookedMethod
和afterHookedMethod
方法,如果想要替换整个方法,则需要实现XC_MethodReplacement
类的replaceHookedMethod
方法
XposedBridge保存了每个Hook方法的回调方法。优先级高的回调方法被优先调用A.before -> B.before -> original method -> B.after -> A.after
1 | package de.robv.android.xposed.mods.tutorial; |
搭建本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站