Khắc phục sự cố và câu hỏi thường gặp về Unity và Firebase

Trang này cung cấp các mẹo và cách khắc phục sự cố dành riêng cho Unity mà bạn có thể gặp phải khi sử dụng Firebase.

Bạn có gặp khó khăn khác hoặc không thấy vấn đề của mình được nêu dưới đây? Đừng quên xem phần Câu hỏi thường gặp chính về Firebase để biết thêm các câu hỏi thường gặp về Firebase hoặc sản phẩm cụ thể.

Khả năng tương thích với .NET khi sử dụng Unity 2017.x trở lên

Firebase hỗ trợ .NET 4.x dưới dạng tuỳ chọn bản dựng thử nghiệm trong Unity 2017 trở đi. Trình bổ trợ Firebase sử dụng các thành phần của SDK phân tích cú pháp để cung cấp một số lớp .NET 4.x trong các phiên bản .NET cũ.

Do đó, phiên bản SDK Unity của Firebase 5.4.0 trở lên cung cấp các trình bổ trợ tương thích với .NET 3.x hoặc .NET 4.x trong thư mục dotnet3dotnet4 của Firebase Unity SDK.

Nếu nhập một trình bổ trợ Firebase không tương thích với phiên bản .NET được bật trong dự án, thì bạn sẽ thấy lỗi biên dịch từ một số loại trong khung .NET do SDK phân tích cú pháp triển khai.

Để khắc phục lỗi biên dịch, nếu bạn đang sử dụng .NET 3.x:

  1. Xoá hoặc tắt các DLL sau đây cho tất cả nền tảng:
    • Parse/Plugins/dotNet45/Unity.Compat.dll
    • Parse/Plugins/dotNet45/Unity.Tasks.dll
  2. Bật các tệp DLL sau đây cho tất cả nền tảng:
    • Parse/Plugins/Unity.Compat.dll
    • Parse/Plugins/Unity.Tasks.dll

Để khắc phục lỗi biên dịch, nếu bạn đang dùng .NET 4.x:

  1. Xoá hoặc tắt các DLL sau đây cho tất cả nền tảng:
    • Parse/Plugins/Unity.Compat.dll
    • Parse/Plugins/Unity.Tasks.dll
  2. Bật các tệp DLL sau đây cho tất cả nền tảng:
    • Parse/Plugins/dotNet45/Unity.Compat.dll
    • Parse/Plugins/dotNet45/Unity.Tasks.dll

Nếu bạn nhập một trình bổ trợ Firebase khác:

  • Trong dự án Unity, hãy chuyển đến Nội dung > Trình phân giải dịch vụ của Google Play > Trình xử lý phiên bản > Cập nhật để bật các DLL chính xác cho dự án của bạn.

Biên dịch IL2CPP của Unity 2017.1 trong các dự án .NET 4.x

Firebase hỗ trợ .NET 4.x dưới dạng tuỳ chọn bản dựng thử nghiệm trong Unity 2017 trở đi. Trình bổ trợ Firebase sử dụng các thành phần của SDK phân tích cú pháp để cung cấp một số lớp .NET 4.x trong các phiên bản .NET cũ.

Do đó, phiên bản SDK Unity của Firebase 5.4.0 trở lên cung cấp các DLL chuyển tiếp loại. Các tệp này sẽ chuyển tiếp các loại Phân tích cú pháp (ví dụ: triển khai Phân tích cú pháp của System.Threading.Tasks.Task) sang khung .NET. Rất tiếc, IL2CPP (một trình chuyển đổi chuyển đổi C# sang C++) được vận chuyển trong Unity 2017.1.x không xử lý chính xác các DLL chuyển tiếp loại, dẫn đến các lỗi bản dựng giống như sau:

Fatal error in Unity CIL Linker Mono.Cecil.ResolutionException: Failed to
resolve System.Threading.Tasks.TaskCompletionSource`1<T>

Hiện chưa có giải pháp nào cho các lỗi bản dựng .NET 4.x IL2CPP trong Unity 2017.1. Vì vậy, bạn phải nâng cấp lên Unity 2017.2 trở lên để sử dụng .NET 4.x trong các dự án được biên dịch bằng IL2CPP.

Kết nối mạng trong Unity 2017.2

Cơ sở dữ liệu theo thời gian thực của Firebase tạo các kết nối mạng TLS bằng cách sử dụng ngăn xếp mạng .NET. Chức năng TLS bị hỏng trong Unity 2017.2 khi sử dụng .NET 4.6 khiến trình bổ trợ Cơ sở dữ liệu theo thời gian thực gặp lỗi trong trình chỉnh sửa và trên máy tính.

Không có giải pháp nào cho vấn đề này, vì vậy bạn phải sử dụng một phiên bản Unity khác, ví dụ: phiên bản 2017.1 hoặc 2017.3.

Thiếu tệp cấu hình Android của Firebase trong Unity 2020

Để hỗ trợ các phiên bản Unity không có khả năng tuỳ chỉnh bản dựng Gradle, công cụ trình chỉnh sửa Firebase sẽ tạo Assets/Plugins/Android/Firebase/res/values/google-services.xml dưới dạng một tài nguyên Android sẽ được đóng gói vào một bản dựng Android, để Firebase SDK có thể sử dụng để khởi chạy phiên bản FirebaseApp mặc định.

Trong Unity 2020, tất cả tài nguyên Android đều phải nằm trong thư mục có hậu tố .androidlib. Nếu dự án của bạn đang sử dụng SDK Firebase tạo thư mục Assets/Plugins/Android/Firebase, hãy đổi tên thư mục đó thành Assets/Plugins/Android/Firebase.androidlib. Hãy đảm bảo tệp này chứa AndroidManifest.xml, project.propertiesres/values/google-services.xml.

Vấn đề với một tệp dex khi tạo ứng dụng Android

Trong khi tạo ứng dụng Android, bạn có thể gặp lỗi bản dựng liên quan đến việc có một tệp dex duy nhất. Thông báo lỗi sẽ có dạng như sau nếu dự án của bạn được định cấu hình để sử dụng hệ thống xây dựng Gradle.

Cannot fit requested classes in a single dex file.

Các tệp Dalvik thực thi (.dex) được dùng để lưu giữ một tập hợp các định nghĩa về lớp và dữ liệu bổ trợ liên quan cho các ứng dụng Android (.apk). Một tệp dex duy nhất được giới hạn tham chiếu đến 65.536 phương thức. Không tạo được bản dựng nếu tổng số phương thức từ tất cả các thư viện Android trong dự án của bạn vượt quá giới hạn này.

Unity ra mắt tính năng Minification (Rút gọn) vào năm 2017.2, sử dụng Proguard (hoặc các công cụ khác trong một số phiên bản Unity) để loại bỏ mã không dùng đến, giúp giảm tổng số phương thức được tham chiếu trong một tệp dex. Bạn có thể tìm thấy tuỳ chọn này trong phần Player Settings > Android > Publishing Settings > Giảm kích thước. Các tuỳ chọn có thể khác nhau trong các phiên bản Unity khác nhau. Vì vậy, hãy tham khảo tài liệu chính thức của Unity.

Nếu số lượng phương thức được tham chiếu vẫn vượt quá giới hạn, bạn có thể dùng một lựa chọn khác để bật multidex. Có nhiều cách để đạt được điều này trong Unity:

  • Nếu Custom Gradle Template trong Player Settings được bật, hãy sửa đổi mainTemplate.gradle.
  • Nếu bạn sử dụng Android Studio để xây dựng dự án đã xuất, hãy sửa đổi tệp build.gradle ở cấp mô-đun.

Bạn có thể xem thêm thông tin chi tiết trong hướng dẫn sử dụng multidex.

Hỗ trợ và đơn giản hoá Java 8 cho các bản dựng Android trong Unity 2017 và Unity 2018 (Firebase Unity SDK 8.0.0 trở lên)

Vào tháng 5 năm 2021 (Firebase BoM v28.0.0), Firebase đã tắt tính năng đơn giản hoá cho tất cả thư viện Android (xem ghi chú phát hành). Khi tạo ứng dụng Android bằng Firebase Unity SDK (8.0.0 trở lên), bạn có thể thấy lỗi bản dựng sau:

> Error while dexing.
 The dependency contains Java 8 bytecode. Please enable desugaring by adding the following to build.gradle

Thay đổi này chỉ ảnh hưởng đến các bản dựng Android trong Unity 2017 và Unity 2018. Các phiên bản Unity mới hơn sẽ thêm khối compileOptions theo mặc định trong các tệp bản dựng Gradle. Để khắc phục lỗi bản dựng này trong Unity 2017 và Unity 2018, hãy làm theo một trong những cách sau:

  • Thêm khối compileOptions vào mẫu gradle của bạn:

    1. Sử dụng Gradle làm hệ thống xây dựng.
    2. Bật Custom Gradle Template trong Player Settings.
    3. Thêm các dòng sau vào mainTemplate.gradle (hoặc cấp mô-đun build.gradle nếu xuất dự án cho Android Studio):

      android {
          compileOptions {
              sourceCompatibility 1.8
              targetCompatibility 1.8
          }
      }
      
  • Ngoài ra, hãy tăng minSdkVersion cho dự án Android lên phiên bản 26 trở lên.

Hãy xem thêm bài viết Khắc phục sự cố trên Android – lỗi đơn giản hoá của bản dựng.

Vấn đề khi xây dựng ứng dụng cho iOS bằng Cocoapods

Khi tạo bản dựng cho iOS, quá trình cài đặt Cocoapod có thể không thành công kèm theo lỗi về ngôn ngữ bản địa hoặc bộ mã hoá UTF-8. Hiện tại, có một số cách để giải quyết vấn đề này.

  • Trên cửa sổ dòng lệnh, hãy chạy trực tiếp pod install rồi mở tệp xcworkspace thu được.

  • Hạ cấp phiên bản Cocoapods xuống 1.10.2. Vấn đề này chỉ tồn tại trong phiên bản 1.11 trở lên.

  • Trong ~/.bash_profile hoặc tương đương, hãy thêm export LANG=en_US.UTF-8

Cách cập nhật phiên bản Firebase Unity SDK

Quy trình cập nhật các phiên bản của Firebase Unity SDK phụ thuộc vào cách chúng được nhập ban đầu. Sau đây là hai phương thức nhập thay thế:

  • Đang nhập .unitypackage tệp trong thư mục Assets/ của dự án
  • Nhập bằng Trình quản lý gói Unity (UPM)
    • Đây là cách được đề xuất để quản lý các gói trong Unity 2018.4 trở lên.
    • Hãy sử dụng phương thức này để việc cập nhật các phiên bản trong tương lai trở nên dễ dàng hơn và thư mục Assets/ của bạn trở nên gọn gàng hơn.

Trong dự án Unity, bạn chỉ nên sử dụng một phương thức nhập để quản lý tất cả các gói Firebase. Bạn có thể sử dụng hướng dẫn bên dưới để không chỉ cập nhật phiên bản của các gói riêng lẻ mà còn di chuyển hoạt động quản lý gói sang UPM (phương thức nhập được đề xuất) nếu cần.