Số lượng Phương thức thống nhất vượt quá giới hạn 64K


20

Tôi vừa gặp một vấn đề liên quan đến phương pháp 64k trong Unity vì vậy đó là lý do tại sao tôi không thể xây dựng dự án của mình. Nó cho thấy giới hạn phương thức vượt quá giới hạn 64k phương thức. Vì vậy, bất cứ ai ở đây có thể giúp tôi giải quyết vấn đề này?

Câu trả lời:


22

Câu trả lời này phụ thuộc rất nhiều vào tài liệu chính thức của Android (cụ thể là các phần được trích dẫn).


Cách thiết lập Hỗ trợ Multidex cho Dự án Unity

Đa chiều là gì:

Các tệp ứng dụng Android (APK) chứa các tệp mã byte thực thi dưới dạng tệp Dalvik Executable (DEX), chứa mã được biên dịch được sử dụng để chạy ứng dụng của bạn. Đặc tả thực thi Dalvik giới hạn tổng số phương thức có thể được tham chiếu trong một tệp DEX duy nhất là 65.536, bao gồm các phương thức khung Android, phương thức thư viện và phương thức trong mã của riêng bạn. Vượt qua giới hạn này yêu cầu bạn định cấu hình quy trình xây dựng ứng dụng của mình để tạo nhiều hơn một tệp DEX, được gọi là cấu hình đa dex.

Khi chúng tôi sử dụng Multidex:

Khi chúng tôi vượt quá tổng số phương thức có thể được tham chiếu trong một tệp DEX duy nhất đến 65.536 - bao gồm các phương thức khung Android, phương thức thư viện và phương thức trong mã của riêng bạn.

Tránh giới hạn 64K

Trước khi định cấu hình ứng dụng của bạn để cho phép sử dụng 64K hoặc nhiều tham chiếu phương thức, bạn nên thực hiện các bước để giảm tổng số tham chiếu được gọi bởi mã ứng dụng của bạn, bao gồm các phương thức được xác định bởi mã ứng dụng hoặc các thư viện đi kèm. Các chiến lược sau đây có thể giúp bạn tránh đạt giới hạn tham chiếu DEX:

Xem lại các phụ thuộc trực tiếp và bắc cầu của ứng dụng của bạn - Đảm bảo mọi phụ thuộc thư viện lớn mà bạn đưa vào ứng dụng của mình được sử dụng theo cách vượt trội hơn số lượng mã được thêm vào ứng dụng. Một mô hình chống phổ biến là bao gồm một thư viện rất lớn vì một vài phương thức tiện ích là hữu ích. Giảm phụ thuộc mã ứng dụng của bạn thường có thể giúp bạn tránh giới hạn tham chiếu DEX.

Xóa mã không sử dụng bằng ProGuard - Cho phép thu nhỏ mã để chạy ProGuard cho các bản dựng phát hành của bạn. Kích hoạt thu hẹp đảm bảo bạn không vận chuyển mã không sử dụng với APK của mình.

Ngoài những lời khuyên chính thức này, khi xây dựng dự án Unity của bạn, hãy làm theo các bước sau sẽ giúp bạn thêm:

  1. Xây dựng một dự án Android từ Unity Editor của bạn. Đặt 1

  2. Nhập dự án Android của bạn trong Android Studio. Bước 2

  3. Thiết lập dự án ứng dụng của bạn để sử dụng cấu hình đa dex yêu cầu bạn thực hiện sửa đổi sau.

    Nếu minSdkVersion của bạn được đặt thành 21 hoặc cao hơn, tất cả những gì bạn cần làm được đặt multiDexEnabledthành truetrong tệp build.gradle cấp mô-đun, như được hiển thị ở đây:

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

    Tuy nhiên, nếu của bạn minSdkVersionđược đặt thành 20 hoặc thấp hơn, thì bạn phải sử dụng thư viện hỗ trợ multidex như sau:

    3.1. Sửa đổi tệp build.gradle cấp mô-đun để bật multidex và thêm thư viện multidex làm phụ thuộc, như hiển thị ở đây:

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

    3.2. Tùy thuộc vào việc bạn có ghi đè lớp Ứng dụng hay không, thực hiện một trong các thao tác sau:

    • Nếu bạn không ghi đè Applicationlớp, hãy chỉnh sửa tệp kê khai của bạn để đặt android:nametrong <application>thẻ như sau:
    <?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>
    • Nếu bạn ghi đè Applicationlớp, hãy thay đổi nó để mở rộng MultiDexApplication (nếu có thể) như sau:
    public class MyApplication extends MultiDexApplication { ... }
    • Hoặc nếu bạn ghi đè lớp Ứng dụng nhưng không thể thay đổi lớp cơ sở, thì thay vào đó, bạn có thể ghi đè phương thức AttachBaseContext () và gọi MultiDex.install (điều này) để bật multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. Kiểm tra biểu mẫu lỗi các tệp kê khai khác và dọn sạch dự án.

  5. Nếu có bất kỳ vấn đề phụ thuộc nào trong dự án của bạn, hãy chạy lệnh này trong Android Terminal

    % Gradle clean App."App name"
  6. Sao chép các phụ thuộc này trong Lớp ứng dụng của bạn, dưới phần phụ thuộc:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
  7. Thêm SignConfig trong các dự án chính của bạn Gradle.

    Bước 8

    Hoặc đặt chế độ Ký thành chế độ Gỡ lỗi theo cách thủ công, Chuyển đến Tệp -> Cấu trúc dự án -> Trong Mô-đun Nhấp vào dự án của bạn và bên dưới Kiểu xây dựng, chọn Gỡ lỗi -> chọn Ký cấu hình-> gỡ lỗi

    nhập mô tả hình ảnh ở đây

  8. Bây giờ đồng bộ hóa Gradle của bạn và xây dựng dự án.


1
Dự án của bạn lớn đến mức nào dẫn đến lỗi này?
Evorlor

1
Trên thực tế, tôi đang sử dụng trung gian Google AdMob để sử dụng để thêm 6-7 SDK quảng cáo nên số phương pháp dự án cuối cùng của tôi là khoảng 76k.
Rakesh

0

Tôi khuyên bạn nên truy cập liên kết này để giúp bạn tạo các trò chơi kích hoạt đa chiều trực tiếp thông qua sự thống nhất.

https://medium.com/@abhpatidar/solve-unity-dex-su-538e134c8809

Lưu ý: Điều này sẽ chỉ cho phép multidex trong sự thống nhất (và sẽ khắc phục các sự cố multidex). Nó sẽ không sửa các vấn đề liên quan đến lớp.


3
Đây hiện là câu trả lời chỉ liên kết: mặc dù liên kết trả lời câu hỏi, nhưng câu trả lời thì không. Bạn có thể muốn bao gồm cốt lõi của nội dung được liên kết ở đây (liên kết mỗi lần không tệ, chỉ là liên kết chỉ là liên kết xấu).
Vaillancourt

Tôi đồng ý với bạn nhưng các bước viết quá nhiều. Đó là lý do tại sao tôi phải tạo một bài viết và chia sẻ liên kết. Tôi thích cách đó để tôi sẽ chỉ có một nguồn sự thật thay vì tạo ra nhiều nguồn.
Abhishek Patidar

Hiểu nhưng đó không phải là cách các trang web Stack Exchange hoạt động: các câu trả lời chỉ liên kết bị xóa. Nếu bạn muốn, tôi có thể chuyển đổi câu trả lời này thành một nhận xét của câu hỏi: bạn sẽ giữ tham chiếu của mình cho người dùng trong tương lai và chúng tôi đã thắng 't chỉ có một liên kết trả lời. (Vấn đề chính với câu trả lời chỉ liên kết là nếu bạn gỡ trang web của bạn xuống (hoặc ISP của bạn bị phá sản với tất cả dữ liệu của bạn), câu trả lời này sẽ hoàn toàn vô giá trị; đây là lý do tại sao câu trả lời sẽ trả lời câu hỏi.)
Vaillancourt

Có lý. Tôi sẽ chuyển đổi câu trả lời của tôi để hoàn thành hướng dẫn.
Abhishek Patidar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.