android 如何将特定的类放入主DEX文件中?

dba5bblo  于 2023-02-17  发布在  Android
关注(0)|答案(4)|浏览(466)

我们在Amazon市场上发现了一个问题,如果接收器不在主DEX文件中,IAP将无法工作。问题是如何强制gradle将特定类(接收器)放入主DEX文件中。
以下是Gradle DEX设置:

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')
rqenqsqc

rqenqsqc1#

借助Android插件for Gradle修订版2.2.0(2016年9月发布),您可以使用multiDexKeepFile API

android {
    buildTypes {
        debug {
            ...
            multiDexEnabled true
            multiDexKeepFile file('multidex_keep_file.txt')
        }
    }
}

其中multidex_keep_file.txt是每行包含一个类的文件,需要显式添加到主目录中

com/example/MyClass.class
 com/example/MyClass2.class

您还可以使用multiDexKeepProguard来保留整个包

-keep class com.example.** { *; }
zdwk9cvp

zdwk9cvp2#

我也遇到了同样的问题。主要的问题是,你必须在“multiDexEnabled true”之前设置“minSdkVersion 16”,否则你的应用程序类可能会被放置在第二个Dex中,应用程序将在Android Lower 5. 0上崩溃

kyks70gy

kyks70gy3#

不需要手动添加multi-dex参数到dex任务。
这可以由android插件自动处理(从v0.14.0开始)。
从build.gradle中删除 afterEvaluate 部分和 compile('com.android.support:multidex:1.0.0'),并添加以下内容:

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

该插件是足够聪明的包所有的组件(其中接收器)在主要的dex文件。

iyfamqjs

iyfamqjs4#

Sergii Pechenizkyi的答案只是在主dex中保留一些类,而不是生成两个dex。将--minimal-main-dex添加到您的builg.gradle中。但这只能解决gradle1.5.0以下的问题。您可以使用DexKnifePlugin来解决您的问题。

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" 
    dx.additionalParameters += '--minimal-main-dex'
    }
}

相关问题