تنظیمات لازم برای پشتیبانی بیش از ۶۴کیلو اشاره‌گر در اندروید

فایل apk نرم‌افزارهای اندروید حاوی فایل ایندکسی به فرم Dalvik Executable هستند که این فایل حاوی کدهای کمپایل شده مورد نیاز برای اجرای برنامه است. این فرمت حداکثر میتواند تعداد 65,536 متود را آدرس دهی کند که این متودها حاوی شامل متودهای خود اندروید، کتابخانه‌های استفاده شده در برنامه و کدهای خود شماست، به بیان کامپیوتری برنامه‌های اندروید میتوانند تعداد 64K متود را آدرس‌دهی کنند. (برای یک سیستم عامل توی دنیای امروز کمی شرم‌آور بنظر میرسه، هرچند همین 64K خودش عدد بزرگی هست)
بلا بلا بلا بلا - بیاید فرض کنیم کلی حرف دیگه که می‌تونید براحتی از منبع این پست پیدا کنید رو من اینجا گفتم - خب حالا نکته اینجاست که اگه واقعا بیشتر از 64K متود داشتیم چه گلی باید به سرمون بگیریم؟

خب حالا که با یدونه فایل dex نمی‌تونیم فایل apk بسازیم، چرا با چند‌تا فایل نسازیم، برای استفاده از این روش باید در تنظیمات gradle سوئیچ multiDexEnabled رو فعال کنیم و همچنین کتابخانه com.android.support:multidex رو به وابستگی‌های برنامه خودمون اضافه کنیم.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}

همچنین در فایل AndroidManifest.xml نام کلاس اصلی برنامه خودمون رو باید به MultiDexApplication تغییر بدیم

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>

البته اگر قبلا کلاس شخصی‌ای برای application نوشته باشیم میتونیم براحتی اون کلاس رو زیرکلاسی از MultiDexApplication تعریف کنیم

1
2
3
public class MyApplication extends MultiDexApplication {
}

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="com.example.android.multidex.MyApplication">
...
</application>
</manifest>

بعد از این کارها اگر محتویات apk برنامه خودمون رو باز کنیم، میبینیم که علاوه بر classes.dex یک classes2.dex هم وجود داره. برحسب نیاز و بزرگی برنامه،این شمارنده زیاد میشه و ممکنه classes3.dex هم داشته باشیم.

References: