UrlConnectionTransformer.kt 2.1 KB
Newer Older
J
jackjintai 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
package com.didichuxing.doraemonkit.plugin.transform

import com.didichuxing.doraemonkit.plugin.DoKitExtUtil
import com.didiglobal.booster.annotations.Priority
import com.didiglobal.booster.kotlinx.asIterable
import com.didiglobal.booster.transform.TransformContext
import com.didiglobal.booster.transform.asm.ClassTransformer
import com.didiglobal.booster.transform.asm.className
import com.google.auto.service.AutoService
import org.objectweb.asm.Opcodes.INVOKESTATIC
import org.objectweb.asm.Opcodes.INVOKEVIRTUAL
import org.objectweb.asm.tree.ClassNode
import org.objectweb.asm.tree.MethodInsnNode

/**
 * ================================================
 * 作    者:jint(金台)
 * 版    本:1.0
 * 创建日期:2020/5/14-18:07
 * 描    述:wiki:https://juejin.im/post/5e8d87c4f265da47ad218e6b
 * 修订历史:
 * ================================================
 */
@Priority(1)
@AutoService(ClassTransformer::class)
class UrlConnectionTransformer : ClassTransformer {
J
jackjintai 已提交
27 28
    private val SHADOW_URL = "com/didichuxing/doraemonkit/aop/urlconnection/HttpUrlConnectionProxyUtil"
    private val DESC = "(Ljava/net/URLConnection;)Ljava/net/URLConnection;"
J
jackjintai 已提交
29 30 31 32 33 34

    override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
        if (!DoKitExtUtil.dokitPluginSwitchOpen()) {
            return klass
        }

J
jackjintai 已提交
35
        if (!DoKitExtUtil.commExt.networkSwitch) {
J
jackjintai 已提交
36 37 38
            return klass
        }

J
jackjintai 已提交
39 40 41
        if (DoKitExtUtil.ignorePackageNames(klass.className)) {
            return klass
        }
J
jackjintai 已提交
42

J
jackjintai 已提交
43 44 45 46 47 48 49 50
        klass.methods.forEach { method ->
            method.instructions?.iterator()?.asIterable()?.filterIsInstance(MethodInsnNode::class.java)?.filter {
                it.opcode == INVOKEVIRTUAL &&
                        it.owner == "java/net/URL" &&
                        it.name == "openConnection" &&
                        it.desc == "()Ljava/net/URLConnection;"
            }?.forEach {
                method.instructions.insert(it, MethodInsnNode(INVOKESTATIC, SHADOW_URL, "proxy", DESC, false))
J
jackjintai 已提交
51 52
            }
        }
J
jackjintai 已提交
53

J
jackjintai 已提交
54 55 56
        return klass
    }

J
jackjintai 已提交
57 58

}
J
jackjintai 已提交
59