Như đã nêu, bạn có quá nhiều phương thức (hơn 65k) trong dự án và libs của bạn.
Ngăn chặn sự cố: Giảm số lượng phương thức với Play Services 6.5+ và support-v4 24.2+
Vì thường các dịch vụ Google Play là một trong những nghi phạm chính trong các phương pháp "lãng phí" với các phương thức 20k + của nó . Các dịch vụ Google Play phiên bản 6.5 trở lên, bạn có thể đưa các dịch vụ Google Play vào ứng dụng của mình bằng một số thư viện khách nhỏ hơn. Ví dụ: nếu bạn chỉ cần GCM và bản đồ, bạn có thể chọn chỉ sử dụng các phụ thuộc này:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
Danh sách đầy đủ các thư viện phụ và trách nhiệm của nó có thể được tìm thấy trong tài liệu google chính thức .
Cập nhật : Vì Thư viện hỗ trợ v4 v24.2.0, nó được chia thành các mô-đun sau:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
Vàsupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
Tuy nhiên, xin lưu ý, nếu bạn sử dụng support-fragment
, nó sẽ có các phụ thuộc cho tất cả các mô-đun khác (nghĩa là nếu bạn sử dụng android.support.v4.app.Fragment
thì không có lợi ích gì)
Xem ở đây các ghi chú phát hành chính thức cho lib-v4 lib
Kích hoạt tính năng MultiDexing
Vì Lollipop (còn gọi là công cụ xây dựng 21+) nên rất dễ xử lý. Cách tiếp cận là giải quyết 65k phương pháp cho mỗi vấn đề về tệp dex để tạo nhiều tệp dex cho ứng dụng của bạn. Thêm phần sau vào tệp xây dựng lớp của bạn ( phần này được lấy từ tài liệu google chính thức trên các ứng dụng có hơn 65 nghìn phương thức ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
Bước thứ hai là chuẩn bị lớp Ứng dụng của bạn hoặc nếu bạn không mở rộng Ứng dụng, hãy sử dụng MultiDexApplication
Bản kê khai Android của bạn:
Thêm cái này vào Application.java của bạn
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
hoặc sử dụng ứng dụng được cung cấp từ lib mutlidex
<?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>
Ngăn chặn OutOfMemory với MultiDex
Như một mẹo nữa, nếu bạn gặp phải OutOfMemory
trường hợp ngoại lệ trong giai đoạn xây dựng, bạn có thể phóng to heap bằng
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
mà sẽ đặt heap thành 4 gigabyte.
Xem câu hỏi này để biết thêm chi tiết về vấn đề bộ nhớ hex dex.
Phân tích nguồn gốc của vấn đề
Để phân tích nguồn của các phương thức, plugin gradle https://github.com/KeepSafe/dexcount-gradle-plugin có thể giúp kết hợp với cây phụ thuộc được cung cấp bởi gradle với vd
.\gradlew app:dependencies
Xem câu trả lời và câu hỏi này để biết thêm thông tin về số phương pháp trong Android