Multidex Android DEX手动拆包

官方资料:https://developer.android.com/studio/build/multidex
分析下tinker 热修复的原理,这里先熟悉一些基本分包的配置

如何将你的程序分包?

1.在App所属的build.gradle里面


android {
     
......
defaultConfig {
     
multiDexEnabled true
......
}
}

2.在你自定义的Application(这个一般项目里面都有)
MultiDex.install(this);//初始化
ok.这两步就搞定了!

如何自定义分包?

基于上面的配置,再进行以下操作即可:
1.
multiDexKeepFile file(‘multidex-config.txt’)// 主dex下面可以放置的 class 文件
设置哪些要放在主dex 包,multidex-config.txt中进行配置

com/example/hotfix/MainActivity.class
com/example/hotfix/MyApplication.class
  1. multiDexKeepProguard file(‘multidex-config.pro’)
    防止第一步配置的类混淆导致APP启动失败,所配置,如果APP本来就没有混淆,就不用管这个配置了。
#保持这个类不混淆
-keep class com.example.hotfix.MainActivity
#保持这个包下的所有类不混淆
-keep class com.example.** {
      *; }

运行工程,查看生产的apk文件:
Multidex Android DEX手动拆包_第1张图片

附上app的gradle完整配置文件

apply plugin: 'com.android.application'

android {
     
    compileSdkVersion 28
    defaultConfig {
     
        applicationId "com.example.hotfix"
        minSdkVersion 18
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
        // 'multidex-config.pro'和build.gradle同一个目录
        multiDexKeepProguard file('multidex-config.pro')
    }
    buildTypes {
     
        release {
     
            multiDexKeepFile file('multidex-config.txt')// 主dex下面可以放置的 class 文件
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
     
            multiDexKeepFile file('multidex-config.txt')// 主dex下面可以放置的 class 文件
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dexOptions {
     
        javaMaxHeapSize "4g"
        preDexLibraries = false
        additionalParameters += '--multi-dex'
        additionalParameters += '--set-max-idx-number=35000'
//每个包内方法数上限(根据实际项目配置这个数,来适配4.0-4.4一些低端机型,因为拆分的dex太大,这些低端机型加载不了dex)
        additionalParameters += '--minimal-main-dex'
    }
}

dependencies {
     
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

multidex带来NoClassDefFoundError?

在为项目配置multidexing 的时候,你可能会在运行的时候看到java.lang.NoClassDefFoundError。这意味着app启动的class不在main dex文件中。要进行手动添加到主dex中。

欢迎爱学习的小伙伴加群一起进步:230274309 。 一起分享,一起进步!少划水,多晒干货!!欢迎大家!!!(进群潜水者勿加)

你可能感兴趣的:(安卓)