Unity 메소드 수가 64K 제한을 초과


20

방금 Unity에서 64k 메소드와 관련된 문제가 발생하여 프로젝트를 빌드 할 수 없습니다. 방법 제한이 64k 방법 수 제한을 초과 함을 나타냅니다. 그래서 여기 누구 든지이 문제를 해결하는 데 도움이 될 수 있습니까?

답변:


22

이 답변은 안드로이드의 공식 문서 (특히 인용 부분) 에 크게 의존합니다 .


Unity 프로젝트에 대한 멀티 덱스 지원을 설정하는 방법

멀티 덱스 란?

Android 애플리케이션 (APK) 파일에는 앱을 실행하는 데 사용되는 컴파일 된 코드가 포함 된 DEX (Dalvik Executable) 파일 형식의 실행 가능 바이트 코드 파일이 포함되어 있습니다. Dalvik Executable 스펙은 단일 DEX 파일 내에서 참조 할 수있는 총 메소드 수를 Android 프레임 워크 메소드, 라이브러리 메소드 및 사용자 고유 코드의 메소드를 포함하여 65,536으로 제한합니다. 이 제한을 초과하려면 멀티 덱스 구성이라고하는 둘 이상의 DEX 파일을 생성하도록 앱 빌드 프로세스를 구성해야합니다.

Multidex를 사용할 때 :

단일 DEX 파일 내에서 참조 할 수있는 총 메서드 수를 Android 프레임 워크 메서드, 라이브러리 메서드 및 사용자 코드의 메서드를 포함하여 65,536-까지 초과하는 경우.

64K 제한을 피하십시오

64K 이상의 메서드 참조를 사용하도록 앱을 구성하기 전에 앱 코드 또는 포함 된 라이브러리에서 정의한 메서드를 포함하여 앱 코드에서 호출하는 총 참조 수를 줄이는 단계를 수행해야합니다. 다음 전략은 DEX 기준 한계에 도달하지 않도록 도와줍니다.

앱의 직접적 및 전 이적 종속성 검토 -앱에 포함하는 큰 라이브러리 종속성이 앱에 추가되는 코드의 양보다 큰 방식으로 사용되는지 확인하십시오. 일반적인 안티 패턴은 몇 가지 유틸리티 방법이 유용했기 때문에 매우 큰 라이브러리를 포함하는 것입니다. 앱 코드 종속성을 줄이면 DEX 참조 제한을 피하는 데 도움이 될 수 있습니다.

ProGuard로 사용하지 않는 코드 제거 - 릴리스 빌드에 대해 ProGuard를 실행하려면 코드 축소활성화하십시오 . 축소를 사용하면 APK와 함께 사용하지 않는 코드를 제공하지 않습니다.

이 공식 팁 외에도 Unity 프로젝트를 빌드 할 때 다음 단계를 수행하면 추가 도움이됩니다.

  1. Unity 에디터에서 Android 프로젝트를 빌드하십시오. 셋 1

  2. Android Studio에서 Android 프로젝트를 가져옵니다. 2 단계

  3. 멀티 덱스 구성을 사용하도록 앱 프로젝트를 설정하려면 다음을 수정해야합니다.

    minSdkVersion이 21 이상으로 설정 되면 다음과 같이 모듈 수준 build.gradle 파일에서 설정 multiDexEnabled하면 true됩니다.

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

    그러나 minSdkVersion20 이하로 설정되어 있으면 다음과 같이 멀티 덱스 지원 라이브러리를 사용해야합니다.

    3.1. 다음과 같이 모듈 수준 build.gradle 파일을 수정하여 멀티 덱스를 활성화하고 멀티 덱스 라이브러리를 종속성으로 추가하십시오.

    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)를 호출하여 멀티 덱스를 활성화 할 수 있습니다.
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. 다른 플러그인 매니페스트에서 오류를 확인하고 프로젝트를 정리하고 sysc를 다시 청소하십시오.

  5. 프로젝트에 종속성 문제가있는 경우 Android 터미널에서이 명령을 실행하십시오.

    % 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를 추가하는 데 사용되므로 최종 프로젝트 방법 수는 약 76k입니다.
Rakesh

0

이 링크를 통해 유니 덱스를 통해 멀티 덱스 지원 게임을 직접 만들 수 있습니다.

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

참고 : 이렇게하면 멀티 덱스 자체 만 가능하며 멀티 덱스 문제를 해결해야합니다. gradle 관련 문제는 해결되지 않습니다.


3
이것은 현재 링크 전용 답변입니다. 링크 가 질문에 답변 하지만 답변 이 없습니다. 당신은 여기에 링크 된 내용의 핵심을 포함 할 수 있습니다 (그 자체로 링크가 나쁘지 않다, 그냥 참입니다 나쁜 링크).
Vaillancourt

동의하지만 작성된 단계가 너무 많습니다. 그렇기 때문에 기사를 작성하고 링크를 공유해야했습니다. 나는 그 방법을 선호하여 여러 개를 만드는 것이 아니라 단 하나의 진실의 근원을 갖게 될 것입니다.
Abhishek Patidar

이해하지만 스택 Exchange 사이트의 작동 방식은 아닙니다. 링크 전용 답변이 삭제됩니다. 원하는 경우이 답변을 질문에 대한 의견으로 변환 할 수 있습니다. 향후 사용자에게 참조가 계속 표시되도록하겠습니다. 링크 전용 답변이 없습니다. (¤ 링크 전용 답변의 주된 문제는 사이트를 중단하거나 ISP가 모든 데이터로 파산하면이 답변은 전혀 가치가 없으므로 답변이 질문에 답변해야하는 이유입니다.
Vaillancourt

이해하세요 답변을 완성하여 지침을 완성 할 것입니다.
Abhishek Patidar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.