AXV

ProGuard va R8 qoidalari bilan ishlash

-keep qoidalari, Reflection muammolari, mapping.txt va deobfuskatsiya amaliyoti

10-sinfAdvanced Android2-hafta · 6-dars

Darsning maqsadi va reja

O'rganiladigan tushunchalar

Refleksiya (Reflection) mexanizmi va uning R8 bilan to'qnashuvi.

proguard-rules.pro fayli sintaksisi va -keep turlari.

@Keep annotatsiyasi va mapping.txt deobfuskatsiyasi.

Amaliy ko'nikmalar

Gson / Moshi DTO modellarini R8 dan himoyalash.

Crashlytics chalkash stacktrace hisobotlarini o'qish (Retrace).

Dinamik aktivlar uchun keep.xml faylini sozlash.

Muammo: Debug ishlaydi, Release qulaydi!

Kutilmagan xatolik

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).

Asl sabab nima?

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!

Refleksiya va R8 to'qnashuvi qanday yuz beradi?

SERVER JSON "id": 101, "username": "ali", "email": "[email protected]" Matnli kalitlar orqali qidiradi Gson / Moshi Reflection R8 OBUSKATSIYA class a { val a: Long val b: String (username o'rniga) } Kutilmagan NullPointerException!
01

proguard-rules.pro Sintaksisi

-keep direktivalari va R8 ga aniq yo'l ko'rsatish

proguard-rules.pro nima?

R8 uchun yo'riqnoma

Bu app/ papkasida joylashgan maxsus qoidalar fayli.

Undan maqsad: R8 ga qaysi klasslar va metodlarni aslo o'chirmaslik va chalkashtirmaslikni qat'iy buyurish.

Selektiv himoya

Butun ilovani obfuskatsiyasiz qoldirish xavfsizlikka ziyon.

Biz faqat refleksiya orqali chaqiriladigan DTO modellar va tashqi API interfeyslarini saqlaymiz.

Eng muhim direktiva: -keep

Sintaksis tuzilishi

# Bitta klassni saqlash
-keep class com.xorazmiy.app.models.User { *; }

# Butun paket va barcha quyi paketlarni saqlash
-keep class com.xorazmiy.app.models.** { *; }

Bu nimani anglatadi?

class so'zidan keyin to'liq paket yo'li ko'rsatiladi.

{ *; } qismi klass ichidagi barcha maydonlar va metodlarni to'liq saqlab qolishni bildiradi.

Wildcards: * va ** farqi

Bitta yulduzcha (*)

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!

Ikkita yulduzcha (**)

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.

ProGuard qoidasini kiritish bosqichlari

1

Model paketini aniqlash

Serverdan keladigan barcha JSON modellarini bitta umumiy paketga yig'ing (masalan, data.model).

2

rules.pro faylini ochish

app/proguard-rules.pro fayliga -keep class com.app.data.model.** { *; } qatorini qo'shing.

3

Release yig'ish

Terminalda ./gradlew assembleRelease buyrug'i orqali optimallashtirishni bajaring.

4

APK ni tekshirish

APK Analyzer yoki emulyatorda ilovaning tarmoq so'rovlarini to'liq sinovdan o'tkazing.

-keepclassmembers va @SerializedName

Nafis optimallashtirish

Klass nomini obfuskatsiya qilish xavfsizlikni kuchaytiradi, faqat JSON o'qiydigan maydonlar o'zgarmasligi lozim.

-keepclassmembers class * {
    @com.google.gson.annotations.SerializedName <fields>;
}

Qanday ishlaydi?

R8 har bir klassni ko'radi: agar maydon tepasida @SerializedName bo'lsa, uning nomiga teginmaydi.

Qolgan biznes mantiq klasslari esa to'liq obfuskatsiya qilinadi!

02

@Keep Annotatsiyasi va mapping.txt

Toza kod yozish va chalkash xatoliklarni deobfuskatsiya qilish

@Keep: Faylsiz to'g'ridan-to'g'ri kodda himoyalash

Kutubxonani ulash

AndroidX annotatsiyalar kutubxonasini build.gradle.kts ga kiritamiz:

dependencies {
    implementation("androidx.annotation:annotation:1.7.1")
}

Klassga qo'llash

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
)

mapping.txt: Chalkash kod xaritasi qanday ishlaydi?

ASL KOD (SRC) AuthService .login() UserViewModel .loadProfile() R8 ENGINE Release APK Klasslar: a.a, b.c mapping.txt Tarjima lug'ati AuthService -> a.a CRASH RETRACE Xatolik: a.a.b() + mapping.txt = AuthService .login() : 34-qator

mapping.txt fayli qayerda joylashadi?

Fayl manzili

app/build/outputs/mapping/release/mapping.txt

Bu fayl faqat isMinifyEnabled = true bo'lganda va Release yig'ilganda generatsiya qilinadi.

Oltin qoida: Saqlab qo'ying!

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!

Chalkash Stacktrace'ni Retrace qilish

Shifrlangan log (Obfuscated)

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.

Retrace qilingan log

java.lang.NullPointerException:
    at AuthService.loginUser()
    at LoginViewModel.execute()

Google Play Console va Crashlytics mapping orqali asl kodni ko'rsatadi.

03

Resurslar va Maxsus Holatlar

keep.xml, dinamik resurslar va -dontwarn qoidalari

Resurslarni himoyalash: keep.xml

Dinamik chaqiriladigan rasm // Matn orqali resurs qidirish: val resId = resources.getIdentifier( "flag_" + countryCode, "drawable", ... ) R8 buni to'g'ridan-to'g'ri ko'ra olmaydi! res/raw/keep.xml orqali saqlash <resources xmlns:tools="..." tools:keep="@drawable/flag_*" tools:shrinkMode="strict" /> Barcha bayroq rasmlari saqlanadi!

-dontwarn: Qachon ishlatiladi?

Ogohlantirishlarni bostirish

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.

Yechim qoidasi

# Keraksiz ogohlantirishlarni e'tiborsiz qoldirish
-dontwarn okio.**
-dontwarn retrofit2.**

Faqat o'zingiz ishonch hosil qilgan tashqi kutubxonalar uchun qo'llang.

Release APK Tayyorlash va Tekshirish Sikli

1. Minify Yoqish isMinifyEnabled isShrinkResources 2. ProGuard Qoida DTO modellar @Keep / -keep 3. Release Build assembleRelease mapping.txt saqlash 4. Test & Audit APK Analyzer JSON Sinovi

ProGuard sirlari (Kartalarni bosing)

-keep vs @Keep

bosing

Qulaylik: @Keep annotatsiyasi to'g'ridan-to'g'ri kodda turadi. Paket nomi o'zgarsa ham qoida buzilmaydi.

mapping.txt taqdiri

bosing

Arxiv: Har bir APK versiyasi bilan uning mapping.txt fayli saqlanmasa, kelajakdagi xatolarni o'qib bo'lmaydi.

Strict Mode

bosing

Resurs: keep.xml da tools:shrinkMode="strict" yoqilsa, faqat qat'iy ro'yxatdagi fayllar saqlanadi.

Tezkor bilim sinovi

Nima sababdan Release APK da Gson bilan olingan model maydonlari null bo'lib qoladi?
Telefonda internet bo'lmagani uchun
R8 model maydonlarini obfuskatsiya qilib, nomlarini o'zgartirib yuborgani sababli
Gradle versiyasi juda yangi bo'lgani uchun
Model klassi data class emas, oddiy class bo'lgani uchun

Sinfdagi amaliy topshiriq

1. Modelni himoyalash

Loyihangizda User nomli model yarating va proguard-rules.pro ga -keep qoidasini qo'shing.

2. mapping.txt tahlili

./gradlew assembleRelease qiling va app/build/outputs/mapping/release/mapping.txt faylini ochib ko'ring.

Darsning 4 oltin qoidasi

1. Modellarni doim himoyalang

Gson, Moshi va Retrofit modellari uchun @Keep yoki -keep qo'llash shart.

2. mapping.txt ni saqlang

Har bir release versiya xaritasini arxivlang, deobfuskatsiya uchun zarur.

3. Dinamik resurslarni biling

Agar matn orqali rasm yuklasangiz, res/raw/keep.xml dan foydalaning.

4. Release ni sinovsiz chiqarmang

Har safar release yig'ilganda emulyator yoki real telefonda to'liq test qiling.

Uyga vazifa va anons

1. Modellarni himoyalash

3 ta data class model yaratish va ularni -keep hamda @Keep bilan himoyalash.

2. mapping.txt tahlili

Release build qilib, mapping.txt dagi o'zgarishlarni tahlil qilish.

Keyingi hafta: Git bilan versiya nazorati asoslari va GitHub bilan ishlash!