我遇到了这个问题,在编译我使用的所有库时,我在Dalvik 中溢出 64k方法限制。当我导入支持库时,我开始遇到这个问题,因为有些已经包含在其他库中,它最终溢出了限制。
目前,我已将我所知道的人排除在外,但手动执行此操作似乎很奇怪。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:multidex:1.0.1'
compile "com.android.support:percent:${supportLibVersion}"
compile("com.android.support:design:${supportLibVersion}") {
exclude module: 'support-v4'
}
compile("com.android.support:cardview-v7:${supportLibVersion}") {
exclude module: 'support-v4'
}
compile('com.github.nkzawa:socket.io-client:0.4.1') {
exclude group: 'org.json', module: 'json'
}
compile('com.astuetz:pagerslidingtabstrip:1.0.1') {
exclude module: 'support-v4'
}
//...
}
第1步
在build.gradle
中添加MultiDex支持库的依赖项dependencies {
...
compile 'com.android.support:multidex:'
...
}
第2步
通过在gradle配置的buildType或productFlavor部分设置multiDexEnabled标志来启用multi-dexing。
defaultConfig {
...
multiDexEnabled true
...
}
现在,根据您的项目,您有3个选项:
如果您尚未创建自己的Application类,只需在android.support.multidex.MultiDexApplication
AndroidManifest.xml
声明为您的应用程序类
....
android:name="android.support.multidex.MultiDexApplication"
...
如果您已拥有自己的Application类,请将其扩展为android.support.multidex.MultiDexApplication
而不是android.app.Application
如果您的Application类正在扩展其他类并且您不想或不能更改它,请覆盖attachBaseContext(),如下所示:
public class MyApplication extends FooApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
答案 0 :(得分:10)
您可以打开终端并运行命令 gradlew app:dependencies ,以测试其他依赖项已包含在其他依赖项中作为项目的传递依赖项以及每个项目的相应版本。
例如,我为我使用的com.android.support:design库中的一个项目获得了以下依赖关系图:
+--- com.android.support:design:23.3.0
| +--- com.android.support:appcompat-v7:23.3.0
| | +--- com.android.support:support-vector-drawable:23.3.0
| | | \--- com.android.support:support-v4:23.3.0
| | | \--- com.android.support:support-annotations:23.3.0
| | +--- com.android.support:animated-vector-drawable:23.3.0
| | | \--- com.android.support:support-vector-drawable:23.3.0 (*)
| | \--- com.android.support:support-v4:23.3.0 (*)
| +--- com.android.support:support-v4:23.3.0 (*)
| \--- com.android.support:recyclerview-v7:23.3.0
| +--- com.android.support:support-v4:23.3.0 (*)
| \--- com.android.support:support-annotations:23.3.0
答案 1 :(得分:6)
嘿,你可以尝试我的技巧,它可能对你有用
首先,您应该避免使用外部库。就像在库中具有相同的依赖关系一样。因此,尝试将该库与Android应用程序代码合并。 由于这为方法节省了很多空间。
使用有用的依赖项和库,例如,如果您想要Google Play服务,那么只包括有用的服务。参见示例
compile "com.google.android.gms:play-services-location:9.4.0"
compile "com.google.android.gms:play-services-maps:9.4.0"
避免这个
compile 'com.google.android.gms:play-services:9.4.0'
删除不需要的依赖项。在代码中使用非常可选择的依赖项。
如果所有方法都不能正常工作,那么请在代码中使用multidex。但它会创建多个dex文件。因此,您的代码将花费大量时间进行编译。
谢谢希望这会对你有所帮助。
答案 2 :(得分:4)
defaultConfig
{
multiDexEnabled true
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
并将此方法添加到您的应用程序类
中@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
MultiDex.install(this);
}
答案 3 :(得分:2)
点击文件然后点击项目结构点击弹出窗口左下方的应用。您将看到多个标签点击依赖关系标签然后点击右侧的加号选择图书馆依赖搜索您的欲望图书馆它将显示那些图书馆可在IDE中使用
答案 4 :(得分:2)
尽管使用Multidex Support Library库解决了这个问题,但它并不完美。要做的第一件事应该是确定您的应用程序当前有多少方法,以及每个依赖项添加了多少方法。之前您必须手动执行此操作,但现在有许多工具可供使用:
‘compile’
语句即可告诉您方法计数,依赖关系,JAR大小和DEX大小。无论您最终使用什么工具,都要使用它的信息 提供对您的应用程序的依赖项执行审计。你应该 寻找未使用的库或可以最小化甚至是最小的库 替换为您自己更简单的解决方案。如果您没有使用
Proguard
删除未使用的代码,首先启用它,看看它是否解决了 问题(检查this)。使用Proguard
很好......不好玩,但是一旦你成功了 它工作正常,它将显着减少方法数量。我摔倒 否则失败,您将不得不使用MultiDex支持库。
查看gradle任务以删除Google Play服务库上未使用的包。
<强>结论强>
虽然Multidex Support Library
在大多数情况下解决了DEX 64K问题,但应将其视为最后的手段。在尝试使用它之前,您应该审核项目是否存在不需要的依赖项,并使用ProGuard
删除尽可能多的未使用的代码。如果您继续使用它,请确保在旧设备上测试您的应用程序。
希望这会对你有所帮助。