热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Android热修复】热修复原理(多Dex打包机制|多Dex支持|Dex分包设置|开发和产品风格设置|源码资源)

文章目录一、Dex打包设置1、多Dex支持2、Dex分包设置3、开发和产品风格设置(非必须)二、完整build.gradle配置1、build.gradle配置2、dex.keep


文章目录

  • 一、Dex 打包设置
    • 1、多 Dex 支持
    • 2、Dex 分包设置
    • 3、开发和产品风格设置 ( 非必须 )
  • 二、完整 build.gradle 配置
    • 1、build.gradle 配置
    • 2、dex.keep 配置
  • 二、 源码资源










一、Dex 打包设置





在 【Android 热修复】热修复原理 ( 类加载机制 | PathClassLoader 加载 Dex 机制 | PathDexList 查找 Class 机制 | 类查找的顺序机制 )三、 类查找的顺序机制 博客章节有讲解到 , Android 类加载时 , 必须进行分包操作 , 必须有 111 个主包 , 若干其它分包 , 主包中只包含应用启动少量代码 , 如 Application , MainActivity 等 , 修复包 Dex 文件需要插入到主包后面 , 其它分包前面 , 才能生效 ;

如果主包出现问题 , 只能发布新版本 ;

指定主包的文件 , 主包之外的类打包到其它分包 , 每个分包都有固定大小 , 分包会自动根据大小分为若干分包 ;






1、多 Dex 支持



首先 ,

在 build.gradle 中配置 implementation 'com.android.support:multidex:1.0.2' 依赖 ,
在 android / defaultConfig 层级配置支持多 Dex 设置 multiDexEnabled true ,
在 android / buildTypes / release 层级配置支持多 Dex 设置 multiDexEnabled true ,

android {defaultConfig {multiDexEnabled true}buildTypes {release {multiDexEnabled true}}
}
dependencies {implementation 'com.android.support:multidex:1.0.2'
}

然后 , 在 Application 中进行加载 , 在 attachBaseContext 中调用 MultiDex.install(base) 代码 ,

public class MyApplication extends Application {@Overrideprotected void attachBaseContext(Context base) {MultiDex.install(base);super.attachBaseContext(base);}@Overridepublic void onCreate() {super.onCreate();}
}





2、Dex 分包设置



规则语法 :

在 Module 下的 build.gradle 构建脚本中的 android / buildTypes / release 层级下 , 配置 multiDexKeepFile 设置 ,

通过该设置 , 可以设置 Dex 打包规则 ,

为 multiDexKeepFile 文件 , 定义规则 , 该定义规则有一定的语法 , 哪些 Java 源码文件打包在主 Dex 中 , 可以通过该配置进行定义 ;

在 app 目录下创建 " dex.keep " 文本文件 , 这里设置主包打包的 Java 字节码文件 , 其它的类都打包到分包中 ;

dex.keep 主包打包规则文件内容 :

kim/hsl/hotfix/MainActivity.class
kim/hsl/hotfix/MyApplication.class

build.gradle 配置 :

android {buildTypes {release {// 保留multiDexKeepFile file("dex.keep")}}
}

打包效果 : 生成的 apk 文件中 , classes.dex 是主 Dex 文件 , classes2.dex 是分包 dex ;

在这里插入图片描述






3、开发和产品风格设置 ( 非必须 )



productFlavors 设置后 , 可以在开发调试时 , 节省时间 , 不是必须的 , 不设置也不会报错 ;

如果配置了 productFlavors 选项 , 那么必须在 defaultConfig 中配置 flavorDimensions 维度版本号 , 否则在高版本的 Gradle 插件的情况下会报错 ;

android {defaultConfig {// 维度版本号flavorDimensions "1.0"}// 定义不同的开发和产品风格productFlavors {// 开发风格dev {// 开发时使用 minSDKVersion = 21 允许 Android Gradle 插件// 为每个 Module 模块产生一个 APK 安装包 , 可以在 Android Lollipop 系统上进行测试// 无需进行耗时的 dex 合并过程minSdkVersion 21}// 产品风格prod {// 应用实际的最小 SDKminSdkVersion 14}}
}









二、完整 build.gradle 配置










1、build.gradle 配置



plugins {id 'com.android.application'
}android {compileSdkVersion 30buildToolsVersion "30.0.3"defaultConfig {applicationId "kim.hsl.hotfix"minSdkVersion 16targetSdkVersion 30versionCode 1versionName "1.0"multiDexEnabled true// 维度版本号flavorDimensions "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}// 定义不同的开发和产品风格productFlavors {// 开发风格dev {// 开发时使用 minSDKVersion = 21 允许 Android Gradle 插件// 为每个 Module 模块产生一个 APK 安装包 , 可以在 Android Lollipop 系统上进行测试// 无需进行耗时的 dex 合并过程minSdkVersion 21}// 产品风格prod {// 应用实际的最小 SDKminSdkVersion 14}}buildTypes {release {multiDexEnabled true// 保留multiDexKeepFile file("dex.keep")minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}dependencies {implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.3.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.4'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'// 使用 Android X 的应用添加该依赖implementation 'pub.devrel:easypermissions:3.0.0'implementation 'com.android.support:multidex:1.0.2'
}





2、dex.keep 配置



kim/hsl/hotfix/MainActivity.class
kim/hsl/hotfix/MyApplication.class









二、 源码资源





源码资源 :


  • GitHub 地址 : https://github.com/han1202012/HotFix
  • CSDN 源码快照 : https://download.csdn.net/download/han1202012/16676099

( update.dex 更新包在源码工程根目录 )


推荐阅读
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • android ... [详细]
  • 近来有一个需求,是需要在androidjava基础库中插入一些log信息,完成这个工作需要的前置条件有编译好的android源码具体android源码如何编译,这 ... [详细]
  • 这两天用到了ListView,写下遇到的一些问题。首先是ListView本身与子控件的焦点问题,比如我这里子控件用到了Button,在需要ListView中的根布局属性上加上下面的这一个属性:and ... [详细]
author-avatar
保定联通员工
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有