Closed tkkcc closed 2 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之类的没有关系。
可以在 AVD android13(google play) 上复现
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中的版本过低有关?