วิธีการ Unity นับเกินขีด จำกัด 64K


20

ฉันเพิ่งมีปัญหาเกี่ยวกับวิธี 64k ใน Unity ดังนั้นฉันจึงไม่สามารถสร้างโครงการของฉันได้ มันแสดงให้เห็นข้อ จำกัด วิธีการเกินขีด จำกัด ของวิธีการนับ 64k ดังนั้นทุกคนที่นี่สามารถช่วยฉันแก้ไขปัญหานี้ได้หรือไม่

คำตอบ:


22

คำตอบนี้ขึ้นอยู่กับเอกสารทางการของ Android เป็นอย่างมาก (ส่วนที่ยกมาโดยเฉพาะ)


วิธีการตั้งค่าการสนับสนุน Multidex สำหรับ Unity Project

Multidex คืออะไร:

ไฟล์แอปพลิเคชัน Android (APK) มีไฟล์ bytecode ที่เรียกใช้งานได้ในรูปแบบของไฟล์ Dalvik Executable (DEX) ซึ่งมีรหัสที่คอมไพล์ซึ่งใช้ในการเรียกใช้แอปของคุณ ข้อมูลจำเพาะของปฏิบัติการ Dalvik จำกัด จำนวนวิธีการทั้งหมดที่สามารถอ้างอิงได้ภายในไฟล์ DEX เดียวที่ 65,536 รวมถึงวิธีเฟรมเวิร์ก Android, วิธีไลบรารีและวิธีการในรหัสของคุณเอง การผ่านพ้นขีด จำกัด นี้กำหนดให้คุณต้องกำหนดค่ากระบวนการสร้างแอปของคุณเพื่อสร้างไฟล์ DEX มากกว่าหนึ่งไฟล์หรือที่เรียกว่าการกำหนดค่าหลาย dex

เมื่อเราใช้ Multidex:

เมื่อเราเกินจำนวนวิธีการทั้งหมดที่สามารถอ้างอิงได้ภายในไฟล์ DEX เดียวถึง 65,536- รวมถึงวิธีเฟรมเวิร์ก Android วิธีการไลบรารีและวิธีการในรหัสของคุณเอง

หลีกเลี่ยงการ จำกัด 64K

ก่อนกำหนดค่าแอพของคุณเพื่อให้สามารถใช้การอ้างอิงวิธี 64K ขึ้นไปคุณควรดำเนินการตามขั้นตอนเพื่อลดจำนวนการอ้างอิงทั้งหมดที่เรียกโดยรหัสแอปของคุณรวมถึงวิธีที่กำหนดโดยรหัสแอปหรือไลบรารีที่รวม กลยุทธ์ต่อไปนี้สามารถช่วยคุณหลีกเลี่ยงการกดขีด จำกัด การอ้างอิง DEX:

ตรวจสอบการพึ่งพาโดยตรงและการถ่ายทอดแอพของคุณ - ตรวจสอบให้แน่ใจว่ามีการใช้งานไลบรารีขนาดใหญ่ที่คุณรวมในแอพของคุณในลักษณะที่เกินดุลจำนวนรหัสที่เพิ่มเข้ากับแอป รูปแบบการต่อต้านทั่วไปคือการรวมไลบรารีที่มีขนาดใหญ่มากเนื่องจากวิธีการอรรถประโยชน์บางอย่างมีประโยชน์ การลดการพึ่งพารหัสแอปของคุณมักจะช่วยให้คุณหลีกเลี่ยงข้อ จำกัด การอ้างอิง DEX

ลบรหัสที่ไม่ได้ใช้ด้วย ProGuard - เปิดใช้งานการย่อขนาดโค้ดเพื่อเรียกใช้ ProGuard สำหรับรุ่นบิลด์ของคุณ การเปิดใช้งานการย่อขนาดทำให้คุณไม่ได้จัดส่งรหัสที่ไม่ได้ใช้กับ APK ของคุณ

นอกเหนือจากเคล็ดลับอย่างเป็นทางการเหล่านี้เมื่อสร้างโครงการ Unity ของคุณการทำตามขั้นตอนเหล่านี้จะช่วยคุณเพิ่มเติม:

  1. สร้างโครงการ Android จาก Unity Editor ของคุณ ชุดที่ 1

  2. นำเข้าโครงการ Android ของคุณใน Android Studio ขั้นตอนที่ 2

  3. การตั้งค่าโปรเจ็กต์แอพของคุณเพื่อใช้การกำหนดค่า dex แบบมัลติต้องการให้คุณทำการแก้ไขต่อไปนี้

    หาก minSdkVersion ของคุณถูกตั้งค่าเป็น 21 หรือสูงกว่าสิ่งที่คุณต้องทำคือการกำหนดmultiDexEnabledที่จะtrueอยู่ในแฟ้ม build.gradle ระดับโมดูลของคุณเป็นที่แสดงที่นี่:

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

    อย่างไรก็ตามหากคุณminSdkVersionตั้งค่าไว้ที่ 20 หรือต่ำกว่าคุณต้องใช้ไลบรารีการสนับสนุนแบบหลายไฟล์ดังนี้:

    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คลาสให้แก้ไขไฟล์รายการเพื่อตั้งค่า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 { ... }
    • หรือถ้าคุณลบล้างคลาสแอปพลิเคชัน แต่ไม่สามารถเปลี่ยนคลาสพื้นฐานได้คุณสามารถแทนที่เมธอด attachBaseContext () และโทร MultiDex.install (นี่) เพื่อเปิดใช้งาน 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. เพิ่มการลงนาม Config ในโครงการหลักของคุณ Gradle

    ขั้นตอนที่ 8

    หรือตั้งค่าโหมดการลงชื่อเป็นโหมดแก้ไขข้อบกพร่องด้วยตนเองไปที่ไฟล์ -> โครงสร้างโครงการ -> ภายใต้โมดูลคลิกที่โครงการของคุณและภายใต้ประเภทการสร้างเลือกดีบั๊ก -> เลือกลงชื่อเข้าใช้กำหนดค่า> debug

    ป้อนคำอธิบายรูปภาพที่นี่

  8. ตอนนี้ซิงค์ Gradle ของคุณและสร้างโครงการ


1
โครงการของคุณมีขนาดเท่าใดที่นำไปสู่ข้อผิดพลาดนี้
Evorlor

1
อันที่จริงฉันใช้ Google AdMob สื่อกลางเพื่อที่จะใช้ในการเพิ่มโฆษณา 6-7 SDK ดังนั้นจำนวนโครงการขั้นสุดท้ายของฉันคือประมาณ 76k
Rakesh

0

ฉันอยากจะแนะนำให้คุณไปที่ลิงค์นี้ซึ่งจะช่วยให้คุณสร้างเกมที่เปิดใช้งาน multidex โดยตรงผ่านความเป็นเอกภาพ

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

หมายเหตุ: สิ่งนี้จะเปิดใช้งาน multidex ในเอกภาพเท่านั้น (และควรแก้ไขปัญหา multidex) มันจะไม่แก้ไขปัญหาที่เกี่ยวข้องกับการไล่ระดับสี


3
นี่เป็นคำตอบสำหรับลิงค์เท่านั้น: ถึงแม้ว่าลิงก์จะตอบคำถาม แต่คำตอบก็ไม่ได้ คุณอาจต้องการที่จะรวมเนื้อหาหลักของการเชื่อมโยงที่นี่ (ลิงค์ต่อ se คือไม่ได้เลวร้ายเป็นเพียง havin เพียงการเชื่อมโยงที่ไม่ดี)
Vaillancourt

ฉันเห็นด้วยกับคุณ แต่ขั้นตอนที่เขียนมีมากเกินไป นั่นเป็นเหตุผลที่ฉันต้องสร้างบทความและแชร์ลิงก์ ฉันชอบวิธีนี้เพื่อที่จะได้แหล่งความจริงเพียงแหล่งเดียวมากกว่าสร้างหลายแหล่ง
Abhishek Patidar

ในความเข้าใจ แต่นั่นไม่ใช่วิธีที่เว็บไซต์ Stack Exchange ทำงาน: คำตอบเฉพาะลิงก์ได้ถูกลบออกไป¤หากคุณต้องการฉันสามารถแปลงคำตอบนี้เป็นความคิดเห็นของคำถาม: คุณจะทำให้การอ้างอิงของคุณปรากฏต่อผู้ใช้ในอนาคต ไม่มีลิงก์คำตอบเท่านั้น (¤ปัญหาหลักของลิงค์เท่านั้นคือคำตอบคือถ้าคุณทำให้ไซต์ของคุณล่ม (หรือ ISP ของคุณล้มละลายด้วยข้อมูลทั้งหมด) คำตอบนี้จะไร้ค่าทั้งหมดนี่คือเหตุผลที่คำตอบควรตอบคำถาม)
Vaillancourt

เข้าท่า ฉันจะแปลงคำตอบของฉันให้เป็นคำแนะนำที่สมบูรณ์
Abhishek Patidar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.