将Eclipse项目导入Android Studio

8
我正在按照Android官网的建议将所有源代码迁移到AS。然而,这种体验并不是很好,就像这里所描述的那样。但这并不是我现在的最终问题。
我已经解决了许多问题,例如将compileSdkVersion更新为23,以便可以纠正99个此类错误:

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中永远不可能发生的。 - Gary Bak
1
你可能会发现这篇文章很有帮助,我认为之前的建议都是从中得出的。如果你需要审计你的项目,他们创建了一个dexinfo gradle插件来帮助这个过程。 - light
3个回答

2
首先,在导入后请确保重新构建项目(Build - Clean,Build - Rebuild Project)。修复此问题的方法是限制方法引用。
android {

    defaultConfig {
        ...

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

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

并且在Java中更新您的Application.class以支持MultiDex。 在这里查看完整信息here

更新:

在Eclipse上忽略此选项,因为方法引用限制可以从环境(如我们的情况下的AS)计算出来。 为什么这个选项不包括在Gradle构建中-仍然是个问题...

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

Source AS Doc


你知道为什么AS突然出现了Dex问题吗? - user1506104
@user1506104 更新了问题。 - GensaGames

1
当您在项目中使用大量库时,可能会出现Multidex问题。如果您的应用程序代码具有超过64k个方法,则会发生这种情况。

当您的应用程序及其引用的库达到一定大小时,您会遇到构建错误,表明您的应用程序已达到Android应用程序构建架构的限制。

您可以参考一些链接,例如:

如何使用新的Android Multidex支持库启用multidexing

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


1
我怀疑你的dex错误是库增长的结果,但没有更多信息,这很难调试。Android Studio的最新版本(2.2)提供了一个APK分析器工具,使dex限制更加透明。
在使用Google Play服务API时,您应该仔细检查确保只包括这些指令所使用的内容: compile 'com.google.android.gms:play-services-fitness:9.6.1' 而不是包含所有内容(完整列表)。
如果您需要所有已依赖的库,则通常通过在开发环境中启用multidex(需要使用L或更高版本的设备或模拟器进行开发),然后在发布构建中使用minificationEnabled,以使multidex不需要在您的发布APK中。这将导致快速调试构建和非multidex发布构建的组合,以防止发布构建的慢启动时间。
更多信息: 当您在调试构建中使用本地multidex(需要将minSdk设置为L或更高版本)时,它会产生更快的增量构建,因为模块和库部署为单独的dex文件,并且在部署之间的处理较少。
当你在发布版本中使用minificationEnabled时,它通常会消除第二个dex文件的需要,因为来自依赖项的未使用方法被修剪掉了。这通常会导致一个单一的dex文件抵消multidex的负面影响(在<版本L的设备上,在应用程序初始化时复制N+1个dex文件)。

目前为止,这是最好的答案。(除非在22小时内出现更好的答案,否则此答案值得获得悬赏。)谢谢。;) - user1506104

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接