如前所述,您的项目和库中有太多方法(超过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.+'
}
子库的完整列表及其职责可以在Google官方文档中找到。
更新:自支持库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构建文件中(该文件取自具有超过65k方法的应用程序的官方google文档):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
第二步是准备您的Application类,或者如果您不扩展Application,请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
在构建阶段遇到异常,则可以使用
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
这会将堆设置为4 GB。
有关dex堆内存问题的更多详细信息,请参见此问题。
分析问题的根源
为了分析方法的来源,gradle插件 https://github.com/KeepSafe/dexcount-gradle-plugin可以与gradle提供的依赖树结合使用,例如,
.\gradlew app:dependencies
有关Android中方法计数的更多信息,请参见此答案和问题