前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 热修复】热修复原理 ( 多 Dex 打包机制 | 多 Dex 支持 | Dex 分包设置 | 开发和产品风格设置 | 源码资源 )

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

作者头像
韩曙亮
发布2023-03-29 09:43:05
8530
发布2023-03-29 09:43:05
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、Dex 打包设置


【Android 热修复】热修复原理 ( 类加载机制 | PathClassLoader 加载 Dex 机制 | PathDexList 查找 Class 机制 | 类查找的顺序机制 )三、 类查找的顺序机制 博客章节有讲解到 , Android 类加载时 , 必须进行分包操作 , 必须有

1

个主包 , 若干其它分包 , 主包中只包含应用启动少量代码 , 如 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 ,

代码语言:javascript
复制
android {
    defaultConfig {
        multiDexEnabled true
    }

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

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

代码语言:javascript
复制
public class MyApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        MultiDex.install(base);
        super.attachBaseContext(base);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

2、Dex 分包设置

规则语法 :

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

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

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

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

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

代码语言:javascript
复制
kim/hsl/hotfix/MainActivity.class
kim/hsl/hotfix/MyApplication.class

build.gradle 配置 :

代码语言:javascript
复制
android {
    buildTypes {
        release {
            // 保留
            multiDexKeepFile file("dex.keep")
        }
    }
}

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

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

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

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

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

代码语言:javascript
复制
android {
    defaultConfig {
        // 维度版本号
        flavorDimensions "1.0"
    }

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

二、完整 build.gradle 配置


1、build.gradle 配置

代码语言:javascript
复制
plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "kim.hsl.hotfix"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "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 {
            // 应用实际的最小 SDK
            minSdkVersion 14
        }
    }

    buildTypes {
        release {
            multiDexEnabled true

            // 保留
            multiDexKeepFile file("dex.keep")

            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility 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 配置

代码语言:javascript
复制
kim/hsl/hotfix/MainActivity.class
kim/hsl/hotfix/MyApplication.class

二、 源码资源


源码资源 :

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、Dex 打包设置
    • 1、多 Dex 支持
      • 2、Dex 分包设置
        • 3、开发和产品风格设置 ( 非必须 )
        • 二、完整 build.gradle 配置
          • 1、build.gradle 配置
            • 2、dex.keep 配置
            • 二、 源码资源
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档