Tencent / Shadow

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

sample-host release模式多项测试失败 #1286

Closed tkkcc closed 2 months ago

tkkcc commented 4 months ago

sample-host release模式在 android13虚拟机(genymotion)以及android14真机(一加coloros14)上均有多项测试失败。

如横竖屏切换、动态广播,点击“启动”后闪退到“启动插件”界面。

复现过程

在master上,执行./gradlew :sample-host:installRelease

报错日志

横竖屏切换报错 ```txt 00:14:13.772 V changing layerType. hardware? false 00:14:14.422 D Shutting down VM 00:14:14.423 E FATAL EXCEPTION: main Process: com.tencent.shadow.sample.host:plugin, PID: 6927 java.lang.VerifyError: Verifier rejected class com.tencent.shadow.sample.plugin.app.lib.usecases.activity.TestActivityOrientation: void com.tencent.shadow.sample.plugin.app.lib.usecases.activity.TestActivityOrientation.onCreate(android.os.Bundle) failed to verify: void com.tencent.shadow.sample.plugin.app.lib.usecases.activity.TestActivityOrientation.onCreate(android.os.Bundle): [0x6] 'this' argument 'Reference: com.tencent.shadow.sample.plugin.app.lib.usecases.activity.TestActivityOrientation' not instance of 'Reference: android.app.Activity' void com.tencent.shadow.sample.plugin.app.lib.usecases.activity.TestActivityOrientation.setOrientation(android.view.View) failed to verify: void com.tencent.shadow.sample.plugin.app.lib.usecases.activity.TestActivityOrientation.setOrientation(android.view.View): [0x0] 'this' argument 'Reference: com.tencent.shadow.sample.plugin.app.lib.usecases.activity.TestActivityOrientation' not instance of 'Reference: android.app.Activity' (declaration of 'com.tencent.shadow.sample.plugin.app.lib.usecases.activity.TestActivityOrientation' appears in /data/user/0/com.tencent.shadow.sample.host/files/ShadowPluginManager/UnpackedPlugin/test-dynamic-manager/1f7fa3c72fb15e4ed1134130a1b3b0db/plugin-release.zip/sample-app-plugin-release.apk) at java.lang.Class.newInstance(Native Method) at com.tencent.shadow.core.runtime.ShadowAppComponentFactory.instantiateActivity(Unknown Source:4) at com.tencent.shadow.core.loader.delegates.ShadowActivityDelegate.onCreate(Unknown Source:213) at com.tencent.shadow.core.runtime.container.PluginContainerActivity.onCreate(Unknown Source:58) at android.app.Activity.performCreate(Activity.java:8341) at android.app.Activity.performCreate(Activity.java:8320) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3622) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3778) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:138) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2303) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7884) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 00:14:14.455 I Sending signal. PID: 6927 SIG: 9 ```
动态广播报错 ```txt 00:05:09.626 E FATAL EXCEPTION: main Process: com.tencent.shadow.sample.host:plugin, PID: 6820 java.lang.VerifyError: Verifier rejected class com.tencent.shadow.sample.plugin.app.lib.usecases.receiver.TestDynamicReceiverActivity: void com.tencent.shadow.sample.plugin.app.lib.usecases.receiver.TestDynamicReceiverActivity.onCreate(android.os.Bundle) failed to verify: void com.tencent.shadow.sample.plugin.app.lib.usecases.receiver.TestDynamicReceiverActivity.onCreate(android.os.Bundle): [0x6] 'this' argument 'Reference: com.tencent.shadow.sample.plugin.app.lib.usecases.receiver.TestDynamicReceiverActivity' not instance of 'Reference: android.app.Activity' (declaration of 'com.tencent.shadow.sample.plugin.app.lib.usecases.receiver.TestDynamicReceiverActivity' appears in /data/user/0/com.tencent.shadow.sample.host/files/ShadowPluginManager/UnpackedPlugin/test-dynamic-manager/1f7fa3c72fb15e4ed1134130a1b3b0db/plugin-release.zip/sample-app-plugin-release.apk) at java.lang.Class.newInstance(Native Method) at com.tencent.shadow.core.runtime.ShadowAppComponentFactory.instantiateActivity(Unknown Source:4) at com.tencent.shadow.core.loader.delegates.ShadowActivityDelegate.onCreate(Unknown Source:213) at com.tencent.shadow.core.runtime.container.PluginContainerActivity.onCreate(Unknown Source:58) at android.app.Activity.performCreate(Activity.java:8341) at android.app.Activity.performCreate(Activity.java:8320) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3622) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3778) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:138) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2303) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7884) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 00:05:09.658 I Sending signal. PID: 6820 SIG: 9 00:05:09.666 W Cleared Reference was only reachable from finalizer (onl ```

而使用./gradlew :sample-host:installDebug则无问题,可能与r8或者versions.properties中的版本过低有关?

shifujun commented 4 months ago

像这样的问题,对于shadow来说首先要在AOSP的系统上测试复现。因为shadow主要是立足于公开api实现的。确实有原版系统上没问题,但是到了一些oem系统上不兼容的情况。

我最近手边没有电脑适合测试这个问题。

注意到not instance of 'Reference: android.app.Activity'这样的报错。因为shadow处理的插件中是不会有android.app.Activity这个类型出现的。所有它出现就说明这里发生了超出Java范畴的问题。一般就是AOT相关实现造成的了。我的猜测是系统有私有的逻辑,认为我们的插件activity不可能不是android.app.Activity,所有直接把它作为android.app.Activity处理了。但我还猜不出来系统是根据什么推测的。如果只有某几个用例会复现问题,那可能是一些系统API造成的。可能是某个API我们是在Context类型上调用的,但你测试的系统上是在Activity类型上实现的,并且还是AOT实现的,所以它认为传来的this应该是个android.app.Activity。如果是这种情况,又非要兼容的话,我们就得看看改为在宿主container activity上调用可否满足需求了。

这种AOT实现的行为在debug版APP上不生效是我可以确定的,有经验的场景。应该和R8之类的没有关系。

tkkcc commented 4 months ago

可以在 AVD android13(google play) 上复现