Liczba metod Unity przekracza limit 64 KB

20

Właśnie dostałem problem związany z metodą 64k w Unity, dlatego nie mogę zbudować swojego projektu. Pokazuje ograniczenie metody przekraczające limit liczby metod 64k. Czy ktoś może mi pomóc w rozwiązaniu tego problemu?

Rakesh
źródło

Odpowiedzi:

22

Ta odpowiedź zależy w dużej mierze od oficjalnej dokumentacji Androida (w szczególności cytowanych części).


Jak skonfigurować obsługę Multidex dla Unity Project

Co to jest Multidex:

Pliki aplikacji na Androida (APK) zawierają wykonywalne pliki kodu bajtowego w postaci plików wykonywalnych Dalvik (DEX), które zawierają skompilowany kod użyty do uruchomienia aplikacji. Specyfikacja pliku wykonywalnego Dalvik ogranicza całkowitą liczbę metod, do których można odwoływać się w pojedynczym pliku DEX, do 65 536, w tym metod frameworku Androida, metod bibliotecznych i metod we własnym kodzie. Przekroczenie tego limitu wymaga skonfigurowania procesu kompilacji aplikacji w celu wygenerowania więcej niż jednego pliku DEX, znanego jako konfiguracja wielu dexów.

Kiedy używamy Multidex:

Kiedy przekroczymy całkowitą liczbę metod, które mogą się odnosić w jednym pliku DEX, do 65 536 - w tym metody frameworku Android, metody biblioteczne i metody we własnym kodzie.

Unikaj limitu 64 KB

Przed skonfigurowaniem aplikacji w celu umożliwienia używania odwołań do metod o wielkości 64 KB lub więcej, należy podjąć kroki w celu zmniejszenia całkowitej liczby odwołań wywoływanych przez kod aplikacji, w tym metod zdefiniowanych przez kod aplikacji lub dołączone biblioteki. Następujące strategie mogą pomóc uniknąć przekroczenia limitu odniesienia DEX:

Przejrzyj bezpośrednie i przechodnie zależności aplikacji - upewnij się, że wszelkie duże zależności biblioteki zawarte w aplikacji są używane w sposób, który przewyższa ilość kodu dodawanego do aplikacji. Powszechnym anty-wzorcem jest dołączanie bardzo dużej biblioteki, ponieważ użyteczne było kilka metod narzędziowych. Zmniejszenie zależności kodu aplikacji może często pomóc w uniknięciu limitu odniesienia DEX.

Usuń nieużywany kod za pomocą ProGuard - Włącz zmniejszanie kodu, aby uruchomić ProGuard dla kompilacji wersji. Włączenie zmniejszania zapewnia, że ​​nie wysyłasz nieużywanego kodu z pakietami APK.

Oprócz tych oficjalnych wskazówek, budując projekt Unity, następujące kroki pomogą ci dalej:

  1. Zbuduj projekt na Androida z edytora Unity. Setp 1

  2. Zaimportuj swój projekt Android w Android Studio. Krok 2

  3. Skonfigurowanie projektu aplikacji do korzystania z konfiguracji multi dex wymaga dokonania następujących modyfikacji.

    Jeśli minSdkVersion jest ustawiony na 21 lub wyższy, wszystko co musisz zrobić, to ustawić multiDexEnabled, aby truew pliku build.gradle moduł poziomu, jak pokazano poniżej:

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

    Jeśli jednak masz minSdkVersionustawioną wartość 20 lub niższą, musisz użyć biblioteki obsługi multidex w następujący sposób:

    3.1 Zmodyfikuj plik build.gradle na poziomie modułu, aby włączyć multidex i dodaj bibliotekę multidex jako zależność, jak pokazano tutaj:

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

    3.2 W zależności od tego, czy przesłonisz klasę aplikacji, wykonaj jedną z następujących czynności:

    • Jeśli nie zastąpisz Applicationklasy, edytuj plik manifestu, aby ustawić go android:namew <application>znaczniku w następujący sposób:
    <?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>
    
    • Jeśli przesłonisz Applicationklasę, zmień ją, aby rozszerzyć MultiDexApplication (jeśli to możliwe) w następujący sposób:
    public class MyApplication extends MultiDexApplication { ... }
    • Lub jeśli przesłonisz klasę aplikacji, ale nie można zmienić klasy podstawowej, możesz zamiast tego zastąpić metodę attachBaseContext () i wywołać MultiDex.install (this), aby włączyć multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
    
  4. Sprawdź błąd z manifestu innych wtyczek i wyczyść projekt. Ponownie sysc.

  5. Jeśli w projekcie występuje jakikolwiek problem z zależnością, uruchom to polecenie w terminalu Android

    % Gradle clean App."App name"
  6. Skopiuj te zależności do klasy aplikacji, w zależnościach:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
    
  7. Dodaj signingConfig w swoich głównych projektach Gradle.

    Krok 8

    Lub ustaw tryb podpisywania w tryb debugowania ręcznie, przejdź do Plik -> Struktura projektu -> W modułach Kliknij swój projekt iw obszarze Typy kompilacji wybierz Debuguj -> wybierz Konfiguracja podpisywania-> debuguj

    wprowadź opis zdjęcia tutaj

  8. Teraz zsynchronizuj Gradle i skompiluj projekt.

Rakesh
źródło
1
Jak duży jest Twój projekt, który doprowadził do tego błędu?
Evorlor,
1
Właściwie używam zapośredniczenia Google AdMob, więc do tego służy dodanie 6-7 reklam SDK, więc moja końcowa liczba metod w projektach wyniosła około 76 tys.
Rakesh,
0

Poleciłbym przejść przez ten link, który pomoże ci tworzyć gry obsługujące wiele filmów bezpośrednio przez jedność.

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

Uwaga: To włączy multideks tylko w samej jedności (i powinno rozwiązać problemy z multideksami). Nie rozwiąże problemów związanych z gradem.

Abhishek Patidar
źródło
3
Jest to obecnie odpowiedź tylko do linku : chociaż link odpowiada na pytanie, odpowiedź nie. Możesz tu dołączyć rdzeń połączonej treści (link jako taki nie jest zły, jest tylko linkiem, który jest zły).
Vaillancourt
Zgadzam się z tobą, ale napisane kroki są zbyt liczne. Dlatego musiałem stworzyć artykuł i udostępnić link. Wolałbym w ten sposób, aby mieć tylko jedno źródło prawdy, niż tworzyć wiele.
Abhishek Patidar
Rozumiem, ale nie tak działają witryny Stack Exchange: odpowiedzi tylko z łączem zostaną usunięte. ¤ Jeśli chcesz, mogę przekonwertować tę odpowiedź na komentarz do pytania: zachowaj referencje dla przyszłych użytkowników, a my wygraliśmy nie ma tylko linku. (¤ Główny problem z odpowiedziami zawierającymi tylko łącze polega na tym, że jeśli zdejmiesz witrynę (lub Twój bankrut zbankrutuje wszystkimi twoimi danymi), ta odpowiedź będzie całkowicie bezwartościowa; dlatego odpowiedź powinna odpowiedzieć na pytanie.)
Vaillancourt
Ma sens. Przekształcę moją odpowiedź na pełne instrukcje.
Abhishek Patidar