前言
分享一个没什么技术含量但是我觉得挺有意思的东西,很多第三方SDK初始化的时候都需要我们传入一个context进去,拿到context之后SDK就可以做很多事了,比如打开activity、弹窗、获取文件目录之类的。
这里我想简单的去处理下它们的使用权限,给它们传入一个被代理的context,让它们无法为所欲为。
代理Context
如果我们要去代理一个context,到底应该继承哪个类呢?下面找个张Context继承层次的图:
看下这个图我们就知道,应该去继承ContextWrapper,下面是我写到一个拦截的代理Context:
private const val SCHEME_ID = "com.bill99.gateway.inner.demo.PayDemoResultActivity"
private class ProxyContext(context: Context, val consumer: BiConsumer<String, String>? = null)
: ContextWrapper(context) {
override fun startActivity(intent: Intent?) {
intent?.let {
if (SCHEME_ID == intent.component?.className) {
val resultStatus = it.getStringExtra("resultStatus")
val resultMessage = it.getStringExtra("resultMessage")
consumer?.accept(resultStatus, resultMessage)
// 不给跳转
return
}
}
// SDK内调起支付宝还需要startActivity
super.startActivity(intent)
}
}
private interface BiConsumer<T1, T2> {
@Throws(Exception::class)
fun accept(t1: T1, t2: T2)
}
这是某支付SDK里面的,也算是个挺有名的公司了,但是它这startActivity去通知error,而不是通过callback去通知调用方,这操作我是觉得挺6的,这也是我要代理这个Context的原因吧。
再来看下代码,当你继承ContextWrapper的时候,只需要重写需要重写的方法就行,我这拦截了startActivity,让部分调用不生效,这样的操作当然可以适用其他方法。
使用也很简单,构造封装下就行了,下面是代码,当然可以在handler里面做更多的操作:
// 给SDK的context
ProxyContext(context, handler)
// 用来处理的handler
private val handler = object : BiConsumer<String, String> {
override fun accept(t1: String, t2: String) {
val result = JSONObject()
result.put("resultStatus", t1)
result.put("resultMessage", t2)
reference?.get()?.let {
ToastUtils.show(it, "$t2: $t1")
}
}
}
小结
通过代理给SDK的context来拦截一些操作,能够解决的事情可能不多,特别是对于安全整改来说,但不让SDK去启动页面,也不失为一种解决办法,比起ASM去改SDK的字节码简单多了。
Android 学习笔录
Android 性能优化篇:https://qr18.cn/FVlo89
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集:https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap