فعالکردن مالتیدکس
MultiDex چیست؟
در صورتی که minSdkVersion
پایینتر از ۲۱ باشد و پروژه را اجرا کنید ممکن است این خطا رخدهد:
در ماشین مجازی
Dalvik
تعداد متدها در یک فایل
.dex
بایستی از حد تعیینشدهی
64K
فراتر نروند. در غیراینصورت آدرسدهی برای
Dalvik
به درستی انجامنخواهدشد. به همین دلیل بایستی از چند فایل
.dex
استفادهکرد که اصطلاحا
MultiDex
نامگذاریشدهاست.
نکتهی مهم:
در صورتی کهMinSDK >= 21
باشد این مشکل رخ نخواهد داد زیرا MultiDex در این حالت به صورت پیشفرض پشتیبانی میشود و نیاز به کار اضافه نیست.
در صورتی که برنامه این خطا را دارد، مشکل شما MultiDex نیست.
فعالکردن MultiDex در برنامه
اضافهکردن کد گریدل
در فایل build.gradle(app:Module)
این موارد را اضافه کنید:
android {
defaultConfig {
// ...
multiDexEnabled true
}
}
- AndroidX
- Android support
dependencies {
implementation "androidx.multidex:multidex:$latest"
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
Initialize کردن MultiDex
سه روش برای فعالکردن MultiDex در برنامه وجود دارد که با توجه به شرایط برنامه میتوانید هر یک از این حالات را برای فعالکردن MultiDex استفاده کنید.
۱. در برنامه کلاس Application کاستوم وجود ندارد
به اتریبیوتهای تگ application
در فایل AndroidManifest.xml
این مورد را اضافه کنید:
- AndroidX
- Android support
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="androidx.multidex.MultiDexApplication" >
...
</application>
</manifest>
<?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 کاستوم از android.app.Application ارثبری میکند
در این حالت کلاس پدر را از android.app.Application
به MultiDexApplication
تغییر دهید:
- Kotlin
- Java
class MyApplication : MultiDexApplication() {...}
public class MyApplication extends MultiDexApplication { ... }
۳. کلاس Application کاستوم از کلاس دیگری ارث میبرد
در این حالت میتوانید onAttachBaseContext
را override کنید و MultiDex را initialize کنید:
- Kotlin
- Java
class MyApplication : SomeOtherApplication() {
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(this)
}
}
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
برای اطلاعات بیشتر میتوانید داکیومنت اندروید در مورد MultiDex را مطالعه نمایید.