این راهنما تغییرات لازم برای مهاجرت به نسخه ۵.۰ را شرح میدهد.
بهروزرسانیهای Gradle و افزونهی Gradle اندروید
نسخههای Gradle و افزونه Gradle اندروید را ارتقا دهید
ابتدا، نسخههای Gradle و Android Gradle Plugin خود را ارتقا دهید. این ارتقا شامل سازگاری بهتر با برخی از وابستگیهای SDK (از جمله Kotlin 1.9) و همچنین رفع برخی از اشکالات مهم است.
این نسخه اصلی SDK برای پروژه اپلیکیشن اندروید شما به وابستگیهای نسخه زیر نیاز دارد:
- نسخه Gradle حداقل v7.5.0 اما نه بالاتر از v7.6.0.
- یک نسخه از افزونه اندروید گریدل (AGP) در محدوده نسخه 7.4.x.
شما میتوانید نسخههای بالاتر افزونهها را هدف قرار دهید؛ با این حال، ممکن است با هشدارهای منسوخ شدن مواجه شوید، یا برخی از ویژگیهای جدید ممکن است کار نکنند.
برای تغییر نسخه Gradle، خط موجود در فایل /gradle/wrapper/gradle-wrapper.properties پروژه خود را تغییر دهید.
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
برای تغییر نسخه افزونه اندروید Gradle، فایل build.gradle که شامل بلوک buildscript است را تغییر دهید. برای مثال:
buildscript {
repositories {
google()
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.1'
}
}
پشتیبانی از مهاجرت کتابخانههای جاوا ۷ به جاوا ۸
مرحله ۱ - فعال کردن پشتیبانی از کتابخانه جاوا ۸
از آنجایی که حداقل سطح API مورد نیاز SDK، ۲۳ و نسخه AGP مورد نیاز ۷.۴+ است، پیکربندی کمی با مستندات منبع ذکر شده متفاوت است.
buildscript {
repositories {
google()
mavenCentral()
jcenter()
maven {
url = uri("https://storage.googleapis.com/r8-releases/raw")
}
}
dependencies {
classpath 'com.android.tools:r8:8.0.46'
classpath 'com.android.tools.build:gradle:7.4.1'
}
}
android {
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.3'
}
مرحله ۲ - مهاجرت از Proguard یا Dexguard به R8
AGP نسخه ۷.۴+ از R8 به عنوان ابزار پیشفرض کوچکسازی، مبهمسازی و بهینهسازی برای فایل باینری استفاده میکند، بنابراین در حال حاضر نیازی به اقدام خاصی نیست.
اگر پروژه از AGP 4.0+ منتقل شود، AGP ممکن است هشدارهای زیر را در مورد حذف فایلها صادر کند:
- استفاده
useProguard trueدر فایلbuild.gradle -
android.enableR8=falseدر فایلgradle.properties
حذف این خطوط معمولاً آن مشکلات را حل میکند.
مهاجرت کاتلین ۱.۶ به ۱.۹
مرحله ۱ - مهاجرت به افزونه Kotlin Gradle نسخه ۱.۹.۰
نسخه افزونه Kotlin Gradle را در فایل build.gradle ماژول سطح بالای برنامه خود بهروزرسانی کنید. مطمئن شوید که org.jetbrains.kotlin:kotlin-gradle-plugin در وابستگیهای بلوک buildscript اضافه کردهاید، در صورتی که وجود ندارد.
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0"
}
}
اگر از Kotlin Gradle Plugin نسخه ۱.۶.X یا ۱.۷.X استفاده میکنید، باید برنامه خود را از Kotlin-synthetics منتقل کنید. برای اطلاعات بیشتر به راهنمای رسمی مهاجرت مراجعه کنید.
مرحله ۲ - kotlin-stdlib را به ۱.۹.۰ ارتقا دهید
kotlin-stblib در فایل build.gradle برنامه خود به نسخه ۱.۹.۰ ارتقا دهید.
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.0"
}
مطمئن شوید که هرگونه ارجاع به kotlin-stdlib-jdk7 یا kotlin-stdlib-jdk8 را حذف کردهاید. هر دو وابستگی از نسخه 1.8.0 کاتلین در kotlin-stdlib ادغام شدهاند.
منسوخ شدن StatusListener
رابط StatusListener اکنون منسوخ شده است (قرار است در نسخه ۶ حذف شود) و به نفع DriverStatusListener شده است.
عمدتاً 3 تغییر وجود دارد:
- رابط
implementsرا ازStatusListenerبهDriverStatusListenerتغییر دهید. - یک پارامتر
causeNullableبهupdateStatusاضافه کنید. - به جای
setStatusListenerDriverContextBuilder.setDriverStatusListenerرا فراخوانی کنید.
DriverStatusListener ساختار مشابهی با StatusListener دارد. تفاوت اصلی بین آنها این است که DriverStatusListener.updateStatus() یک پارامتر اضافی به نام cause میگیرد. این به کاربران بینشی در مورد علت بهروزرسانی با سطح وضعیت خطا ارائه میدهد.
معمولاً cause برای بازیابی کد خطایی که توسط Fleet Engine برای بهروزرسانیهای ناموفق موقعیت مکانی برگردانده میشود، استفاده میکنید.
مثال زیر نحوه پیادهسازی StatusListener را نشان میدهد:
class MyStatusListener implements StatusListener {
/** Called when background status is updated during actions such as location reporting. */
@Override
public void updateStatus(
StatusLevel statusLevel, StatusCode statusCode, String statusMsg) {
// Implementation
}
}
// Inject StatusListener into DriverContext.
DriverContextBuilder.setStatusListener(new MyStatusListener());
کد زیر نمونهای از پیادهسازی DriverStatusListener را نشان میدهد:
class MyStatusListener implements DriverStatusListener {
/** Called when background status is updated during actions such as location reporting. */
@Override
public void updateStatus(
StatusLevel statusLevel, StatusCode statusCode, String statusMsg, @Nullable Throwable cause) {
// Existing implementation
if (cause != null && cause instanceof StatusRuntimeException) {
if (Status.NOT_FOUND.getCode().equals(cause.getStatus().getCode())) {
// NOT_FOUND gRPC exception thrown by Fleet Engine.
}
}
}
}
DriverContextBuilder.setStatusListener(new MyStatusListener());
پیادهسازی DriverStatusListener به عنوان یک رابط تابعی
DriverStatusListener درست مانند سلف خود از رابطهای تابعی جاوا پشتیبانی میکند. در اینجا مثالی از آن آورده شده است:
DriverContextBuilder.setDriverStatusListener((statusLevel, statusCode, statusMsg, cause) -> {
if (cause != null && cause instanceof StatusRuntimeException) {
if (Status.NOT_FOUND.getCode().equals(cause.getStatus().getCode())) {
// NOT_FOUND gRPC exception thrown by Fleet Engine.
}
}
});