【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )

简介: 【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )

文章目录

一、修复包 Dex 文件准备

二、Odex 优化

三、Dex 文件拷贝

四、 源码资源





一、修复包 Dex 文件准备


异常代码 : 故意写一个异常代码 , 并执行该代码 , 肯定会崩溃 ;


package kim.hsl.hotfix;
import android.util.Log;
public class HotFixTest {
    public void test(){
        if (true) {
            // 直接抛出异常
            throw new RuntimeException();
        }
        Log.i("HotFixTest", "HotFixTest 执行成功");
    }
}


修复后代码 :


package kim.hsl.hotfix;
import android.util.Log;
public class HotFixTest {
    public void test(){
        if (false) {
            // 直接抛出异常
            throw new RuntimeException();
        }
        Log.i("HotFixTest", "HotFixTest 执行成功");
    }
}



参考 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 ) 二、 将 Java 字节码文件打包到 Dex 文件 章节流程 , 将更新后的 kim.hsl.hotfix.HotFixTest 类打包成 dex 文件 ;



进入到 " HotFix\app\build\intermediates\javac\debug\classes " 目录 , 这是生成 Class 字节码的目录 , HotFix 是 Android Studio 工程根目录 ;


删除 " HotFix\app\build\intermediates\javac\debug\classes\kim\hsl\hotfix " 目录中除了 HotFixTest.class 之外的其它字节码文件 ;



执行命令 :


Y:\001_DevelopTools\002_Android_SDK\build-tools\30.0.2\dx.bat


–dex --output


Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes\update.dex


Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes


Y:\001_DevelopTools\002_Android_SDK\build-tools\30.0.2\dx.bat --dex --output Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes\update.dex

Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes\


指令命令后 , 在 " Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes\ " 目录下生成了需要更新的 " update.dex " 文件 ;

image.png



( 可以参考 【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 ) 博客内容)



将编译好的 update.dex 放置到 SD 卡根目录中 , 下一步开始使用该 dex 文件进行热修复 ;






二、Odex 优化


修复包就是一个 Dex 文件 , 热修复框架虽然给生成了一个 .patch 文件 , 其本质还是将 Dex 文件封装到了 .patch 文件中 ;


Android 应用第一次安装比较慢 , 这是由于在 Android 5.0 5.05.0 之后的系统版本中 , 添加了 ART 虚拟机 , 5.0 5.05.0 之前的系统版本安装速度很快 ;


老版本的手机安装 APK 应用 , 只需要几秒钟时间 ; 新版本的手机 , 安装 APK 文件会慢很多 ;


新版手机系统安装时 , 对 Dex 文件进行了优化 , 将 Dex 文件转为 Odex 文件 , 系统查找类时 , 加载 Dex 速度很慢 , 将 Dex 优化为 Odex , 从 Odex 中取 Class 字节码速度要更快一些 ;






三、Dex 文件拷贝


应用运行时不会从 APK 压缩文件中加载 Class 字节码文件 , APK 文件安装在 Android 手机中时 , 将 APK 中的压缩文件拷贝到 /data/user/包名/app_odex 目录下 ;


首先获取 /data/user/包名/app_odex 目录 , 使用 Context.getDir 目录时 , 会自动在字符串前添加 “app_” 前缀 , 先将 Dex 文件拷贝到该目录中 ;


     

// 拷贝的目的文件目录
        // /data/user/0/kim.hsl.hotfix/app_odex
        File targetDir = this.getDir("odex", Context.MODE_PRIVATE);
        // 拷贝的目的文件名称
        String targetName = "update.dex";
        // 准备目的文件, 将 Dex 文件从 SDK 卡拷贝到此文件中
        String filePath = new File(targetDir, targetName).getAbsolutePath();
        File file = new File(filePath);
        if (file.exists()) {
            file.delete();
        }
        // 准备输入流, 读取 SD 卡文件
        InputStream is = null;
        // 准备输出流, 输出到目的文件
        FileOutputStream os = null;
        try {
            // 读取 SD 卡跟目录的 update.dex 文件
            is = new FileInputStream(new File(Environment.getExternalStorageDirectory(), targetName));
            // 输出到目标文件
            os = new FileOutputStream(filePath);
            int len = 0;
            byte[] buffer = new byte[1024];
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
            // 进行后续操作
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭 IO 流
            try {
                os.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }






四、 源码资源


源码资源 :


GitHub 地址 : https://github.com/han1202012/HotFix

CSDN 源码快照 : https://download.csdn.net/download/han1202012/16641987


目录
相关文章
|
3天前
|
开发工具 Android开发 git
Windows下载android2.2完整源码(转)
Windows下载android2.2完整源码(转)
15 3
|
3天前
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
12 4
|
5天前
|
Java Android开发
Android12 双击power键启动相机源码解析
Android12 双击power键启动相机源码解析
14 0
|
1天前
|
移动开发 监控 Android开发
构建高效Android应用:Kotlin协程的实践与优化
【5月更文挑战第12天】 在移动开发领域,性能与响应性是衡量一个应用程序优劣的关键指标。特别是在Android平台上,由于设备的多样性和系统资源的限制,开发者需要精心编写代码以确保应用流畅运行。近年来,Kotlin语言因其简洁性和功能性而广受欢迎,尤其是其协程特性,为异步编程提供了强大而轻量级的解决方案。本文将深入探讨如何在Android应用中使用Kotlin协程来提升性能,以及如何针对实际问题进行优化,确保应用的高效稳定执行。
|
3天前
|
Android开发
在android源码中编译ADW_Launcher
在android源码中编译ADW_Launcher
10 2
|
5天前
|
Android开发
Android 高通平台集成无源码apk示例
Android 高通平台集成无源码apk示例
15 0
|
5天前
|
Android开发
Android修改源码实现root
Android修改源码实现root
8 0
|
6天前
|
Java Android开发
Android 设置系统时区的源码追踪
Android 设置系统时区的源码追踪
11 1
|
13天前
|
缓存 监控 API
Android应用性能优化实践
【4月更文挑战第30天】 随着智能手机的普及,用户对移动应用的性能要求越来越高。对于Android开发者而言,提升应用的性能是吸引和保留用户的关键因素之一。本文将深入探讨影响Android应用性能的主要因素,并提供一系列的优化策略,旨在帮助开发者构建更加流畅和高效的应用体验。
|
13天前
|
移动开发 调度 Android开发
构建高效Android应用:Kotlin协程的实践与优化
【4月更文挑战第30天】在移动开发领域,性能和响应性是衡量应用质量的关键指标。对于Android平台而言,Kotlin协程作为一种新兴的异步编程解决方案,提供了更为简洁和高效的处理并发任务的能力。本文将深入探讨Kotlin协程的核心原理,以及如何通过它们来提升Android应用的性能。我们将从基础概念出发,逐步介绍协程的创建、管理以及与Android UI线程的交互,并最终展示如何优化现有代码以利用协程的优势。