给Android第三方SDK传入代理Context

给Android第三方SDK传入代理Context

前言

分享一个没什么技术含量但是我觉得挺有意思的东西,很多第三方SDK初始化的时候都需要我们传入一个context进去,拿到context之后SDK就可以做很多事了,比如打开activity、弹窗、获取文件目录之类的。

这里我想简单的去处理下它们的使用权限,给它们传入一个被代理的context,让它们无法为所欲为。

代理Context

如果我们要去代理一个context,到底应该继承哪个类呢?下面找个张Context继承层次的图:

看下这个图我们就知道,应该去继承ContextWrapper,下面是我写到一个拦截的代理Context:

kotlin 复制代码
    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里面做更多的操作:

kotlin 复制代码
    // 给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的字节码简单多了。

相关推荐
mmsx22 分钟前
osmdroid 自定义地图视图:继承 MapView 的正确姿势与生命周期管理
android·osmdroid
ii_best2 小时前
移动开发工具按键精灵安卓版 OcrEx 识别总是漏字错字?改这一个参数,精度直接翻倍
android·ai编程·按键精灵
chjif2 小时前
Android 设备管控开发实战:自定义 Launcher 如何只显示指定 App?
android·kotlin
Dovis(誓平步青云)3 小时前
模拟器横评:电脑上看小说、追短剧用什么模拟器?MuMu、雷电、腾讯手游助手实测
android·java·服务器·前端·javascript·电脑
非凡ghost3 小时前
用 Kotlin 和 Jetpack Compose 重写的安卓视频播放器,原生体验有多流畅?
android·java·kotlin·音视频·软件需求
峥嵘life3 小时前
Android16 系统 APEX 模块调试总结
android·大数据·开发语言
亘元有量-流量变现3 小时前
2026安卓ASO增量攻略:摆脱iOS思维依赖,吃透多商店自然免费流量
android·aso优化·亘元有量·方糖试玩
一航jason4 小时前
安卓车机端 AIOS 技术生态全景
android·人工智能·ai·ai编程·ai-native
深念Y4 小时前
ZTE B860AV1.1-T2 机顶盒改造记录:从 Android 到 Linux 服务器
android·linux·运维·服务器·boot·cma·机顶盒