android 上下偏差怎么写_详解 Android 热更新升级如何突破底层结构差异?

知道了 native 替换方式兼容性问题的原因,我们是否有办法寻求一种新的方式,不依赖于 ROM 底层方法结构的实现而达到替换效果呢?

我们发现,这样 native 层面替换思路,其实就是替换 ArtMethod 的所有成员。那么,我们并不需要构造出 ArtMethod 具体的各个成员字段,只要把 ArtMethod 的作为整体进行替换,这样不就可以了吗?

也就是把原先这样的逐一替换。

变成了这样的整体替换。

因此 Andfix 这一系列繁琐的替换:

其实可以浓缩为:

就是这样,一句话就能取代上面一堆代码,这正是我们深入理解替换机制的本质之后研发出的新替换方案。

刚才提到过,不同的手机厂商都可以对底层的 ArtMethod 进行任意修改,但即使他们把 ArtMethod 改得六亲不认,只要我像这样把整个 ArtMethod 结构体完整替换了,就能够把所有旧方法成员自动对应地换成新方法的成员。

但这其中最关键的地方,在于 sizeof(ArtMethod)。如果 size 计算有偏差,导致部分成员没有被替换,或者替换区域超出了边界,都会导致严重的问题。

对于 ROM 开发者而言,是在 art 源代码里面,所以一个简单的 sizeof(ArtMethod)就行了,因为这是在编译期就可以决定的。

但我们是上层开发者,app 会被下发给各式各样的 Android 设备,所以我们是需要在运行时动态地得到 app 所运行设备上面的底层 ArtMethod 大小的,这就没那么简单了。

想要忽略 ArtMethod 的具体结构成员直接取得其 size 的精确值,我们还是需要从虚拟机的源码入手,从底层的数据结构及排列特点探寻答案。

在 art 里面,初始化一个类的时候会给这个类的所有方法分配空间,我们可以看到这个分配空间的地方:

类的方法有 direct 方法和 virtual 方法。direct 方法包含 static 方法和所有不可继承的对象方法。而 virtual 方法就是所有可以继承的对象方法了。

AllocArtMethodArray 函数分配了他们的方法所在区域。

可以看到,ptr 是这个方法数组的指针,而方法是一个接一个紧密地 new 出来排列在这个方法数组中的。这时只是分配出空间,还没填入真正的 ArtMethod 的各个成员值,不过这并不影响我们观察 ArtMethod 的空间结构。

正是这里给了我们启示,ArtMethod 们是紧密排列的,所以一个 ArtMethod 的大小,不就是相邻两个方法所对应的 ArtMethod 的起始地址的差值吗?

正是如此。我们就从这个排列特点入手,自己构造一个类,以一种巧妙的方式获取到这个差值。

由于 f1 和 f2 都是 static 方法,所以都属于 direct ArtMethod Array。由于 NativeStructsModel 类中只存在这两个方法,因此它们肯定是相邻的。

那么我们就可以在 JNI 层取得它们地址的差值:

然后,就以这个 methSize 作为 sizeof(ArtMethod),代入之前的代码。

问题就迎刃而解了。

值得一提的是,由于忽略了底层 ArtMethod 结构的差异,对于所有的 Android 版本都不再需要区分,而统一以 memcpy 实现即可,代码量大大减少。即使以后的 Android 版本不断修改 ArtMethod 的成员,只要保证 ArtMethod 数组仍是以线性结构排列,就能直接适用于将来的 Android 8.0、9.0 等新版本,无需再针对新的系统版本进行适配了。事实也证明确实如此,当我们拿到 Google 刚发不久的 Android O(8.0)开发者预览版的系统时,hotfix demo 直接就能顺利地加载补丁跑起来了,我们并没有做任何适配工作,鲁棒性极好。

【注:本文源自网络文章资源,由站长整理发布】

web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权

转载请注明原文链接:详解 Android 热更新升级如何突破底层结构差异?

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

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

相关文章

Python3 Flask+nginx+Gunicorn部署(上)

前言:一般在本地运行flask项目通常是直接python3 文件名.py,然后打开:http://127.0.0.1:5000 查看代码结果 这次主要是记录flask在python3 环境结合nginx gunicorn在服务器上进行项目的部署 (一)运行环境:虚…

NOIP2011 铺地毯

题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯,一共有n张地毯,编号从 1 到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设&…

java lock可重入_Java源码解析之可重入锁ReentrantLock

本文基于jdk1.8进行分析。ReentrantLock是一个可重入锁,在ConcurrentHashMap中使用了ReentrantLock。首先看一下源码中对ReentrantLock的介绍。如下图。ReentrantLock是一个可重入的排他锁,它和synchronized的方法和代码有着相同的行为和语义&#xff0c…

matlab的qammod函数_基于-MATLAB下的16QAM仿真.doc

1.课程设计目的随着现代通信技术的发展,特别是移动通信技术高速发展,频带利用率问题越来越被人们关注。在频谱资源非常有限的今天,传统通信系统的容量已经不能满足当前用户的要求。正交幅度调制QAM(Quadrature Amplitude Modulation)以其高频…

POJ3264 【RMQ基础题—ST-线段树】

ST算法Code&#xff1a; //#include<bits/stdc.h> #include<cstdio> #include<math.h> #include<iostream> #include<queue> #include<algorithm> #include<string.h> using namespace std; typedef long long LL;const int N5e410;…

leetcode199. 二叉树的右视图(bfs)

给定一棵二叉树&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释:1 <---/ \ 2 3 <---\ \5 4 <---解题思…

开发人员工作周报_如何增加找到开发人员工作的机会

开发人员工作周报In a recent job as a senior developer, I helped interview and hire many of my employer’s development team members. This is a brain dump of my advice based on those interviews.在最近担任高级开发人员的工作中&#xff0c;我帮助面试和雇用了许多…

安全专家教你如何利用Uber系统漏洞无限制的免费乘坐?

本文讲的是安全专家教你如何利用Uber系统漏洞无限制的免费乘坐&#xff1f;&#xff0c;近日&#xff0c;根据外媒报道&#xff0c;美国一名安全研究人员发现Uber上存在一处安全漏洞&#xff0c;允许发现这一漏洞的任何用户在全球范围内免费享受Uber乘车服务。据悉&#xff0c;…

flume介绍

flume 1.flume是什么 Flume:** Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、传输、聚合的系统。** Flume仅仅运行在linux环境下** flume.apache.org(Documentation--Flume User Guide) Flume体系结构(Architecture)&#xff1a; …

threadx 信号量 应用_操作系统及ThreadX简介.ppt

操作系统及ThreadX简介操作系统及ThreadX简介 软件二部 2006.09 主要内容 多任务操作系统概述 ThreadX简介 关于驱动的交流 操作系统概述 什么是操作系统 管理计算机的所有资源&#xff0c;并为应用程序提供服务的最重要的系统软件 操作系统的目的 为用户编程提供简单的接口&am…

java中同步组件_Java并发编程(自定义同步组件)

并发包结构图&#xff1a;编写一个自定义同步组件来加深对同步器的理解业务要求&#xff1a;* 编写一个自定义同步组件来加深对同步器的理解。* 设计一个同步工具&#xff1a;该工具在同一时刻&#xff0c;只允许至多两个线程同时访问&#xff0c;超过两个线程的* 访问将被阻塞…

maven学习资料

maven学习资料maven学习教程&#xff1a;What、How、Whyhttp://www.flyne.org/article/167Maven 那点事儿 https://my.oschina.net/huangyong/blog/194583项目管理工具&#xff1a;Maven教程http://www.flyne.org/article/884转载于:https://www.cnblogs.com/zhao1949/p/634641…

leetcode127. 单词接龙(bfs)

给定两个单词&#xff08;beginWord 和 endWord&#xff09;和一个字典&#xff0c;找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则&#xff1a; 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 说明: 如果不存在这样的转换序…

算法之旅 | 快速排序法

HTML5学堂-码匠&#xff1a;前几期“算法之旅”跟大家分享了冒泡排序法和选择排序法&#xff0c;它们都属于时间复杂度为O(n^2)的“慢”排序。今天跟大家分享多种排序算法里使用较广泛&#xff0c;速度快的排序算法—— 快速排序法 [ 平均时间复杂度为O (n logn) ]。Tips 1&…

springmvd接收参数问题

问题描述&#xff1a; 好久不写博客了&#xff0c;今天遇到一个问题&#xff0c;那就是post请求时&#xff0c;参数接收不到&#xff0c;当时我很纳闷&#xff0c;看代码&#xff1a; 就是这样几个参数&#xff0c;我使用postman请求时无法获取参数&#xff1a; 报错信息&#…

figma下载_如何在Figma中创建逼真的3D对象

figma下载by Gbolahan Taoheed Fawale通过Gbolahan Taoheed Fawale 如何在Figma中创建逼真的3D对象 (How to create realistic 3D objects in Figma) Prior to using Figma, I used Adobe Illustrator for most of my designs (like logos, mockups, illustrations, and so on…

OpenGL中的二维编程——从简单的矩形开始

一、OpenGL的组成 图元函数&#xff08;primitive function&#xff09;指定要生成屏幕图像的图元。包括两种类型&#xff1a;可以在二维、三维或者四维空间进行定义的几何图元&#xff0c;如多边形&#xff1b;离散实体&#xff1b;位图。属性函数&#xff08;attribute funct…

圆与平面的接触面积_如果一个绝对的圆放在绝对的平面上,接触面是不是无限小?...

这种问题其实并不难解答&#xff1a;如果你真的能找到一个绝对的圆还有一个绝对平的平面上&#xff0c;并且保证放上去之后圆和平面不会有任何变化&#xff0c;那么接触面就可以是无限小&#xff01;如果不能&#xff0c;很抱歉&#xff0c;接触面很显然就不会是无限小&#xf…

leetocde1129. 颜色交替的最短路径(bfs)

在一个有向图中&#xff0c;节点分别标记为 0, 1, …, n-1。这个图中的每条边不是红色就是蓝色&#xff0c;且存在自环或平行边。 red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边。类似地&#xff0c;blue_edges 中的每一个 [i, j] 对表示从节点 i 到节点…

第38天:运算符、字符串对象常用方法

一、运算符 一元操作符 &#xff0c; --&#xff0c; &#xff0c; - 5 -6 逻辑操作符 !&#xff0c; &&&#xff0c; || 基本运算符 , -, *, /, % 关系操作符 >, <, >, <, , , !, ! 赋值 判断 全等 条件操作符 &#xff08;三…