首页 > 其他分享 >Android开发之热修复

Android开发之热修复

时间:2024-07-31 12:53:50浏览次数:17  
标签:dex Run 修复 之热 so Instant Android 加载

#来自ウルトラマンゼロ(哉阿斯)

1 热修复核心

  • 资源修复
  • 代码修复
  • 动态链接库修复

2 资源修复

资源修复参考 Instant Run 的资源修复原理。

  • 创建 AssetManager,通过反射调用 addAssetPath 方法加载外部的的资源。
  • 将 AssetManager 类型的 mAssets 字段的引用全部替换成新创建的 AssetManager。

2.1 Instant Run

Instant Run 是 AS 2.0 新增的运行机制,其运行如下:

3 代码修复

代码修复主要有三个方案:

  • 类加载方案
  • 底层替换方案
  • Instant Run 方案

3.1 类加载方案

基于 Dex 分包方案

原理:

ClassLoad 加载类时候,调用 DexPatchList#findClass

public Class<?> findClass(String name, List<Throwable> suppressed) {
     for (Element element : dexElements) {
          Class<?> clazz = element.findClass(name, definingContext, suppressed);//查找类
         if (clazz != null) {
             return clazz;
         }
     }

     if (dexElementsSuppressedExceptions != null) {
         suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions));
     }
     return null;
}
  • Element 内部封装 DexFile,DexFile 用于加载 dex 文件,每个 dex 文件对应一个 Element;
  • 多个 Element 组成有序的数组 dexElements,查找类就是遍历这个数组;
  • Key.class 这个类有 bug,我们将 Key.class 修改之后,打一个新 dex 包 Patch.dex,放到 Element 数组的第一个,一旦查找到该类,后面那个有 bug 的 Key.class 就不会被加载从而达到修复 bug 的目的。

缺点:

  • 需要重启 App,不能即时生效,这是由于 App 运行时候,相关的类无法被卸载,需要重新启动 App。

Tinker原理:新旧包做 diff,比较生成一个 patch.dex,与手机中的 APK 的 classes.dex 做合并,生成一个新的 classes.dex,反射把这个 classes.dex 放到 Element 的第一个元素。

3.2 底层替换方案

直接在 Native 层修改原有类。替换 ArtMenthod 结构体中的字段或者整个 ArtMethod 结构体。

3.3 Instant Run 方案

Instant Run 在第一次构建 APK 会在每个方法中使用 AMS 注入类似的代码:

IncrementalChange localIncrementalChange = $change//类有修改,则不为空
if(localIncrementalChange != null){
     //执行修改类
      ...
}

4 动态链接库修复

主要应用 System 下面这两个方法:

  • System.load:参数是 so 在磁盘中的完整路径,加载指定路径的 so
  • System.loadLibrary:参数是 so 的名称,用于加载 App 安装后从 apk 包复制到 data/data/packagename/lib 目录下的 so 库

上面最后都调用 nativeLoad 这个 native 方法去加载so库, 这个方法的参数 fileName(so库在磁盘中的完整路径名)。最后调用 LoadNativeLibrary 函数加载类,方法和 类加载方案类似。

总结:

  • 将 so 补丁插入到 NativeLibraryElement 数组前部,让 so 补丁的路径先被返回和加载。
  • 调用 System 的 load 的方案来接管 so 的加载入口

标签:dex,Run,修复,之热,so,Instant,Android,加载
From: https://blog.csdn.net/2302_77186925/article/details/140812680

相关文章

  • Android RecyclerView
    AndroidRecyclerView介绍RecyclerView是Android的一个高级视图组件,旨在显示大量数据的列表或网格。相比于传统的ListView,RecyclerView提供了更多的功能和灵活性。AdapterAdapter是RecyclerView的数据源,负责将数据绑定到ViewHolder上。常见的Adapter实现包括Recy......
  • Android开发 - (适配器)Adapter类中ArrayAdapter实现类详细解析
    作用将数组数据映射到UI组件(如ListView、Spinner等)上的角色。它是BaseAdapter的一个子类,专门用于处理简单的数据集合,如数组或列表。ArrayAdapter简化了数据到视图映射的过程,使得开发者能够以更少的代码实现数据的展示。它的主要作用为以下几点:数据绑定:它能够将一组数据......
  • 无法从Android恢复删除的文件该怎么办?5 个方法可以学习参考下
    Android设备已成为我们生活中不可或缺的一部分,充当重要文件、照片和文档的存储中心。但是,意外时有发生,有时我们会不小心从Android设备中删除重要文件。好消息是,有一些方法可以从Android恢复永久删除的文件。在这篇博文中,我们将探讨各种方法和解决方案,以帮助您检索有价值的数据......
  • Androidstudio开发,购物商城app实现主页底部导航栏(四)
    相关视频教程在某站上面(......
  • Androidstudio开发,购物商城app实现商品分类列表(五)
    相关视频教程在某站上面(......
  • Kivy 2.3 VideoPlayer Android 崩溃
    我正在尝试创建视频.apk,其中包括Video或VideoPlayer.main.pyfromkivy.uix.videoimportVideofromkivy.appimportAppclassMyApp(App):defbuild(self):player=Video(source="1.mp4",options={'eos':'loop'......
  • 我如何在 python 上使用 spire.pdf 修复此错误
    我使用spirepdf,但出现以下错误:“DllNotFound_Windows,libSkiaSharp,Nosepuedeencontrarelmóduloespecificado.:....”defextract_text_from_pdf(file_path,output_file):#LoadaPDFdocumentdoc=PdfDocument()doc.LoadFromFile(file_path)ex......
  • 如何修复 PyAV 的视频流颜色错误?
    我正在尝试从灰度帧创建视频,但视频仅显示一种颜色(绿色)。帧是numpy数组importavimportnumpyasnpoutput=av.open("myvideo.mp4",'w')ovstream=output.add_stream('h264')ovstream.width=514ovstream.height=616forframeinframes:packet=......
  • Android开发 - List类中的CopyOnWriteArrayList实现类解析
    CopyOnWriteArrayList是什么CopyOnWriteArrayList是Java并发包(java.util.concurrent)中的一个并发安全的List实现类。它具有特定的设计,使得在并发场景下,读操作(如迭代)可以并发进行,而写操作(如添加、修改、删除)会进行一定的同步,但不会阻塞读操作主要特点和用法:线程安全......
  • Android 11.0 关于app进程保活
    需求:客户某些重要的app,在后台或者在内存紧张的时候,不允许被杀死ActivityManagerService./frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java//清除与该进程的所有连接finalvoidhandleAppDiedLocked(ProcessRecordapp,......