Android P新增检测项 应用热修复受重大影响

最近关于热修复崩溃在Android P 版本的内容持续增高,也许这个commit可以帮到你.

Google在Android P中添加了新的检测项,对国内大多数应用造成了严重影响:在调用resolve inline method时,如果检测到caller与callee处于不同的dex file,会主动发起abort(inline不允许跨dex文件),导致应用出现闪退等异常问题。

通waring告

通告

问题原因:

源码文件: art/runtime/entrypoints/entrypoint_utils-inl.h 源码关于art的下载地址: https://android.googlesource.com/platform/art/ commit 7c947996ca9426a8ae3abf9feb110f166d8f11da

commit 7c947996ca9426a8ae3abf9feb110f166d8f11daAuthor: Vladimir Marko <vmarko@google.com>Date:   Thu Apr 26 09:18:10 2018 +0100

    AOT inlined method lookup should stay within dex file.
    
    Rewrite the AOT inlined method lookup and guard against
    crossing dex file boundary. The compiler does not currently
    support inlining across dex files, so this is an indication
    of multiple dex files defining the same class and the AOT
    code having used a definition which is not used at runtime.    
    Test: m test-art-host-gtest    Test: testrunner.py --host --optimizing --jit    Test: Pixel 2 XL boots.    Test: testrunner.py --target --optimizing --jit    Bug: 74410240
    
    (cherry picked from commit 63a9f3e9e1b9fb8d98d8ca9abe626f3aa11e5692)
    
    Change-Id: Ibe9792f952d0c963b8560f10d57a951e227b24aa

从提交的日志可以看出,内敛inline应该存放在一个dex文件中,不允许跨dex文件

关于art/runtime/entrypoints/entrypoint_utils-inl.h的日志:

1、问题场景

由于国内大多数应用基本上都集成了热修复功能,所以 Android P的这个特性对国内应用影响较大。(不太理解热修复的童鞋可以参考:阿里的Android热修复技术原理.pdf)

目前发现主要有两种情况:

  • 场景一

应用原始apk中的dex A和从应用服务端下载的热修复dex B存在重复类,触发热修复且系统后台优化inline编译后,便会出现此问题。

  • 场景二

由 classloader A 加载的 class1 调用一个由 classloader B 加载的 class2里的某个 inline 方法,将导致应用闪退。

2、应用如何自检?

  • 1.首先建议应用在Android P中测试验证是否有该问题:

adb shell cmd package compile –m speed –f 应用包名 (inline编译)。 启动应用,构造热修复场景,在应用侧触发热修复。 热修复完成之后,重启应用,检测有无闪退和无响应问题。

  • 2.通过关键日志分析确认问题:

如果问题日志中有这个关键日志:This must be due to duplicate classes or playing wrongly with class loaders,可以确定就是该问题。

如下图:

06-20 19:07:24.597 30376 30376 F m.taobao.taoba:entrypoint_utils-inl.h:94]
Inlined method resolution crossed dex file boundary: 
from void com.ali.mobisecenhance.Init.doInstallCodeCoverage
(android.app.Application, android.content.Context) in/data/app/com.taobao.taobao-YPDeV7WbuyZckOfy-5AuKw==/base.apk!classes3.dex/0xece238f0to void com.ali.mobisecenhance.code.CodeCoverageEntry.CoverageInit
(android.app.Application, android.content.Context) in/data/user/0/com.taobao.taobao/files/storage/com.taobao.maindex
/dexpatch/1111/com_taobao_maindex.zip!classes4.dex/0xebda4320. 
This must be due to duplicate classes or playing wrongly with class loaders
  • 3、修复建议
    • 1.不要将ROM中预置的jar包打包至apk。
    • 2.不要使用相同的class loader加载重复类。
    • 3.如果必须要有重复类的话,避免内联现象(比如,在不期望被inline的函数里面加try catch,这样compiler就不会将此函数inline)。

原文发布于微信公众号 - Android历练记(gh_db8538619cdd)

原文发表时间:2018-10-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏喵了个咪的博客空间

PhalGo-ADM思想

#PhalGo-ADM思想 关于ADM思想主要是指在API开发中使用API,Domain和Model三层结构,PhalGo从PhalApi中学习并且推崇这种设计...

3789
来自专栏喔家ArchiSelf

老曹眼中的缓存技术

缓存是系统快速响应中的一种关键技术,是一组被保存起来以备将来使用的东西,介于应用开发和系统开发之间,是产品经理们经常顾及不到的地方,算是技术架构中的非功能性约束...

1552
来自专栏企鹅号快讯

系统方案合集-系统备份方案

导读 | 精选 一、方案特点 此方案是基于批处理脚本和任务计划技术,针对系统特有文件结构和数据库结构的特点,而形成的系统备份方案。该方案特点: 1.易用性好,通...

3847
来自专栏阿杜的世界

10个常见软件架构

原文参见:10 Common Software Architectural Patterns in a nutshell

1813
来自专栏java一日一条

如何通过编程发现Java死锁

死锁是指,两个或多个动作一直在等待其他动作完成而使得所有动作都始终处在阻塞的状态。想要在开发阶段检测到死锁是非常困难的,而想要解除死锁往往需要重新启动程序。更糟...

1511
来自专栏翻译

在Ubuntu 14.04/14.10上搭建Minecraft Spigot服务器

本文介绍了如何在Ubuntu 14.04 / 14.10上搭建自己的Minecraft服务器,搭建一个让我们可以与朋友远程开黑的私服,甚至是搭建一个几百人的公共...

3072
来自专栏大数据平台TBDS

Hiveserver2 性能优化与GC优化

最近发现hiveserver2(本质上是提供jdbc连接的driver进程)经常发生严重卡死故障,而且卡死分成两种现象。

91910
来自专栏BeJavaGod

阿里巴巴Druid数据源,史上最强的数据源,没有之一

目前常用的数据源主要有c3p0、dbcp、proxool、druid,先来说说他们 Spring 推荐使用dbcp; Hibernate 推荐使用c3p0和pr...

3909
来自专栏杨建荣的学习笔记

Windows环境下搭建Oracle 12c的体验

昨天准备一个Oracle环境,结果看起来是很简单的事情,却因为各种各样的原因耽搁了一些时间,从下载到安装部署,已经几个小时过去了,抬头看看,已经是凌晨快2点了。...

1290
来自专栏WeTest质量开放平台团队的专栏

Android外部存储

外部存储作为开发中经常接触的一个重要系统组成,在Android历代版本中,有过许许多多重要的变更。我也曾疑惑过,为什么一个简简单单外部存储,会存在存在这么多奇奇...

1363

扫码关注云+社区

领取腾讯云代金券