Tencent / tinker

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
Other
17.1k stars 3.33k forks source link

shouldAcceptEvenIfIllegal 允许部分手机未执行完oat直接报补丁完成,部分新的android10低端机型二次启动时长变长 #1635

Open 82604716 opened 2 years ago

82604716 commented 2 years ago

shouldAcceptEvenIfIllegal 允许部分手机未执行完oat直接报补丁完成,部分新的android10低端机型二次启动时长变长。 现在很多android10手机性能较差4G内存,但是也在shouldAcceptEvenIfIllegal这个方法的允许列表内, 这些手机二次启动要不直接用解析运行要不等待oat执行完运行,效率都极低卡顿二次启动时长变长。 手机型号有: SM-G9350 MI CC 9e PEFM00 Redmi 8A ivvi P60

qinlili23333 commented 2 years ago

其实从长远角度考虑的话,低端机更应该使用更偏向于用空间换速度的oat,因为解释器的效率肯定是不如oat之后的,在cpu较差的情况下差异会非常明显。oat牺牲一次启动时间,换取之后一直更快的运行,是非常值得的。倒是高端机因为瓶颈往往不在cpu而在io和网络上,oat反而不大容易表现出那么大的速度优势。

82604716 commented 2 years ago

@qinlili23333 在普遍情况下赞同您的观点,现在问题点就是因为入门手机的原因都使用android10系统,导致硬件很差的手机被判断为高端机,而且shouldAcceptEvenIfIllegal方法的存在让硬件低的手机不做oat做解析性运行,这启动速度是灾难性的。

qinlili23333 commented 2 years ago

@qinlili23333 在普遍情况下赞同您的观点,现在问题点就是因为入门手机的原因都使用android10系统,导致硬件很差的手机被判断为高端机,而且shouldAcceptEvenIfIllegal方法的存在让硬件低的手机不做oat做解析性运行,这启动速度是灾难性的。

所以我的建议实际上是全部改用speed-profile做oat,并送入旧版本的profile。这样可以把常用方法预先编译,编译时间比较短,节约空间的情况下尽可能提升性能。(space-profile也可以作为节约空间的选项之一,但低版本系统上并不支持,没记错的话要28还是29才支持) 当然,speed-profile有一个问题就是如果build.prop里没有配置保存jit信息,那么就没有方法会被oat,这里最好做个检测,如果没有启用jit则改用quicken或speed。 以及如果启用加固支持,此时最好应该使用speed,就我自己实际测试下来,加固包使用speed全量编译也很快,而且实际占用空间比其他任何模式都要小。