无法使用 ByteBuddy android 找到 okhttp3.OkHttpClient 的类文件

问题描述 投票:0回答:1

之前我在这里问过这个问题,从@Rafael Winterhalter那里得到了一些建议。我应用了这些更改,但遇到了新错误。

此代码正在与子类一起使用,但我想用 bytebuddy 自动替换所有 OkHttpClient。

我应该如何处理这个问题?

这是我的代码

    fun setupOkHttpBuilderByteBuddy(context: Context) {
    val strategy = AndroidClassLoadingStrategy.Wrapping(
        context.getDir("generated", Context.MODE_PRIVATE)
    )


    try {


        val classLoader = context.classLoader ?: OkHttpClient::class.java.classLoader

        val dynamicType = ByteBuddy().with(TypeValidation.DISABLED)
            .redefine(OkHttpClient::class.java)
            .method(ElementMatchers.named("newCall"))
            .intercept(MethodDelegation.to(OkHttpInterceptor::class.java))
            .make()
            .load(classLoader, strategy)
            .loaded


        Log.d("OkHttpInterceptor", "ByteBuddy modification completed")


        val instance = dynamicType.getDeclaredConstructor().newInstance()
// Log the class name to verify if it’s from the dynamically generated class
        Log.d("OkHttpInterceptor", "Class name of instance: ${instance::class.java.name}")

// Check if the instance is an instance of OkHttpClient and the modified class
        val isSubclass = OkHttpClient::class.java.isAssignableFrom(instance::class.java)
        Log.d("OkHttpInterceptor", "Is instance a subclass of OkHttpClient? $isSubclass")


    } catch (e: Exception) {
        e.printStackTrace()
    }


}

这里是OkHttpInterceptor

    class OkHttpInterceptor {

    companion object {
        @JvmStatic
        fun intercept(
            @SuperCall originalCall: Callable<Call>,
            @Argument(0) request: Request
        ): Call {
            // Log or modify the request here
            Log.d("OkHttpInterceptor", "Intercept method request: $request")

            val client = OkHttpClient.Builder()
                .addInterceptor(NetworkInterceptor())
                .build()

            // Call the original method with the modified request
//            return originalCall.call()
            return client.newCall(request)
        }
    }
}

这是错误

java.lang.IllegalStateException: Could not locate class file for okhttp3.OkHttpClient
at net.bytebuddy.dynamic.ClassFileLocator$Resolution$Illegal.resolve(ClassFileLocator.java:130)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining.create(TypeWriter.java:4034)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:2246)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$UsingTypeWriter.make(DynamicType.java:4057)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:3741)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:3993)
at com.rnadigital.monita_android.MyApplicationKt.setupOkHttpBuilderByteBuddy(MyApplication.kt:90)
at com.rnadigital.monita_android.MyApplication.onCreate(MyApplication.kt:33)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1316)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6998)
at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2236)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8177)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)

已加载/vendor/lib64/egl/libEGL_emulation.so

android kotlin okhttp byte-buddy
1个回答
0
投票

Android 不支持运行时重定义。下一个最好的事情是在构建期间检测您的代码。在这里,您需要使用 Byte Buddy 的 Android Gradle 插件来检测代码。

© www.soinside.com 2019 - 2024. All rights reserved.