如前所述,在项目和库中有太多的方法(超过65k)。
预防问题:使用Play Services 6.5+和support-v4 24.2+减少方法的数量
因为谷歌Play服务经常是“浪费”方法的主要嫌疑人之一,它的20k+方法。谷歌播放服务6.5或更高版本,您可以使用一些较小的客户端库在应用程序中包含谷歌播放服务。例如,如果你只需要GCM和map,你可以选择只使用这些依赖项:
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。片段没有任何好处)
请参阅support-v4 lib的官方发布说明
使MultiDexing
因为棒棒糖(又名构建工具21+)非常容易处理。方法是解决每个dex文件有65k个方法的问题,为你的应用程序创建多个dex文件。将以下内容添加到你的gradle构建文件中(这来自于谷歌官方文档中超过65k个方法的应用程序):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
第二步是准备你的应用程序类,或者如果你不扩展应用程序,在你的Android Manifest中使用MultiDexApplication:
或者将其添加到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"
}
}
这将把堆设置为4gb。
有关dex堆内存问题的更多详细信息,请参阅此问题。
分析问题的根源
为了分析这些方法的来源,gradle插件https://github.com/KeepSafe/dexcount-gradle-plugin可以与gradle提供的依赖树相结合。
.\gradlew app:dependencies
有关android中方法计数的更多信息,请参阅此回答和问题