EMAS热修复Sophix适配App加固的技术方案

news2024/12/23 19:01:38

一、问题描述

某阿里云EMAS客户的APK基于最新的线上版本发布了第十个补丁,发布1小时后在崩溃检测平台收集到crash日志,并收到用户反馈:部分手机上的APP会闪退。

客户开发人员紧急上报EMAS技术支持,双方沟通后初步判断是补丁加载导致APP闪退。同时我们本地和客户本地经过多次、多轮测试,没有一台手机可以复现闪退,此时崩溃率已达到9% 左右,经讨论决定先回滚本次补丁。

二、调查难点

难点一:该问题当时无法在本地复现,技术支持同学经过充分、多次测试,包括用户出问题的同款手机,均无法复现闪退问题。

难点二:日志平台抓取的日志signal 6为系统层面日志,无法指导定位代码层面问题。 唯一一条有用日志:/data/app/com.xxx.xxx-l-Lc_A9dXeo8oWIupXFKxA==/oat/arm64/base.odex。

备注:EMAS远程日志提供客户端全量日志拉取、诊断、管理能力,帮助开发者建立分钟级线上问题定位能力

三、调查方向

  1. 日志抓到的报错对代码没有用,但是可以看出来是odex问题。我们需要反编译APK文件,查看具体class内容。 在APP中关键节点加日志,
  2. 判断该类是否成功加载到补丁里以及加载补丁的时候有没有加载这个类,两个重要节点

四、调查经过

第一阶段:根据抓到的日志显示崩溃在odex中:

在这里插入图片描述

怀疑和加固有关,经确认,客户使用了加固,但是日志上看走的是非加固模式,我们提供热修复走加固模式的API(下图),适配后重新测试。

在这里插入图片描述

第二阶段:客户走加固模式后,提供了测试包(APK未加固),经测试有10%的手机会崩溃(如荣耀、华为品牌的手机,失败日志如下:)

在这里插入图片描述

日志上看是崩溃在外部类调用内部类的checkInputTxt方法上,通过方法签名看,外部类是旧包中的,内部类是补丁包的,但是外部类有变更,理论上应该加载补丁中的外部类。此时,我们怀疑外部类ChatRoomManager没打包进补丁包,反编译补丁包检查(如下图)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看出外部类打包进了补丁包,此步骤和流程没有问题,但是从补丁加载日志上看,加载的补丁包中也有外部类,此时我们怀疑外部类在加载补丁之前已经被类加载器加载。(由于部分机型必现崩溃,部分机型正常,开始怀疑不同机型系统的类加载机制问题,但是普遍认知中类加载机制一般不会出问题。)

第三阶段:此时重点关注类加载的时机和类加载器对象:加了类加载过程的日志和类加载器哈希打印。

在这里插入图片描述

日志中崩溃的设备在加载补丁包前后都没有看到外部类的加载日志。此时确定是类加载器的问题。考虑到加固本身也会使用自定义类加载器,让客户对APK进行加固,测试正常。

五、问题解决

基于结论,我们给客户适配了加固模式测试,加固模式会使用自己的类加载器,避免了双亲委派机制失效的影响。经过monkey测试30台机器均无问题,至此反馈客户问题解决。

六、总结

  1. 匿名内部类的热修的需要加一些java代码来确保所有的方法都被打进补丁包。
  2. 适配加固的方案需要严格适配加固模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/715638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用rewriteBatchedStatements属性优化Mybatis-Plus批量插入数据

前言 由于项目是使用MyBatis-Plus开发的,用起来也确实比较方便,尤其是service层封装好的一些通用的增删改查方法,省去了不少sql语句的书写,但是在开发过程中,我也发现MyBatis-Plus的saveBatch批量插入方法针对MySQL数…

MAYA横纵拉窗帘

设置移动动画 向上拉帘

File System Access API 浅析

前言 最近在用python(tkinter GUI库)做一个小工具时,选择文件后可以获得其真实路径。而前端(浏览器)出于安全和性能等方面的考虑,对文件的操作是非常局限的。 在HTML5标准的File API之前,纯前…

【Redis】高可用之复制(replica)

本文是Redis系列第4篇,前3篇欢迎移步 【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型,各个文章总有些小不同,我们这里讨论的是Redis 7.0,为确保准确&#xff…

Raft算法之Leader选举

Raft算法之Leader选举 一、Leader选举概述 Raft 使用心跳(heartbeat)触发Leader选举。当服务器启动时,初始化为Follower。Leader向所有Followers周期性发送heartbeat。如果Follower在选举超时时间内没有收到Leader的heartbeat,就…

图像视频基础

参考学习资料:https://blog.csdn.net/qq_28258885/article/details/116192244 文章目录 图像颜色深度分辨率 视频帧率比特率帧类型消除冗余的方法时间冗余(帧间预测)空间冗余(帧内预测) 视频编码器1.分区2.预测3.转换…

软件测试基础教程学习4

文章目录 软件测试技术和方法4.1 静态测试和动态测试4.2 黑盒测试和白盒测试概述4.3 黑盒测试技术4.3.1 等价类划分4.3.2 边值分析4.3.3 因果图法4.3.4 正交实验设计法4.4.5 决策表驱动测试4.5.6 错误推荐法 4.4 白盒测试技术4.4.1 程序结构分析测试4.4.2 逻辑覆盖测试4.4.3 路…

JSP页面跳转刷新

问题: 当前的jsp页面触发ajax请求后,能够获得新的相应页面,但是浏览器上展示的依然是老的页面,数据不刷新 尝试使用页面重定向依然无效, 最后使用js的window.location.href, 让浏览器的页面url 重加载才ok function submitDate() {var date1 document.getElementById("d…

【uniapp】uniapp反向代理解决跨域问题(devServer)

背景介绍 前段时间,在拿uniapp开发的时候,出现了跨域问题,按理说跨域应该由后端解决,但既然咱前端可以上,我想就上了(顺手装个13) 首先介绍什么是跨域 出于浏览器的同源策略,在发…

docker-使用harbor搭建私有仓库

前提 安装docker-ce 安装docker-compose 安装 安装docker-ce # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce…

金蝶云星空无需代码连接钉钉考勤的方法

金蝶云星空用户使用场景: 企业的销售渠道人员出差之前需要在金蝶云星空上提交出差申请单,并等待审批通过;每当销售任务完成,金蝶云星空上的审批通过后,需要人力在考勤系统中手动修改考勤信息。看似比较简单的流程&…

基于Java+SpringBoot+vue的汽车改装方案网站设计与实现

博主介绍:✌擅长Java、微信小程序、Python、Android等,专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案…

Bitbucket 新版本的安全限制

新版本的安全限制 是继续按照他给的第二个链接进入Bitbucket仓库后台添加App密码,也就是每个仓库需要单独的秘密码,这样的话就更加安全。 生产新密码: 这一坨务必要妥善保存,因为一旦点了关闭之后你就再也没有机会看到这个密码了…

Hive一分钟

分区和分桶 1.分区表是将大的表文件划分成多个小文件以利于查询,但是如果数据分布不均衡,也会影响查询效率。 2.桶表可以对数据进行哈希取模,目的是让数据能够均匀的分布在表的各个文件中。 3.物理上,每个桶就是表和分区目录里的…

14个在你的WordPress网站上使用OpenAI的最好方法(2003)

您是否想知道如何在您的WordPress网站上使用OpenAI和ChatGPT? OpenAI可以提供一切帮助,从为您的帖子生成元描述到撰写电子邮件销售文案。您可以在您的WordPress网站上使用OpenAI来节省时间、降低成本、改善您的搜索引擎优化和工作流程,并发展…

推荐大型电商项目【谷粒商城】

谷粒商城项目是尚硅谷研究院最新推出的完整大型分布式架构电商平台,技术全面、业务深入,全网无出其右。 技术涵盖:微服务架构分布式全栈集群部署自动化运维可视化CICD,对标阿里P6/P7,冲击40-60w年薪。 项目由业务集群…

吐血整理!可免费使用的国产良心软件分享,几乎满足你办公需求

在这个信息化时代,软件已经成为我们办公和生活的必备工具。然而,市面上的大部分国产软件都需要付费才能使用,给我们的经济负担增加了不少。幸运的是,国内有一些良心软件,它们质量上乘,功能强大,…

myCobot机器人ChatGPT应用:设计原则和模型能力

我们将 ChatGPT 的功能扩展到机器人,并通过语言直观地控制机器人手臂、无人机和家庭助理机器人等多个平台。 你有没有想过用你自己的话告诉机器人该怎么做,就像你对人类一样?只是告诉你的家庭助理机器人:“请加热我的午餐”&…

SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合来实现Dubbo分布式事务

1.简介 “ 本文主要介绍SpringBoot2.1.5 Dubbo 2.7.3 Mybatis 3.4.2 Nacos 1.1.3 Seata 0.8.0整合来实现Dubbo分布式事务管理,使用Nacos 作为 Dubbo和Seata的注册中心和配置中心,使用 MySQL 数据库和 MyBatis来操作数据。 ” 如果你还对SpringBoot、Dubbo、Nacos…

数据湖真的能取代数据仓库吗?【SNP SAP数据转型 】

数据湖和数据仓库的存在并不冲突,也并不是取代的关系,而是相互的融合关系。 数据湖是近两年中比较新的技术在大数据领域中,对于一个真正的数据湖应该是什么样子,现在对数据湖认知还是处在探索的阶段,像现在代表的开源产…