فعالکردن مالتیدکس
MultiDex چیست؟
در صورتی که minSdkVersion
پایینتر از ۲۱ باشد و پروژه را اجرا کنید ممکن است این خطا رخدهد:
در ماشین مجازی
Dalvik
تعداد متدهای ممکن در یک فایل
.dex
محدود به
64K
میباشد و در صورتی که تعداد متدها از این عدد گذر کند
Dalvik
توانایی دسترسی به تمام متدها را نخواهد داشت. لذا بایستی از قابلیت
MultiDex
استفاده شود تا چند فایل
.dex
برای دسترسی به همهی متدها توسط
Dalvik
ممکن شود.
در صورتی که خطایی همانند زیر برای شما رخ میدهد
نکتهی مهم:
در صورتی کهMinSDK
۲۱ یا بالاتر باشد این مشکل رخ نخواهد داد زیرا MultiDex در این حالت به صورت پیشفرض پشتیبانی میشود و نیاز به کار اضافه نیست.
در صورتی که برنامه به این حالت است، مشکل شما MultiDex نیست.
فعالکردن MultiDex در برنامه
اضافهکردن کد گریدل
در فایل android/app/build.gradle
مالیدکس را فعالکنید:
android {
defaultConfig {
// ...
multiDexEnabled true
}
}
- AndroidX
- Android support
dependencies {
implementation "androidx.multidex:multidex:2.0.1"
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
تغییردادن کلاس اپلیکیشن
- به آدرس
android/src/main/(java or kotlin)/<your_app>
بروید.
(your_app
مسیر پکیج برنامهی شماست)
- کلاسی به نام
MyApp
در کنارMainActivity
بسازید و کد زیر را در آن لحاظ کنید:
- Kotlin
- Java
package <your_app>; // در اینجا پکیجنیم برنامه باید قرار داده شود
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.GeneratedPluginRegistrant
import co.pushe.plus.flutter.PusheFlutterPlugin
import androidx.multidex.MultiDex
class MyApp : FlutterApplication(), PluginRegistrantCallback {
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(this)
}
override fun onCreate() {
super.onCreate()
// other codes
}
override fun registerWith(registry: PluginRegistry) {
GeneratedPluginRegistrant.registerWith(registry) // Only Embedded v1
}
}
package <your_app>; // در اینجا پکیجنیم برنامه باید قرار داده شود
import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import co.pushe.plus.flutter.PusheFlutterPlugin;
import androidx.multidex.MultiDex;
public class MyApp extends FlutterApplication implements PluginRegistrantCallback {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
@Override
public void onCreate() {
super.onCreate();
// other codes
}
@Override
public void registerWith(PluginRegistry registry) {
GeneratedPluginRegistrant.registerWith(registry); // Only Embedded v1
}
}
در صورتی که پروژه با استفاده از FlutterEmbeddingV2 (Flutter v1.12 یا بالاتر) ساختهشده است نیازی به رجیستر کردن پلاگینها نیست و این کار خودکار انجام میشود، اما در صورتی که پروژه با استفاده از نسخهی قدیمیتری ساختهشده است، کافیست این خط را برای جلوگیری از خطای کالبک قرار دهید.
GeneratedPluginRegistrant.registerWith(registry);
از کجا بفهمیم پروژه از
Embedding v2
استفاده میکند یاv1
؟برای اینکه تشخیص دهید پروژهی شما از
FlutterEmbedding v2
استفاده میکند یاv1
میتوانید فایلAndroidManifest
را باز کنید و وجود تگ flutterEmbedding را بررسی کنید. در صورتی که تگ زیر وجود داشته باشد پروژه ازEmbedding v2
استفاده میکند
<meta-data android:name="flutterEmbedding" android:value="2"/>
رویدادهای نوتیفیکیشن:
برای اعمالکردن رویدادها در این فایل به بخش رویدادها مراجعه کنید.
رجیسترکردن کلاس
سپس کلاس اپلیکیشن خود را در فایل مانیفست رجیستر کنید:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name=".MyApp"
>
...
</application>
</manifest>