官方资料: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
- multiDexKeepProguard file(‘multidex-config.pro’)
防止第一步配置的类混淆导致APP启动失败,所配置,如果APP本来就没有混淆,就不用管这个配置了。
#保持这个类不混淆
-keep class com.example.hotfix.MainActivity
#保持这个包下的所有类不混淆
-keep class com.example.** { *; }
运行工程,查看生产的apk文件:
附上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 。 一起分享,一起进步!少划水,多晒干货!!欢迎大家!!!(进群潜水者勿加) |
转载:https://blog.csdn.net/u011733020/article/details/101428055
查看评论