在使用Android Studio的MultiDex功能时,是否有一种方法可以限制主dex文件中的方法数量?

8
当我像文档所说的那样在Android Studio中启用MultiDex功能时,它自动拆分成两个或更多dex文件。我无法进行配置。而且似乎在主dex文件中,方法数量非常接近极限(65536)。
问题是如何进行配置,使主dex文件中的方法数量减少到一定数量,比如6万。我必须上传apk到亚马逊应用商店,亚马逊的人会向主dex文件中添加一些方法,并使其超过65536的限制。
1个回答

12

dx 工具有以下选项:

  • --minimal-main-dex - 仅将 main-dex-list 中选择的类放入主 dex。
  • --set-max-idx-number - 不文档化的选项,确定单个 dex 文件中方法数量的最大值。

您必须通过在 build.gradle 脚本中指定这两个选项来进行自定义。例如 (来源):

tasks.withType(com.android.build.gradle.tasks.Dex) {    dexTask ->
  def command = [] as List
  command << ' --minimal-main-dex'
  command << ' --set-max-idx-number=50000'
  dexTask.setAdditionalParameters(command)
}

请注意,如果您的主dex文件太大,则这并不能帮助到你。有一些规则来控制哪些类应该放在main dex中。我在这里写了关于它们的博客。

编辑(2016年1月9日):
Android插件的1.5版本不允许向dx添加其他参数,但是似乎将在即将推出的版本中修复此问题


尝试执行时,我遇到以下错误: UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.RuntimeException:--minimal-main-dex:文件未找到 UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.RuntimeException:--set-max-idx-number = 50000:文件未找到 UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.RuntimeException:--output:文件未找到 错误:任务“:app:dexGoogleProdDebug”执行失败。
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\dvltools\jdk1.7.0_79\bin\java.exe''无法正常退出,返回值为1
- BenDroid
看起来我只需要去掉空格: command << '--minimal-main-dex' command << '--set-max-idx-number=50000' - BenDroid
@AlexLipov,你能分享一下build.gradle源码吗?链接好像失效了。 - Manish
@Manish 再次测试,两个链接都正常工作。我没有完整的 build.gradle 文件在线上,只需将片段嵌入到您的构建脚本中即可。如果您有任何问题,请告诉我。 - Alex Lipov
3
看起来亚马逊已将此添加到其官方文档中:https://developer.amazon.com/public/support/submitting-your-app/tech-docs/submitting-an-app-that-references-65000-methods - joecks
更新的亚马逊文档链接:https://developer.amazon.com/docs/app-submission/avoid-compile-errors.html - TalkLittle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接