【问题标题】:How to put specific classes into main DEX file?如何将特定类放入主 DEX 文件?
【发布时间】:2015-07-16 20:44:36
【问题描述】:

我们在Amazon market 上发现了一个问题,即如果 IAP 的接收器不在 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')

【问题讨论】:

  • 请添加 gradle 配置
  • @petey 编辑问题,添加 gradle DEX 相关设置

标签: android gradle amazon dex


【解决方案1】:

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

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

multidex_keep_file.txt 是每行单个类的文件,需要显式添加到主 dex 中

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

您也可以使用multiDexKeepProguard 保留整个包裹

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

【讨论】:

  • 嗨,这个解决方案对我不起作用,你能检查我的问题吗:stackoverflow.com/questions/46600992/…
  • multiDexKeepProguard 部分对我有用。
  • 如果我想使用 multiDexKeepProguard 并从 maindex 中排除某些类,我该怎么办?
【解决方案2】:

我遇到了同样的问题。重点是您必须在“multiDexEnabled true”之前设置“minSdkVersion 16”,否则您的应用程序类可以放在第二个 dex 中,并且应用程序将在 android 低于 5.0 时崩溃

【讨论】:

  • 你能链接到官方文档吗?
【解决方案3】:

dex任务无需手动添加多dex参数。
这可以由 android 插件(自 v0.14.0 起)自动处理。

从 build.gradle 中删除 afterEvaluate 部分和 compile('com.android.support:multidex:1.0.0'),然后添加以下内容:

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

该插件足够智能,可以将所有组件(其中的接收器)打包在 main dex 文件中。

【讨论】:

    【解决方案4】:

    Sergii Pechenizkyi 的 answar 仅在 main 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'
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2016-09-29
      • 2019-07-23
      相关资源
      最近更新 更多