We found an issue on Amazon market
that IAP doesn't work if it's receivers located not in main DEX
file.
The question is how to force gradle
to put specific classes (receivers) into main DEX
file.
EDIT: updated with gradle DEX settings
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--multi-dex'
dx.additionalParameters += "--main-dex-list=class_files.txt"
}
}
dexOptions {
javaMaxHeapSize "4g"
preDexLibraries = false
}
compile('com.android.support:multidex:1.0.0')
Sergii Pechenizkyi's answar only keep some class in main dex , but not generate two dex. Add
--minimal-main-dex
to yourbuilg.gradle
. But this only solve belowgradle1.5.0
. You can use DexKnifePlugin to solve your problem.With Android Plugin for Gradle, Revision 2.2.0 (Released in September 2016) you can use multiDexKeepFile api
Where
multidex_keep_file.txt
is file with single class per line which needs to be explicitly added to the main dexYou can also use
multiDexKeepProguard
to keep whole packageI had the same problem. The main point was that you have to set "minSdkVersion 16" before "multiDexEnabled true" else your Application class could be placed in the second dex and app will crash on android lower 5.0
No need to manually add multi-dex parameters to dex tasks.
This can be automatically handled by the android plugin (since v0.14.0).
Remove both the afterEvaluate section and compile('com.android.support:multidex:1.0.0') from your build.gradle, and instead add this:
The plugin is smart enough to package all the components (receivers among them) in main dex file.