-keep qoidalari, Reflection muammolari, mapping.txt va deobfuskatsiya amaliyoti
10-sinfAdvanced Android2-hafta · 6-darsRefleksiya (Reflection) mexanizmi va uning R8 bilan to'qnashuvi.
proguard-rules.pro fayli sintaksisi va -keep turlari.
@Keep annotatsiyasi va mapping.txt deobfuskatsiyasi.
Gson / Moshi DTO modellarini R8 dan himoyalash.
Crashlytics chalkash stacktrace hisobotlarini o'qish (Retrace).
Dinamik aktivlar uchun keep.xml faylini sozlash.
Ilovani Debug rejimda ishga tushirsangiz, barcha ma'lumotlar serverdan keladi va chiroyli chiqadi.
Lekin assembleRelease orqali APK yig'ib telefonga o'rnatganda ilova to'satdan qulaydi (Crash).
R8 koddagi data class maydonlarini «foydalanilmagan» deb hisoblab o'chirgan yoki ularni a, b ga aylantirgan.
JSON o'quvchi kutubxona esa kalitlarni topa olmay qolgan!
-keep direktivalari va R8 ga aniq yo'l ko'rsatish
Bu app/ papkasida joylashgan maxsus qoidalar fayli.
Undan maqsad: R8 ga qaysi klasslar va metodlarni aslo o'chirmaslik va chalkashtirmaslikni qat'iy buyurish.
Butun ilovani obfuskatsiyasiz qoldirish xavfsizlikka ziyon.
Biz faqat refleksiya orqali chaqiriladigan DTO modellar va tashqi API interfeyslarini saqlaymiz.
# Bitta klassni saqlash
-keep class com.xorazmiy.app.models.User { *; }
# Butun paket va barcha quyi paketlarni saqlash
-keep class com.xorazmiy.app.models.** { *; }
class so'zidan keyin to'liq paket yo'li ko'rsatiladi.
{ *; } qismi klass ichidagi barcha maydonlar va metodlarni to'liq saqlab qolishni bildiradi.
Faqat ko'rsatilgan paketning to'g'ridan-to'g'ri o'zidagi klasslarga ta'sir qiladi.
# Faqat models/ papkasi ichidagi klasslar
-keep class com.xorazmiy.app.models.* { *; }
Quyi papkalardagi klasslar himoyalanmaydi!
Paket va uning ichidagi BARCHA quyi paketlarni (sub-packages) chuqur qamrab oladi.
# models, models.dto, models.auth va hk.
-keep class com.xorazmiy.app.models.** { *; }
Amaliyotda eng ko'p ishlatiladigan xavfsiz usul.
Serverdan keladigan barcha JSON modellarini bitta umumiy paketga yig'ing (masalan, data.model).
app/proguard-rules.pro fayliga -keep class com.app.data.model.** { *; } qatorini qo'shing.
Terminalda ./gradlew assembleRelease buyrug'i orqali optimallashtirishni bajaring.
APK Analyzer yoki emulyatorda ilovaning tarmoq so'rovlarini to'liq sinovdan o'tkazing.
Klass nomini obfuskatsiya qilish xavfsizlikni kuchaytiradi, faqat JSON o'qiydigan maydonlar o'zgarmasligi lozim.
-keepclassmembers class * {
@com.google.gson.annotations.SerializedName <fields>;
}
R8 har bir klassni ko'radi: agar maydon tepasida @SerializedName bo'lsa, uning nomiga teginmaydi.
Qolgan biznes mantiq klasslari esa to'liq obfuskatsiya qilinadi!
Toza kod yozish va chalkash xatoliklarni deobfuskatsiya qilish
AndroidX annotatsiyalar kutubxonasini build.gradle.kts ga kiritamiz:
dependencies {
implementation("androidx.annotation:annotation:1.7.1")
}
Har safar proguard-rules.pro ga yozib o'tirmay, model tepasiga @Keep qo'yiladi:
import androidx.annotation.Keep
@Keep
data class UserOrder(
val orderId: String,
val totalAmount: Double
)
app/build/outputs/mapping/release/mapping.txt
Bu fayl faqat isMinifyEnabled = true bo'lganda va Release yig'ilganda generatsiya qilinadi.
Har bir Play Store'ga chiqarilgan versiyaning mapping.txt faylini maxsus arxivda saqlang.
Agar bu fayl yo'qolsa, release foydalanuvchilaridagi xatolarni o'qib bo'lmaydi!
java.lang.NullPointerException:
at c.a.b.d.a(Unknown:14)
at com.app.ui.b.c(Source:45)
Qaysi funksiya buzilganini bilib bo'lmaydi.
java.lang.NullPointerException:
at AuthService.loginUser()
at LoginViewModel.execute()
Google Play Console va Crashlytics mapping orqali asl kodni ko'rsatadi.
keep.xml, dinamik resurslar va -dontwarn qoidalari
Katta kutubxonalar (masalan, Retrofit yoki OkHttp) platformaning boshqa versiyalari uchun yozilgan sinflarga murojaat qilishi mumkin.
R8 ularni topolmay «Warning» beradi va build to'xtab qoladi.
# Keraksiz ogohlantirishlarni e'tiborsiz qoldirish
-dontwarn okio.**
-dontwarn retrofit2.**
Faqat o'zingiz ishonch hosil qilgan tashqi kutubxonalar uchun qo'llang.
Qulaylik: @Keep annotatsiyasi to'g'ridan-to'g'ri kodda turadi. Paket nomi o'zgarsa ham qoida buzilmaydi.
Arxiv: Har bir APK versiyasi bilan uning mapping.txt fayli saqlanmasa, kelajakdagi xatolarni o'qib bo'lmaydi.
Resurs: keep.xml da tools:shrinkMode="strict" yoqilsa, faqat qat'iy ro'yxatdagi fayllar saqlanadi.
Loyihangizda User nomli model yarating va proguard-rules.pro ga -keep qoidasini qo'shing.
./gradlew assembleRelease qiling va app/build/outputs/mapping/release/mapping.txt faylini ochib ko'ring.
Gson, Moshi va Retrofit modellari uchun @Keep yoki -keep qo'llash shart.
Har bir release versiya xaritasini arxivlang, deobfuskatsiya uchun zarur.
Agar matn orqali rasm yuklasangiz, res/raw/keep.xml dan foydalaning.
Har safar release yig'ilganda emulyator yoki real telefonda to'liq test qiling.
3 ta data class model yaratish va ularni -keep hamda @Keep bilan himoyalash.
Release build qilib, mapping.txt dagi o'zgarishlarni tahlil qilish.
Keyingi hafta: Git bilan versiya nazorati asoslari va GitHub bilan ishlash!