Release (buraxılış qurması) — tətbiq mağazalarında nəşr üçün hazırlanmış mobil tətbiqin son konfiqurasiyasıdır. Apple Developer Documentation-ya görə, Release qurması kompilyator tərəfindən kod optimallaşdırılması, debug simvollarının silinməsi, obfuskasiya və distributiv sertifikatla rəqəmsal imzanı əhatə edir. Əsas fərq — Release son istifadəçi üçün nəzərdə tutulub, tərtibatçı üçün deyil.
Əsas məqamlar
Release — bütün kompilyator optimallaşdırmalarının tətbiq olunduğu, debug məlumatlarının silindiyi, resursların sıxıldığı və icra olunan kodun əqli mülkiyyəti qorumaq üçün obfuska edildiyi qurma konfiqurasiyasıdır. Release-in məqsədi rəsmi kanallar vasitəsilə paylanmağa hazır olan maksimum sürətli və yığcam ikili fayl əldə etməkdir.
Debug-dan fərqli olaraq, Release qurmasında debugger üçün giriş nöqtələri yoxdur, assertlər söndürülüb və loginq minimuma endirilib. Bu sadəcə bayraq dəyişdirmək deyil — fərqli sertifikatlar, provisioning profile və paketləmə parametrləri olan fərqli qurma pipeline-idir. Release qurması daha çox vaxt tələb edir, çünki kompilyator əlavə optimallaşdırma keçidləri yerinə yetirir.
iOS üçün Release qurması Apple Distribution sertifikatı ilə imzalanır və App Store Connect-də yoxlamadan keçir. Android üçün Release qurması Upload Key ilə imzalanır və Google Play Console-a yüklənə bilər. Hər iki platforma rəqəmsal imza tələb edir: onsız qurulan tətbiq istifadəçinin cihazında quraşdırılmayacaq.
Debug və Release arasındakı fərq bütün səviyyələrdə özünü göstərir: kompilyator bayraqlarından .apk və ya .ipa-nın son ölçüsünə qədər. Bu fərqləri başa düşmək CI/CD pipeline-i və yalnız Release qurmasında özünü göstərən reqressiyaların axtarışı üçün vacibdir.
Release-də kompilyator ölçü (-Os LLVM üçün) və ya sürət (-O2) optimallaşdırmasını aktivləşdirir. Bu, inline funksiyaların yerləşdirilməsi, ölü kodun silinməsi, təlimatların yenidən düzülməsi və dövrlərin aqressiv optimallaşdırılması deməkdir. Debug-da bütün bu mərhələlər buraxılır, bu da kodu daha yavaş edir, lakin mənbə kodu sətirləri ilə maşın təlimatları arasında tam uyğunluğu qoruyur.
ProGuard/R8 (Android) siniflərin, metodların və sahələrin adlarını qısa adlara (a, b, c) dəyişir ki, bu da reverse engineering-i çətinləşdirir və DEX fayl ölçüsünü azaldır. iOS-da ekvivalent funksionallıq Strip Symbols və Swift Symbolication tərəfindən təmin edilir. Reflection və ya XML düzümündə istifadə olunan siniflər üçün keep qaydalarını konfiqurasiya etmək vacibdir, əks halda tətbiq başlanğıcda ClassNotFoundException ilə çökəcək.
| Parametr | Android (Gradle) | iOS (Xcode) |
|---|---|---|
| Optimallaşdırma | minifyEnabled true, proguardFiles | Optimization Level: Fastest, Smallest |
| Obfuskasiya | R8 (standart) | Strip Linked Product, Symbols Hidden |
| İmza | Android Signing Config v2/v3 | Apple Distribution Certificate |
| Resurs sıxılması | shrinkResources true | Asset Catalog Compiler |
| Versiyalama | versionCode, versionName | CFBundleVersion, CFBundleShortVersionString |
Release qurması Debug-dan əhəmiyyətli dərəcədə yığcamdır. Tipik nisbət: Debug versiyası 40–80 MB, Release — 15–30 MB yer tutur. Fərq debug simvollarının (DWARF) silinməsi, resursların sıxılması (aapt2) və DEX obfuskasiyası ilə bağlıdır. İstifadəçilər üçün tətbiq ölçüsü quraşdırma konversiyasının vacib amilidir, buna görə də Release-də ölçü optimallaşdırması məcburi təcrübədir.
Gradle Release versiyasını qurmaq üçün daxili tapşırıqlar təqdim edir: assembleRelease, bundleRelease (AAB üçün) və signingReport. Modul səviyyəsində build.gradle-ın düzgün konfiqurasiyası stabil CI/CD qurmasının əsasıdır. Tipik bir layihə nümunəsində əsas mərhələləri nəzərdən keçirək.
buildTypes daxilində release konfiqurasiyası göstərilir: minification aktivləşdirilir, shrinkResources və proguard qaydaları təyin edilir. signingConfig bloku mütləq storeFile, storePassword, keyAlias və keyPassword-ə istinad etməlidir — bu parametrlər VCS-də saxlanılmamalıdır. CI/CD üçün ətraf mühit dəyişənlərindən və ya Keystore Provisioning Plugin-dən istifadə edin.
android {
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile(
"proguard-android-optimize.txt"
), "proguard-rules.pro"
signingConfig signingConfigs.release
}
}
}
Android App Bundle (AAB) — Google Play-də nəşr üçün tövsiyə olunan formatdır. AAB bir APK deyil, resursların modul dəstini ehtiva edir, ondan Google Play müəyyən cihaz üçün optimallaşdırılmış APK-nı dinamik şəkildə yaradır. ./gradlew bundleRelease əmri AAB, ./gradlew assembleRelease isə yükləmədən əvvəl sınaq üçün universal APK qurur.
İmzalanmış APK/AAB apksigner verify vasitəsilə yoxlanılır. Google Play Console yükləmə zamanı imzanı avtomatik yoxlayır. Android 9-dan (API 28) başlayaraq Google v2 və ya v3 imza sxemlərini tələb edir. Wear OS və Android TV üçün əlavə olaraq rotating key göstərilməklə v3.1 tələb olunur.
Xcode Release versiyasını Archive konfiqurasiyasında qurur — bu sadəcə build deyil, tam pipeline: optimallaşdırma ilə kompilasiya, .xcarchive-ə paketləmə, Distribution sertifikatı ilə imzalama və .ipa-ya ixrac. Proses Product → Archive və ya xcodebuild əmri ilə başladılır.
Edit Scheme → Run → Build Configuration-də son sınaq üçün Release seçin. App Store Connect-ə göndərmək üçün Product menyusundan Archive istifadə edin. Xcode ikili fayl, dSYM və Resource-bundle ehtiva edən .xcarchive yaradır. Arxivdən Ad Hoc, Development və ya App Store distribusiyası üçün .ipa ixrac edilir.
TestFlight App Store Distribution sertifikatı ilə imzalanmış Release qurmalarını qəbul edir. App Store-a göndərilməzdən əvvəl qurma Xcode-da avtomatik yoxlamadan keçir: sertifikatların uyğunluğu, bütün ölçülərdə ikonların mövcudluğu, Info.plist-in düzgünlüyü və ikili faylda emulator arxitekturalarının olmaması yoxlanılır.
# xcodebuild vasitəsilə Release qurulması
xcodebuild archive \
-project MyApp.xcodeproj \
-scheme "MyApp" \
-configuration "Release" \
-archivePath "build/MyApp.xcarchive"
# .ipa-nın App Store üçün ixracı
xcodebuild -exportArchive \
-archivePath "build/MyApp.xcarchive" \
-exportPath "build/" \
-exportOptionsPlist "export.plist"
App Thinning — yüklənən tətbiqin ölçüsünü azaltmaq üçün Apple texnologiyasıdır. App Store-a yükləmə zamanı Apple istifadəçinin konkret cihazı üçün ikili faylı yenidən kompilə edir, istifadə olunmayan arxitekturaları silir. Bitcode (LLVM-nin aralıq təsviri) Release qurmasında aktivləşdirilir, əgər layihə iOS 14+ və Xcode 12+ istifadə edirsə.
Konfiqurasiya səhvləri Release qurması üç kateqoriyaya bölünür: kompilasiya problemləri, imza problemləri və yalnız optimallaşdırmadan sonra özünü göstərən məntiqi səhvlər. Tərtibatçıların Debug-dan Release-ə keçərkən qarşılaşdığı ən çox yayılmış ssenariləri nəzərdən keçirək.
Ən çox yayılmış Android səhvi — minifyEnabled aktivləşdirildikdən sonra başlanğıcda çökmə. Səbəb: R8 reflection vasitəsilə istifadə olunan sinfin adını dəyişib (məsələn, Gson serialization, data class ilə Retrofit @Body). Həll — serializasiyada iştirak edən bütün siniflər üçün -keep qaydası əlavə edin və qurmadan əvvəl proguard qaydalarını yoxlayın.
iOS-da tərtibatçılar tez-tez Archive-dən sonra dSYM fayllarını saxlamağı unudurlar. dSYM olmadan App Store Connect-dən qəza jurnalları oxunan funksiya adları əvəzinə onaltılıq ünvanlar şəklində gəlir. Həll — CI/CD-ni dSYM-ləri .ipa ilə birlikdə arxivləşdirmək və onları App Store Connect-ə yükləmək üçün konfiqurasiya edin.
Müddəti bitmiş Distribution sertifikatı və ya provisioning profile-də yanlış App ID — App Store Connect-in qurmanı qəbul etməməsinin səbəbi. Sertifikatlar 1 il (Apple) və ya 3 il (Google) etibarlıdır və onların yenilənməsi buraxılış təqviminə daxil edilməlidir. Hər Release qurmasından əvvəl sertifikat statusunun yoxlanılması CI/CD pipeline-də məcburi addımdır.
Debug-dan Release-ə keçərkən tez-tez rast gəlinən problem — hədəf ƏS versiyasında mövcud olmayan API-lərdən istifadə. Debug-da qurma bütün yeni API-lərin mövcud olduğu ən son versiya ilə simulyatorda sınaqdan keçirilir. Release-də tətbiq müxtəlif ƏS versiyaları olan istifadəçi cihazlarında quraşdırılır və mövcud olmayan API-nin çağırılması başlanğıcda çökməyə səbəb olur. Minimal versiyanı açıq şəkildə göstərmək üçün @available (Swift) və ya compileSdkVersion + minSdkVersion (Android) istifadə edin.
Debug qurmasında resurslar çox vaxt konfiqurasiyanı yoxlamadan mənbə kataloqlarından yüklənir. Release-də Gradle və Xcode resurs filtrləmə tətbiq edir: əgər string və ya drawable hədef lokallaşdırmada tapılmazsa, tətbiq ya çökür, ya da placeholder göstərir. Bu xüsusilə Android üçün vacibdir: values-XX-də tərcümənin olmaması XML-in pars edilməsi zamanı ClassCastException-a səbəb olur. Buraxılış qurmasından əvvəl lint və xcodebuild -showBuildSettings istifadə edərək bütün lokallaşdırmaları yoxlayın. Bu cür problemləri aşkar etmək üçün ictimai buraxılışdan əvvəl TestFlight və Internal Testing track-dan istifadə edin — onlar müxtəlif dil parametrləri olan real cihazlarda işləyir.
Tez-tez verilən suallar
Texniki olaraq bəli, əgər cihazda simvollar aktivləşdirilmiş Ad Hoc Release qurması quraşdırılıbsa. Amma praktikada bu əlverişsizdir: optimallaşdırılmış kod təlimatları yenidən düzür, dayanma nöqtələri yerdəyişir və lokal dəyişənlər kompilyator tərəfindən silinə bilər.
iOS simulyatoru Apple Silicon-un bütün optimallaşdırmalarını dəstəkləmir, buna görə də bəzi Release bayraqları (məsələn, LTO) linkinq xətalarına səbəb ola bilər. Release qurmasını sınamaq üçün fiziki cihaza sonrakı ixrac ilə Archive istifadə edin.
Split APK — tətbiqi arxitektura üzrə (arm64-v8a, armeabi-v7a, x86) bir neçə APK-ya bölmək üçün Android mexanizmidir. Müasir inkişafda split APK əvəzinə hər cihaz üçün optimallaşdırılmış qurma avtomatik yaradan Android App Bundle (AAB) tövsiyə olunur.
TestFlight (iOS) və ya Internal Testing Track (Google Play) vasitəsilə staging sınağı keçirin. Avtorizasiyanı, ödənişləri, push bildirişlərini və fayl sistemi ilə işi yoxlayın — bu ssenarilər tez-tez imza və icazələrdəki fərqlər səbəbindən Debug və Release-də fərqli davranır.
Android-də R8 tam rejimindən, iOS-da App Thinning-dən istifadə edin. İstifadə olunmayan resursları silin (shrinkResources), PNG-ni WebP ilə əvəz edin, kitabxana dublikatları üçün asılılıqları yoxlayın və ProGuard-ı ölü kodun aqressiv silinməsi üçün konfiqurasiya edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun