Unreal Engine'deki temel oyun mantığınız C++ veya Blueprint ile yazılmış olsa da Android paketleme, GameActivity yaşam döngüsü olaylarını, Google Play Hizmetleri'ni, faturalandırmayı, ses ve analiz eklentilerini işlemek için Java ve Kotlin bayt kodunu (classes.dex) derler.
Android Gradle eklentisindeki (AGP) varsayılan kod küçültücü ve optimize edici olan R8, kullanılmayan sınıfları ve yöntemleri kaldırıp bayt kodunu optimize eder. Bu sayede hem paket indirme boyutunuz küçülür hem de bellekle eşlenen (mmap) DEX sayfalarının çalışma zamanı bellek kullanımı ve temel Java işlemi ek yükü azalır. Böylece fiziksel bellek baskısı ve düşük bellek sonlandırıcısı (LMK) sonlandırmaları hafifler. Google Play, Android vitals'daki DEX kodu optimizasyonu metriği aracılığıyla oyununuzun DEX optimizasyon seviyelerini de izler.
Varsayılan davranış ve Unreal Engine sürüm desteği
UE 4.22.0 sürümünden itibaren Unreal Engine'in UEDeployAndroid.cs özelliği, varsayılan olarak oluşturulan Android yayınlanan derleme yapılandırmasına (buildAdditions.gradle) minifyEnabled true ekler. UE 4.25, paketlenmiş araç zincirini AGP 4.0.0'a yükselttiği için R8, UE 4.25 ve sonraki sürümlerdeki tüm Sürüm (Sevkiyat ve Dağıtım) derlemelerinde varsayılan olarak etkindir (true). Ek kurulum gerekmez.
| Unreal Engine sürümü | Paket halinde sunulan AGP | Varsayılan sürüm | Varsayılan hata ayıklama | Davranış |
|---|---|---|---|---|
| UE 4.21 ve önceki sürümler | Eski Gradle veya Ant | Devre dışı (false) |
Devre dışı (false) |
Motor tarafından eklenen minifyEnabled yapılandırması yok. |
| UE 4.22 - 4.24 | 3.4'ten önceki sürümler | Etkin (ProGuard) | Devre dışı (false) |
minifyEnabled true, yayınlanan derlemelerde varsayılan olarak etkindir (ProGuard'ı çalıştırır). |
| UE 4.25 - 5.3 | 4.0.0 | Etkin (R8) | Devre dışı (false) |
AGP 4.0, yayınlanan derlemelerde varsayılan olarak R8'i çalıştırır. |
| UE 5.4 - 5.7 | 7.4.2 | Etkin (R8) | Devre dışı (false) |
AGP 7.x, eski useProguard seçeneklerini kaldırır ve yalnızca R8 çalışır. |
| UE 5.8 (5.8.3+) | 8.13.0 | Etkin (R8) | Devre dışı (false) |
Varsayılan olarak AGP 8.x ve modern R8 optimizasyon ardışık düzenlerini kullanır. |
Sürüm ve hata ayıklama derlemesi farklılıkları
UnrealBuildTool (UEDeployAndroid.cs), oluşturulan buildAdditions.gradle dosyasını Yayın ve Hata Ayıklama derlemeleri için farklı şekilde yapılandırır:
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
signingConfig signingConfigs.debug
}
}
- Sürüm (Gönderim veya Dağıtım):
minifyEnabled truedeğerini ayarlar ve varsayılan olarakproguard-rules.prodeğerini uygular. R8 kod daraltma ve kod karartma işlemlerini çalıştırır. - Hata ayıklama (Geliştirme): Hızlı derleme iterasyonunu ve sembol hata ayıklamasını korumak için
debuggable true'yi etkinleştirir veminifyEnabled'yi atlar (varsayılan olarakfalse).
Unreal Plugin Language (UPL) kullanarak saklama kuralları ekleme
R8, UE 4.25 ve sonraki sürümlerde yayınlanan derlemelerde otomatik olarak çalıştığından yalnızca C++ JNI (JNIEnv->FindClass, GetMethodID) veya manifest aracılığıyla erişilen Java sınıflarını korumanız gerekir. Java çağrı siteleri olmayan sınıflar kullanılmamış olarak değerlendirilir ve R8 tarafından kaldırılır. Bu durum, geliştirme derlemelerinde çalışan özelliklerin, gönderim derlemelerinde ClassNotFoundException veya NoSuchMethodError ile başarısız olmasına neden olabilir.
Paketleme sırasında özel saklama kurallarını proguard-rules.pro ile birleştirmek için bir Unreal Plugin Language (UPL) XML dosyasında <proguardAdditions> etiketini kullanın. Aşağıdaki bloğu projenize veya eklenti *_UPL.xml dosyasına ekleyin:
<root xmlns:android="http://schemas.android.com/apk/res/android">
<proguardAdditions>
<insert>
-keep class com.epicgames.unreal.** { *; }
-keep class com.example.plugin.** { public *; }
-dontwarn com.example.plugin.**
</insert>
</proguardAdditions>
</root>
Sık karşılaşılan sorunları giderme
Bu bölümde, Unreal Engine'de R8 kullanılırken karşılaşılan yaygın paketleme ve çalışma zamanı sorunlarının nasıl çözüleceği açıklanmaktadır.
Hata ayıklama için R8'i geçici olarak devre dışı bırakma
Yalnızca sürümde görülen bir kilitlenmenin, R8'in gerekli sınıfları kaldırmasından kaynaklanıp kaynaklanmadığını belirlemek için UPL dosyanızda <gradleProperties> altına DISABLE_MINIFY=1 ekleyin.
Mevcut olduğunda UEDeployAndroid.cs, minifyEnabled false oluşturur:
<gradleProperties>
<insert>
DISABLE_MINIFY=1
</insert>
</gradleProperties>
Missing classes detected while running R8 paketleme hatası
UE 5.4 ve sonraki sürümlerde (AGP 7.4.2 ve sonraki sürümler) R8, eksik sınıf kontrollerini sıkı bir şekilde uygular. Paketleme bu hatayla başarısız olursa ara derleme dizininizdeki (Intermediate/Android/.../gradle/app/build/outputs/mapping/release/missing_rules.txt altında) missing_rules.txt dosyasını inceleyin ve eksik kitaplık bağımlılıklarını veya gerekli kuralları UPL dosyanızdaki <proguardAdditions> bölümüne ekleyin.
Üçüncü taraf SDK'larıyla R8 tam mod uyumluluğu
UE 5.8 ve sonraki sürümlerde (AGP 8.13.0+), daha agresif optimizasyonlar gerçekleştirmek için R8 tam modu varsayılan olarak etkindir. Eski bir üçüncü taraf Android SDK'sı, yansıma sorunları nedeniyle çalışma zamanında başarısız olursa eklentinin ProGuard kurallarını güncelleyin veya UPL dosyanıza aşağıdaki özelliği ekleyerek R8'i uyumluluk moduna geri döndürün:
<gradleProperties>
<insert>
android.enableR8.fullMode=false
</insert>
</gradleProperties>