转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120954983
本文出自【赵彦军的博客】

文章目录

  • Context Hook

Context Hook

Android 编程中,我们常常会和 Context打交道,而且 Context 遍布各个地方,就算使用 Jetpack Compose 也都离不开它。正因为 Context 被广泛的使用和传播,当我们面对一些特殊问题时,常常能够从 Context对象入手,去解决许多看似不能改变的代码问题。这常常就会用到 Context Hook 这种手法。

Context Hook 形式其实特别简单,就是使用 ContextWrapper 对原有的 Context 进行代理,从而实现 Context各个 get方法的拦截。广义的说,这其实更是一种手法或者思路,所以我们不该局限于Context 对象,只是 Context 常常成为我们的目标对象。

假设我们要拦截 Context 对象的 getString 方法,鱿鱼 getString方法在 Context中是final的,所以我们不能直接在 ContextWrapper 中覆写它,而是先去覆写 getResources , 然后返回一个 ResourcesWrapper 对象,这个 ResourcesWrapper的思想和 Context 是一模一样的,只是在 Android SDK 中并没有 ResourcesWrapper 这个类,不过在 AndroidX appcompat 库中倒是有一个, 懒得自己写的话就直接去吧 androidx.appcompat.widget.ResourcesWrapper 复制一份过来。

所以我们可以这么覆写 ContextgetResouces 方法。

class HookContext(context: Context) : ContextWrapper(context) {private var hookResources: HookResources? = nulloverride fun getResources(): Resources {val originalResources = super.getResources()if (hookResources == null) {hookResources = HookResources(originalResources)}return hookResources!!}
}

其实这么写是有问题的,我们为了避免在 getResources 中返回的创建 HookResources对象,于是将它缓存在 HookContext 内部中,但如果 Configuration 变了,比如屏幕发生旋转,那么我们缓存的 HookResources对象身上的 Configuration 并不会被自动更新,这将导致一些很难排查的问题,所以进一步的写法是:

class HookContext(context: Context) : ContextWrapper(context) {private var hookResources: HookResources? = nulloverride fun getResources(): Resources {val originalResources = super.getResources()if (hookResources == null) {hookResources = HookResources(originalResources)}val result = hookResources!!if (result.configuration != originalResources.configuration || result.displayMetrics != originalResources.displayMetrics) {result.updateConfiguration(originalResources.configuration,originalResources.displayMetrics)}return result}
}

HookResources

class HookResources(private val resources: Resources) :Resources(resources.assets, resources.displayMetrics, resources.configuration) {override fun getString(id: Int): String {if (id == 123) {return "哈哈哈,这是代理返回的"}return resources.getString(id)}
}

这样以后,我们对这个 HookContext对象调用 getString 时,传入123 参数,它将返回 哈哈哈,这是代理返回的 , 这就是 context.getString(123) 的返回结果。

细品一下,是不是有了更多的可能性,也可以用这中手法来拦截 ContextgetDrawable 方法。

自定义 view 使用 HookContext

class MyTextView(context: Context, attrs: AttributeSet?) :androidx.appcompat.widget.AppCompatTextView(HookContext(context), attrs) {init {//这里用 getContext 它是被 HookContext 包装过的 。//不能用 context ,它没有被包装text = getContext().getString(123)}
}

Android Context Hook相关推荐

  1. android socket_盘点Android常用Hook技术

    Android平台开发测试过程中,Hook技术是每个开发人员都常用的技术.可以用于绕过系统限制.修改别人发布的代码.动态化.调用隐藏API.插件化.组件化.自动化测试.沙箱等等. Hook如果要跨进程 ...

  2. Android Art Hook 技术方案

    Android Art Hook 技术方案 by 低端码农 at 2015.4.13 www.im-boy.net 0x1 开始 Anddroid上的ART从5.0之后变成默认的选择,可见ART的重要 ...

  3. Android Native Hook工具

    前言 在目前的安卓APP测试中对于Native Hook的需求越来越大,越来越多的APP开始逐渐使用NDK来开发核心或者敏感代码逻辑.个人认为原因如下: 安全的考虑.各大APP越来越注重安全性,NDK ...

  4. Android Context解析以及getContext()、getApplication()、getApplicationContext()和getBaseContext()区别

    文章目录 Context 介绍 Context数量 getContext().getApplication().getApplicationContext()和getBaseContext()区别 g ...

  5. Android安全 Hook技术,AndroidHook技术分析.pdf-北京理工大学信息系统及安全对抗实验中心.PDF...

    AndroidHook技术分析.pdf-北京理工大学信息系统及安全对抗实验中心.PDF The name of the DepartmentBeijing Forest Studio 北京理工大学信息 ...

  6. Android Context 到底是什么?

    什么是Android Context? 一个Context意味着一个场景,一个场景就是我们和软件进行交互的一个过程.比如和妹纸约会的月下小桥,比如当你使用微信的时候,场景包括聊天界面.通讯录.朋友圈, ...

  7. 如何写一个Android inline hook框架

    Android_Inline_Hook https://github.com/GToad/Android_Inline_Hook_ARM64 有32和64的实现,但是是分离的,要用的话还要自己把两份代 ...

  8. Android Context 是什么?

    [转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] PS:修该了一些有误区的地方. 引言 Context对于Android开发人员来说并不陌生 ...

  9. 装饰者模式及其在 Android Context 中的应用

    一.装饰者模式 1.1 定义 装饰者模式又名包装(Wrapper)模式.它可以在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展对象的功能.它是通过创建一个包装对象,也 ...

最新文章

  1. java 线程关闭小结(转)
  2. linux 类型排序,Linux命令之排序命令sort使用实例
  3. SAP HU 序列号里的Sales Order号码不一致导致PGI失败问题之对策
  4. 北风设计模式课程---里氏替换原则(Liskov Substitution Principle)
  5. python博客编程_python编程
  6. MongoDB,子查询
  7. 如何成为一名卓越的数据科学家-桃树七剑之二:数据准备
  8. java8配置环境变量_java8环境变量设置
  9. java中while的用法案例_Java While循环 do-while循环用法
  10. 多个txt文件合并成一个txt文件、多个csv文件合并成一个csv文件
  11. 加拿大教授 武 计算机,加拿大卡尔加里大学Yingxu Wang教授访问计算机学院
  12. OSError: [Errno 1] Operation not permitted: '/tmp/pip-g3bg0s-uninstall/System/Library/Frameworks/Pyt
  13. python图片转换成文字的手机软件_怎么把手机里的图片转换成WORD?迅捷文字识别帮你解决!...
  14. 程序人生 - 创可贴使用不当或致截肢
  15. 子矩阵的和(Python实现)
  16. oracle 查询字符代码dump,字符集问题(Linux、oracle、终端等,导入导出数据)
  17. cmd窗口最小化运行
  18. 导航电子地图数据存储标准NDS中文版和英文版
  19. java开发入门思维导图,java秒杀系统面试题
  20. 狄兰·托马斯诗合集▷Do not go gentle into that good night

热门文章

  1. python输出不重复的单词_python-如何在文本文件中创建所有单词的列表,但字母重复的单词除外...
  2. 那份让我想死的化工原理补考试卷
  3. 从简单的一元线性回归分析入门机器学习
  4. windows平台下TensorFlow的各种安装不成功
  5. 小程序实现图片的放大预览
  6. 任务型对话系统预训练最新研究进展
  7. 用于稠密检索的无监督领域适应方法—Generative Pseudo Labeling (GPL)
  8. ChineseGLUE(CLUE):针对中文自然语言理解任务的基准平台
  9. 6个月达不到25.6万年薪AI工程师,进不了大厂全额退款
  10. 报名 | AlphaGo Zero是如何实现无师自通的?