如前所述,您的项目和库中有太多方法(超过 65k)。
预防问题:使用 Play Services 6.5+ 和 support-v4 24.2+ 减少方法数量
由于 Google Play 服务通常是其20k+ 方法“浪费”方法的主要嫌疑人之一。Google Play 服务版本 6.5 或更高版本,您可以使用许多较小的客户端库在您的应用程序中包含 Google Play 服务。例如,如果您只需要 GCM 和地图,您可以选择仅使用这些依赖项:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
子库的完整列表及其职责可以在官方谷歌文档中找到。
更新:自支持库 v4 v24.2.0 以来,它被分成以下模块:
support-compat
, support-core-utils
,和support-core-ui
_support-media-compat
support-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
但是请注意,如果您使用support-fragment
,它将依赖于所有其他模块(即,如果您使用android.support.v4.app.Fragment
没有任何好处)
请参阅此处 support-v4 lib 的官方发行说明
启用 MultiDexing
由于 Lollipop(又名构建工具 21+)它很容易处理。该方法是解决每个 dex 文件 65k 个方法的问题,为您的应用程序创建多个 dex 文件。将以下内容添加到您的 gradle 构建文件中(取自官方 google doc on applications with more than 65k methods):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
第二步是准备您的应用程序类,或者如果您不扩展应用程序,MultiDexApplication
请在您的 Android 清单中使用:
要么将此添加到您的 Application.java
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
或使用 mutlidex 库中提供的应用程序
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
使用 MultiDex 防止 OutOfMemory
作为进一步的提示,如果您OutOfMemory
在构建阶段遇到异常,您可以使用
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
这会将堆设置为 4 GB。
有关 dex 堆内存问题的更多详细信息,请参阅此问题。
分析问题的根源
要分析方法的来源,gradle 插件 https://github.com/KeepSafe/dexcount-gradle-plugin可以帮助结合 gradle 提供的依赖关系树,例如
.\gradlew app:dependencies
有关 android 中方法计数的更多信息,请参阅此答案和问题