Daha önce de belirtildiği gibi, projenizde ve kütüphanelerinizde çok fazla yöntem (65k'dan fazla) var.
Sorunu Önleyin: Play Hizmetleri 6.5+ ve support-v4 24.2+ ile yöntem sayısını azaltın
Google Play hizmetleri çoğu zaman 20k + yöntemleriyle "israf" yöntemlerindeki ana şüphelilerden biridir . Google Play hizmetleri sürüm 6.5 veya üzeri, Google Play hizmetlerini uygulamanıza bir dizi küçük istemci kitaplığı kullanarak dahil etmeniz mümkündür . Örneğin, yalnızca GCM'ye ve haritalara ihtiyacınız varsa yalnızca bu bağımlılıkları kullanmayı seçebilirsiniz:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
Alt kütüphanelerin tam listesi ve sorumlulukları resmi google doc'de bulunabilir .
Güncelleme : Destek Kütüphanesi v4 v24.2.0'dan bu yana aşağıdaki modüllere ayrılmıştır:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
Vesupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
Bununla birlikte, kullanırsanız support-fragment
, diğer tüm modüllere bağımlılıkları olacağını unutmayın (yani kullanırsanız android.support.v4.app.Fragment
faydası olmaz)
Burada support-v4 lib için resmi sürüm notlarına bakın
MultiDexing'i etkinleştir
Lollipop (yani 21+ yapı araçları) olduğundan, kullanımı çok kolaydır. Yaklaşım uygulamanız için birden fazla dex dosyası oluşturmak için dex dosyası başına 65k yöntem sorunu etrafında çalışmaktır. Gradle derleme dosyanıza aşağıdakileri ekleyin ( bu, 65.000'den fazla yöntem içeren uygulamalarda resmi google doc'dan alınır ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
İkinci adım, Uygulama sınıfınızı hazırlamak veya Uygulamayı genişletmiyorsanız MultiDexApplication
Android Manifest'inizdeki kullanımı kullanın :
Bunu Application.java'nıza ekleyin
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
veya mutlidex lib'den sağlanan uygulamayı kullanın
<?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>
MultiDex ile OutOfMemory'yi önleyin
Daha fazla ipucu olarak, OutOfMemory
oluşturma aşamasında istisnalarla karşılaşırsanız, yığını genişletebilirsiniz.
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
bu da öbeği 4 gigabayta ayarlayacaktır.
Dex yığın bellek sorunu hakkında daha fazla bilgi için bu soruya bakın.
Sorunun kaynağını analiz edin
Yöntemlerin kaynağını analiz etmek için https://github.com/KeepSafe/dexcount-gradle-plugin dereceli eklentisi , ör.
.\gradlew app:dependencies
Android'de yöntem sayısı hakkında daha fazla bilgi için bu cevaba ve soruya bakın