Tencent / Shadow

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

App升级targetSdk29后关于ART的行为变更是否会影响到shadow框架? #1245

Closed xiboliya closed 9 months ago

xiboliya commented 9 months ago

我们App在升级targetSdk29时,发现有这么一条行为变更: Android 运行时只接受系统生成的 OAT 文件 Android 运行时 (ART) 不再从应用进程调用 dex2oat。这项变更意味着 ART 将仅接受系统生成的 OAT 文件。

在 ART 中强制要求 AOT 正确性 过去,如果编译时和运行时的类路径环境不同,则 Android Runtime (ART) 执行的预先 (AOT) 编译可能会导致运行时崩溃。Android 10 及更高版本始终要求这些环境相同,因而出现了以下行为变更: 自定义类加载器(即应用编写的类加载器,与 dalvik.system 软件包中的类加载器不同)并不是预先 (AOT) 编译的。这是因为 ART 无法在运行时了解自定义的类查找实现。 辅助 dex 文件(即由主 APK 外的应用手动加载的 dex 文件)是在后台 AOT 编译的。这是因为首次使用编译可能代价过高,会导致在执行前出现意外的延迟。请注意,对于应用,建议您采用拆分方法,并弃用辅助 dex 文件。 Android 中的共享库(Android 清单中的 条目)在实现时使用的类加载器层次结构与先前版本的平台中所用的不同。

我们对这部分的逻辑不是很了解,所以想请大佬帮忙解答一下,这项变更会影响到当前的shadow框架内部逻辑吗?是否需要适配?谢谢!

xiboliya commented 9 months ago

@shifujun 请问大佬,上述行为变更会影响到shadow吗?或者说当前shadow框架是否已适配targetSdk30?谢谢!

shifujun commented 9 months ago

这个问题虽然很有意义,但是你的描述怎么看起来完全把这个项目当黑盒用了?有没有影响,我作为作者也不能凭空说,谁都得试试才知道。你没试吗?targetSdk就更是翻一下源码,或者你全文搜索一下就能知道了啊。

我觉得你先做过这两件事了,然后带着结论来讨论更有意义吧?

还有个小问题,你引用的文字没有链接,虽然我应该也能搜到。

xiboliya commented 9 months ago

这个问题虽然很有意义,但是你的描述怎么看起来完全把这个项目当黑盒用了?有没有影响,我作为作者也不能凭空说,谁都得试试才知道。你没试吗?targetSdk就更是翻一下源码,或者你全文搜索一下就能知道了啊。

我觉得你先做过这两件事了,然后带着结论来讨论更有意义吧?

还有个小问题,你引用的文字没有链接,虽然我应该也能搜到。

非常感谢大佬回复!很抱歉没有描述清楚,官方变更描述链接如下:https://developer.android.google.cn/about/versions/10/behavior-changes-10?hl=zh-cn#system-only-oat 另外,我们搜索关键字:dex2oat,没有搜索到。而且升级到targetSdk30之后运行了一下插件,没有发现问题。 由于我们对OAT和AOT不太了解,所以就想咨询一下有没有什么隐患。再次感谢!

shifujun commented 9 months ago

这个中文的文档翻译的不太好,你看英文的就清楚了。主要的影响应该就是对我们这种动态加载apk的classloader就不进行oat了。所以这些动态加载的类执行速度会不如安装的dex快。但是同时也避免了内敛优化导致的bug:https://github.com/Tencent/Shadow/issues/603#issuecomment-915810715

xiboliya commented 9 months ago

这个中文的文档翻译的不太好,你看英文的就清楚了。主要的影响应该就是对我们这种动态加载apk的classloader就不进行oat了。所以这些动态加载的类执行速度会不如安装的dex快。但是同时也避免了内敛优化导致的bug:#603 (comment)

好的,明白了,非常感谢解答!