2016-09-22 120 views
8

我正在按照Android官方网站的建议将我所有的源代码移动到AS。但是,这个经历并不是很好。这是非常缓慢的描述here。但现在这不是我最终的问题。Eclipse到Android Studio导入

我已经解决了许多问题,如更新这样的compileSdkVersion到使错误:

Error:(13) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Inverse'.

可以纠正。但是,随着我的离去,问题一直在增加。现在我有这个64k Dex的问题。

Error:The number of method references in a .dex file cannot exceed 64K. Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html

我在使用Eclipse时从未遇到这个Dex问题。 AS中的源代码与Eclipse中的源代码完全相同。唯一的区别是仅需要在AS上工作的那些gradle更改。任何想法为什么这突然Dex问题?如果我将multiDexEnabled设置为true,会有什么影响?

+2

不幸的是(我知道这并不是真的有用),迁移过程令人费解,部分原因在于gradle和项目结构的变化。 Gradle很可能会引入新的“问题”。我会建议看看这里https://developer.android.com/studio/build/multidex.html – zgc7009

+2

看看你的依赖关系。几年前,我在一个项目中遇到了64k dex问题,发现我包含了非常大且不需要全部的依赖关系。当我第一次使用它时,我有点被gradle和AS studio关掉,但现在,后来的版本进行了热部署,我可以改变UI代码,点击调试按钮,并在一些模拟器上运行它秒。 Eclipse中永远不会发生的事情。 –

+1

您可能会发现这篇[文章](https://mutualmobile.com/posts/dex-64k-limit-not-problem-anymore-almost)有帮助,我认为以前的建议是从中吸取的。如果您需要审计项目,他们会创建一个[dexinfo gradle插件](https://mutualmobile.com/posts/introducing-our-dexinfo-gradle-plugin)来帮助完成该过程。 – light

回答

1

我怀疑你的DEX错误是图书馆的增长的结果,但没有更多信息,这是很难调试。最新版本的Android Studio(2.2)提供了一个APK分析器工具,使dex限制更加透明。

使用谷歌播放服务API,你应该仔细检查,以确保你只包括这些指令 compile 'com.google.android.gms:play-services-fitness:9.6.1' ,而不是包括一切(full list)所使用的那些。

如果您需要所有依赖的库,那么通常通过在开发环境中启用multidex来解决此问题(需要使用L或更高版本的设备或模拟器进行开发),但在发布时使用minificationEnabled构建这样的multidex不需要在您的发布APK中。这会导致快速调试版本和非multidex版本版本的组合,以防止发布版本的启动时间变慢。

更多信息: 当您在调试版本中使用本机multidex时(要求minSdk设置为L或更大),它会导致更快的增量构建,因为模块和库部署为单独的dex文件,部署之间的处理更少。

当您在发布版本中使用minificationEnabled时,通常会消除对第二个dex文件的需求,因为您不使用的依赖关系中的方法会被修剪。这通常会导致单个dex消除multidex的负面影响(将N + 1个dex文件复制到<版本L设备的应用程序初始化)。

+0

迄今为止最好的答案。 (除非更好的答案在22小时内出现,这个答案值得奖励。)谢谢。 ;) – user1506104

2

首先,确保在导入之后重建项目(Build - Clean,Builde - Rebuild Probject)。解决这个问题的限制方法参考:

android { 

    defaultConfig { 
     ... 

     // Enabling multidex support. 
     multiDexEnabled true 
    } 
    ... 
    } 

    dependencies { 
     compile 'com.android.support:multidex:1.0.0' 
} 

而且还更新你在java中的Application.class以支持MultiDex。查看完整信息here

UPDATE:

此选项忽略Eclipse的,因为方法的引用限制可以从计算环境(如在我们的情况下)。为什么这个选项不包含在Gradle编译中 - 仍然存在问题...

Android应用程序(APK)文件包含Dalvik Executable(DEX)文件形式的可执行字节码文件,其中包含用于运行您的编译代码应用程序。 Dalvik Executable规范将单个DEX文件中可引用的方法总数限制为65,536,包括您自己代码中的Android框架方法,库方法和方法。在计算机科学中,Kilo这个术语表示1024(或2^10)。由于65,536等于64 X 1024,因此此限制称为“64K参考极限”。

Source AS Doc

+0

你知道为什么在AS中这个突然的Dex问题? – user1506104

+0

@ user1506104更新的问题。 – GensaGames

+0

谢谢。给你upvote。 – user1506104

1

Multidex问题,当您在项目中使用大量库发生。如果你的应用程序的代码有超过64k的方法,那么它就会发生。

When your application and the libraries it references reach a certain size, you encounter build errors that indicate your app has reached a limit of the Android app build architecture.

您可以参考像一些链接:

How to enable multidexing with the new Android Multidex support library

http://www.rapidvaluesolutions.com/tech_blog/multidex-issue-or-building-application-over-65k-methods/

https://mutualmobile.com/posts/dex-64k-limit-not-problem-anymore-almost

相关问题