ตามที่ระบุไว้แล้วคุณมีวิธีการมากเกินไป (มากกว่า 65k) ในโครงการและ libs ของคุณ
ป้องกันปัญหา: ลดจำนวนวิธีด้วย Play Services 6.5+ และ support-v4 24.2+
เนื่องจากมักจะเป็นบริการ Google Play เป็นหนึ่งในผู้ต้องสงสัยหลักในวิธีการ "สูญเสีย" กับ20k + วิธี บริการ Google Play เวอร์ชัน 6.5 หรือใหม่กว่าเป็นไปได้ที่คุณจะรวมบริการ Google Play ในแอปพลิเคชันของคุณโดยใช้ไลบรารีไคลเอ็นต์ขนาดเล็กจำนวนหนึ่ง ตัวอย่างเช่นหากคุณต้องการเพียง GCM และแผนที่คุณสามารถเลือกใช้การอ้างอิงเหล่านี้เท่านั้น:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
รายการเต็มรูปแบบของห้องสมุดย่อยและความรับผิดชอบของมันสามารถพบได้ใน Google เอกสารอย่างเป็นทางการ
อัปเดต : ตั้งแต่ Support Library v4 v24.2.0 มันถูกแบ่งออกเป็นโมดูลต่อไปนี้:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
และsupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
อย่างไรก็ตามโปรดทราบหากคุณใช้support-fragment
มันจะมีการพึ่งพาโมดูลอื่น ๆ ทั้งหมด (เช่นถ้าคุณใช้android.support.v4.app.Fragment
ไม่มีประโยชน์)
ดูที่นี่บันทึกย่อรุ่นอย่างเป็นทางการสำหรับ support-v4 lib
เปิดใช้งาน MultiDexing
ตั้งแต่ Lollipop (หรือที่รู้จักในการสร้างเครื่องมือ 21+) จึงง่ายต่อการจัดการ วิธีนี้คือการหลีกเลี่ยงวิธี 65k ต่อปัญหาไฟล์ dex เพื่อสร้างไฟล์ dex หลายไฟล์สำหรับแอปของคุณ เพิ่มสิ่งต่อไปนี้ในไฟล์ build gradle ของคุณ (ซึ่งนำมาจาก google doc อย่างเป็นทางการในแอปพลิเคชันที่มีมากกว่า 65k วิธี ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
ขั้นตอนที่สองคือเตรียมคลาสแอปพลิเคชันของคุณหรือหากคุณไม่ขยายแอปพลิเคชันให้ใช้MultiDexApplication
ในแอนดรอยด์ Android ของคุณ:
เพิ่มอย่างนี้ใน Application.java ของคุณ
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
หรือใช้แอปพลิเคชันที่ให้มาจาก mutlidex lib
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
ป้องกัน OutOfMemory ด้วย MultiDex
เป็นเคล็ดลับเพิ่มเติมหากคุณพบOutOfMemory
ข้อยกเว้นในระหว่างขั้นตอนการสร้างคุณสามารถขยายกองด้วย
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
ซึ่งจะตั้งค่าฮีปเป็น 4 กิกะไบต์
ดูคำถามนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับปัญหา dex heap memory
วิเคราะห์ที่มาของปัญหา
ในการวิเคราะห์แหล่งที่มาของวิธีการปลั๊กอิน gradle https://github.com/KeepSafe/dexcount-gradle-pluginสามารถช่วยในการรวมกันกับต้นไม้พึ่งพาที่จัดทำโดย gradle ด้วยเช่น
.\gradlew app:dependencies
ดูคำตอบและคำถามนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการนับใน Android