Unity方法计数超过64K的限制


20

我刚遇到一个与Unity中的64k方法有关的问题,所以这就是为什么我无法构建项目的原因。它显示方法限制超过了64k方法计数的限制。因此,这里有人可以帮助我解决此问题吗?

Answers:


22

这个答案在很大程度上依赖于Android的官方文档(特别是引用的部分)。


如何为Unity项目设置Multidex支持

什么是Multidex:

Android应用程序(APK)文件包含Dalvik可执行(DEX)文件形式的可执行字节码文件,其中包含用于运行您的应用程序的已编译代码。Dalvik Executable规范将单个DEX文件中可引用的方法总数限制为65,536,包括Android框架方法,库方法和您自己代码中的方法。超过此限制要求您将应用程序构建过程配置为生成多个DEX文件,称为多dex配置。

当我们使用Multidex时:

当我们超出单个DEX文件中可引用的方法总数到65,536(包括Android框架方法,库方法和您自己的代码中的方法)时。

避免64K限制

在配置您的应用程序以允许使用64K或更多方法引用之前,您应采取步骤减少应用程序代码调用的引用总数,包括应用程序代码或包含的库定义的方法。以下策略可以帮助您避免达到DEX参考限制:

查看应用程序的直接和传递依赖关系 -确保以任何方式使用您包含在应用程序中的任何大型库依赖关系,而这些依赖关系要超过添加到应用程序中的代码量。常见的反模式是包括一个非常大的库,因为一些实用程序方法很有用。减少应用程序代码依赖性通常可以帮助您避免DEX参考限制。

使用ProGuard删除未使用的代码 - 启用代码收缩功能以为您的发行版运行ProGuard。启用缩小功能可确保您不会随APK一起发送未使用的代码。

除了这些官方技巧外,在构建Unity项目时,执行以下步骤将进一步帮助您:

  1. 通过Unity编辑器构建一个Android项目。 设置1

  2. 在Android Studio中导入您的Android项目。 第2步

  3. 设置您的应用程序项目以使用多dex配置需要您进行以下修改。

    如果您的minSdkVersion设置为21或更高,则multiDexEnabled只需true在模块级build.gradle文件中将其设置为,如下所示:

    android {
    defaultConfig {
            ...
            minSdkVersion 21 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }

    但是,如果您minSdkVersion将其设置为20或更低,则必须使用multidex支持库,如下所示:

    3.1。修改模块级别的build.gradle文件以启用multidex并将multidex库添加为依赖项,如下所示:

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }

    3.2。根据是否覆盖Application类,执行以下操作之一:

    • 如果您不覆盖Application该类,请按照以下步骤编辑清单文件android:name中的清单文件<application>
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
                android:name="android.support.multidex.MultiDexApplication" >
            ...
        </application>
    </manifest>
    • 如果您确实重写了Application该类,请按如下所示更改它以扩展MultiDexApplication(如果可能):
    public class MyApplication extends MultiDexApplication { ... }
    • 或者,如果您确实重写了Application类,但无法更改基类,则可以改写attachBaseContext()方法并调用MultiDex.install(this)以启用multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. 检查其他插件清单中的错误并清理项目。然后再次执行sysc。

  5. 如果您的项目中存在任何依赖性问题,请在Android Terminal中运行此命令

    % Gradle clean App."App name"
  6. 将这些依赖项复制到Application Gradle中的依赖项下:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
  7. 在主项目Gradle中添加signingConfig。

    步骤8

    或通过手动将“签名”模式设置为“调试”模式,转到“文件”->“项目结构”->“模块”下,单击您的项目,然后在“构建类型”下选择“调试”->“选择签名配置”->“调试”

    在此处输入图片说明

  8. 现在,同步您的Gradle并构建项目。


1
您的项目导致此错误的规模有多大?
Evorlor

1
实际上,我使用的是Google AdMob中介,因此用于添加6-7个广告SDK,因此我的最终项目方法数量约为76000。
拉克什

0

我建议您通过此链接,该链接将帮助您直接通过统一来创建支持Multidex的游戏。

https://medium.com/@abhpatidar/solving-unity-dex-issue-538e134c8809

注意:这只会启用统一的multidex(并应解决multidex问题)。它不会解决gradle相关的问题。


3
当前这是仅链接的答案:尽管该链接回答了问题,但答案没有。您可能希望在此处包括链接内容的核心(链接本身并不坏,包含不好的链接)。
Vaillancourt

我同意你的意见,但是所写的步骤太多了。这就是为什么我必须创建一篇文章并共享链接。我更喜欢这样,以便我将只有一个真理来源,而不是创造多个真理。
Abhishek Patidar

在理解中,但这不是Stack Exchange网站的工作方式:删除仅链接的答案。¤如果您愿意,我可以将此答案转换为对问题的评论:您将使参考对于将来的用户可见,我们赢得了没有仅链接的答案。(¤仅链接问题的主要问题是,如果您关闭站点(或者您的ISP破产了所有数据),则此答案将毫无价值;这就是为什么答案应回答该问题。)
Vaillancourt

说得通。我会将答案转换为完整的说明。
Abhishek Patidar '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.