Closed TwoSX closed 6 years ago
看看MultiDex的maindex规则是不是被覆盖了?查一下MultiDex的keep in maindex的配置方法或者直接用DexKnife插件把tinker的loader类都分到主dex吧。
gradle 为3.0.1,DexKnife貌似不支持, 在minSdkVersioin>=21, gradle为3.0.1下可以通过配置dexOptions参数来指定tinker相关类打包至main dex
dexOptions {
preDexLibraries = false
javaMaxHeapSize "4g" //增加java堆内存大小
additionalParameters = [//dex参数详见 dx --help
'--multi-dex',//多分包
'--set-max-idx-number=60000',//每个包内方法数上限
'--main-dex-list='+projectDir+'/maindexlist.txt',//打包进主classes.dex的文件列表
'--minimal-main-dex'//使上一句生效
]
}
gradle 为3.0.1,DexKnife貌似不支持, 在minSdkVersioin>=21, gradle为3.0.1下可以通过配置dexOptions参数来指定tinker相关类打包至main dex
dexOptions { preDexLibraries = false javaMaxHeapSize "4g" //增加java堆内存大小 additionalParameters = [//dex参数详见 dx --help '--multi-dex',//多分包 '--set-max-idx-number=60000',//每个包内方法数上限 '--main-dex-list='+projectDir+'/maindexlist.txt',//打包进主classes.dex的文件列表 '--minimal-main-dex'//使上一句生效 ] }
亲测可用,但是为什么按照android官网配置主dex里边的类不生效呢?请问你有遇到过么
gradle plugin 升级到3.3.1,上述配置就无效了~如何破
你是不是直接在AS中点击的Run按钮运行的Base包?然后看包结构Tinker的loader始终在classes2.dex中,有没有尝试在app module下写一个maindexlist.txt,
<<****你自己的Application.class>>
<<*****TinkerApplicationLike.class>>
com/tencent/tinker/loader/hotplug/ActivityStubs$SIStub_01
com/tencent/tinker/loader/shareutil/ShareResPatchInfo
com/tencent/tinker/loader/SystemClassLoaderAdder$V23
com/tencent/tinker/loader/hotplug/ActivityStubManager
com/tencent/tinker/loader/shareutil/ShareOatUtil$1
com/tencent/tinker/loader/shareutil/ShareOatUtil
com/tencent/tinker/loader/shareutil/SharePatchFileUtil
com/tencent/tinker/loader/shareutil/ShareFileLockHelper
com/tencent/tinker/loader/hotplug/ActivityStubs$SGTKStub_04
com/tencent/tinker/loader/TinkerDexOptimizer$StreamConsumer$1
com/tencent/tinker/loader/TinkerDexLoader
com/tencent/tinker/loader/hotplug/ActivityStubs$STDStub_06
.....等等等
然后:【方式1】:
dexOptions {
jumboMode = true
// preDexLibraries = false
javaMaxHeapSize "2g" //增加java堆内存大小
additionalParameters = ['--multi-dex','--set-max-idx-number=60000','--main-dex-list='+projectDir+'/maindexlist.txt', '--minimal-main-dex']
additionalParameters = ['--set-max-idx-number=65000', '--num-threads=4', '--minimal-main-dex']
}
【方式2】:
buildTypes {
debug {
debuggable true
minifyEnabled false
multiDexKeepFile file('maindexlist.txt')
// signingConfig signingConfigs.debug
}
release {
multiDexKeepFile file("maindexlist.txt")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
最后发现两个方式都不好用,dex的包中依然把Tinker的load放到了classes2.dex中,最后甚至dexKnife都用上了,还是会报错。
【我的解决方式如下,核心思想:用命令行去打包!!!!!!举例是debug包】: 1.生成Base包用:./gradlew assembleDebug 2.生成Patch包用:./gradlew tinkerPatchDebug ps:1.7.6版本后的话,不用刻意去设置app下build.gradle中的loader;
ps:另外,注意手机读写动态权限的申请!!!否则会让你很挠头,找不到问题所在。
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},12); //8.0需要动态权限申请
gradle plugin 升级到3.3.1,上述配置就无效了~如何破
有完整的解决方案么?
核心
在minSdk>=21时 没有效果 啥都没生成
看看MultiDex的maindex规则是不是被覆盖了?查一下MultiDex的keep in maindex的配置方法或者直接用DexKnife插件把tinker的loader类都分到主dex吧。
在minSdk>=21时 没有效果 啥都没生成
目前使用的版本是最新版本可以在tinkerPatch{}的文件下新增allowLoaderInAnyDex =true 和 removeLoaderForAllDex = true 和ignoreWarning放在同级 亲测minSDK =21可用
我加了这个, 先绕过。
打补丁包时提示了
ignoreWarning is false, but we found loader classes are found in old secondary dex.
。查看了 Issues 跟自己 google了一些dex分包知识,尝试了部分解决方法,还是报错。麻烦大家帮忙看下,提供下方法,谢谢。查看了 apk 中 的 classes2.dex,发现 application类 跟 tinker类都在里面。