Tencent / Shadow

零反射全动态Android插件框架
BSD 3-Clause "New" or "Revised" License
7.46k stars 1.3k forks source link

NEW followed by no DUP was found #1155

Closed malinkang closed 1 year ago

malinkang commented 1 year ago

集成Admob sdk报错 image

shifujun commented 1 year ago

插件添加implementation 'com.google.android.gms:play-services-ads:22.0.0'可以复现问题。

com.google.android.gms.internal.ads.zzceh反编译片段:

public final boolean onCreateWindow(android.webkit.WebView, boolean, boolean, android.os.Message);
    descriptor: (Landroid/webkit/WebView;ZZLandroid/os/Message;)Z
    flags: (0x0011) ACC_PUBLIC, ACC_FINAL
    Code:
      stack=2, locals=5, args_size=5
         0: aload         4
         2: getfield      #236                // Field android/os/Message.obj:Ljava/lang/Object;
         5: checkcast     #30                 // class android/webkit/WebView$WebViewTransport
         8: astore_2
         9: new           #32                 // class android/webkit/WebView
        12: astore_3
        13: aload_3
        14: aload_1
        15: invokevirtual #237                // Method android/webkit/WebView.getContext:()Landroid/content/Context;
        18: invokespecial #240                // Method android/webkit/WebView."<init>":(Landroid/content/Context;)V
        21: aload_0

其中9: new下一行不是dup,不符合 https://github.com/jboss-javassist/javassist/blob/700be6f6f9546e8af049b1a763ce27f1fde5955d/src/main/javassist/convert/TransformNewClass.java#L59 的预期。

错误在哪边还不确定。

shifujun commented 1 year ago

根据:https://stackoverflow.com/a/8594701/11616914

可知dup是为了接下来调用init方法和areturn时返回值。

但我们这里遇到的代码并不需要把webview返回。通过测试发现,我们的javac确实会不管后面用不用这个new出来的对象,都跟上一个dup指令。但看起来理论上来说确实不是必要的。

也许这个有问题的类就是proguard等工具把这个无用的dup给优化掉了。那么问题就是javassist实现错误了。