Avtorizatsiyadan o'tgan holatlar uchun Baseline Profile yaratish
Baseline Profile nima o'zi
Baseline Profile — Android'da performance'ni oshirishning eng oson yo'llaridan biri. G'oyasi oddiy: ilovangiz asosiy foydalaniladigan oynalarida qaysi klass va metodlardan foydalanishini yozib olasiz, shu ro'yxatni APK ichiga joylaysiz, va ART(Android Runtime) install paytida o'sha classlarni oldindan kompilyatsiya qilib qo'yadi. Natijada — cold start tezlashadi. Chunki agar bu ishni qilmasangiz, android just-in-time kompilyator ishlatadi va bu biroz vaqt olishi mumkin.
Hozirgi zamonaviy Android versiyalarda ko'p foydalaniladigan ilovalarni bir necha marta ishlatganda eng muhim joylari kompilyatsiya qilib qo'yiladi, shuning uchun 2-, 3- ochishlar tez bo'ladi. Baseline profile bilan esa siz 1-ochishdayoq eng optimal performance taqdim etasiz
Ularni generatsiya qilishning asosiy yo'li — Baseline Profile Gradle plugin. Siz Macrobenchmark test yozasiz, u UI Automator yordamida ilovangizni qurilmada ochadi, va yig'ilgan profil baseline-prof.txt fayliga yoziladi.
Muammo
Hozir ishlayotgan bank ilovamizda ham ushbu funksionallik bor. Men gradle command ni ishga tushirdim va kuzatdim:
./gradlew :app:generateReleaseBaselineProfile
Ilova ochildi, onboarding ekranini ko'rsatdi va yopildi. Butun jarayon shu bo'ldi.
Aslida o'ylab ko'rsangiz, mantiqan to'g'ri: generator ilovani toza, logindan o'tmagan holatda ishga tushiradi. Toza holatda esa faqat onboarding va login ekranlariga yetib borish mumkin. Shuning uchun bizning profilimiz aynan shularni qamrab oldi, xolos. Asosiy sahifa, pul o'tkazmalari, to'lovlar, karta boshqaruvi — foydalanuvchilar asosiy vaqtini o'tkazadigan ekranlar — profilda umuman yo'q edi.
Nega loginni avtomatlashtirmadim
Birinchi kelgan fikr eng oddiysi edi: loginni Macrobenchmark test ichida avtomatlashtirish. Lekin banking ilovasi uchun bu g'oyaning har bir varianti muammoli:
- Haqiqiy test credential'lar — repo ichida ishlaydigan bank logini turadi va avtomatlashtirilgan holda ishlatiladi. Bu xavfsizlik jihatdan ham xato, yana bizda loginda Face ID qismi bor, avtomatlashtirish qiyin bo'ladi.
- Testlar uchun login backdoor — Bu ham xavfsizlik jihatdan xato degan fikr keldi
- Alohida build flavor ortidagi soxta login — Bu yerda biz qandaydir "fake" login qilgandek ko'rsatib, asosiy ekranlar bo'yicha yurib chiqishimiz mumkin. Lekin, asosiy muammo ilova kodiga katta o'zgartirishlar kiritiladi, keyin uni yana har doim "maintain" ham qilish kerak.
Uchala variantda ham "tooling"ni qanoatlantirish uchun ilovaning kodini o'zgartirish kerak. Aslida teskarisi bo'lishi kerak —"tooling" ilovaga moslashishi kerak.
Asosiy tushuncha
Biroz izlanishdan keyin hammasi oydinlashdi: Gradle plugin va UI Automator — bular shunchaki qulaylik uchun qatlam. Profil ma'lumotlarining asl manbasi — ART'ning o'zi. Runtime qaysi klass va metodlar ishlayotganini doim yozib boradi, ilovani kim boshqarayotganidan qat'i nazar (haqiqiy inson yoki UI automator farqi yo'q).
Haqiqiy inson sifatida, biz login qismlaridan o'ta olamiz, ilovaning hamma kerakli muhim joylarini ishlatib ko'rishimiz mumkin, va shu bilan bir vaqtda bizning harakatimizga qarab baseline profile yaratiladi.
Reja shunday bo'ldi: avtomatlashtirishni chetga surib, ilovani qo'lda aylanib chiqamiz va ART profilini to'g'ridan-to'g'ri adb orqali olamiz.
Qadamlar ketma-ketligi
Profil dump komandalar uchun sizga Android 14+ (API 34+) qurilma kerak bo'ladi.
# 1. Profileable, lekin debuggable bo'lmagan variantni build qilamiz
./gradlew :app:assembleNonMinifiedRelease
# 2. O'rnatamiz
adb install app/build/outputs/apk/nonMinifiedRelease/app-nonMinifiedRelease.apk
# 3. Toza holatdan boshlash uchun eski profil ma'lumotlarini tozalaymiz
adb shell pm art clear-app-profiles com.example.bank
# 4. Ilovadan oddiy foydalanuvchi kabi foydalanamiz:
# login qilamiz, biometriyadan o'tamiz, kerakli barcha flow'larni aylanib chiqamiz
# 5. Yozib olingan profilni dump qilib, kompyuterga olamiz
adb shell cmd package dump-profiles --dump-classes-and-methods com.example.bank
adb pull /data/misc/profman/com.example.bank-primary.prof.txt
# 6. Faylni app/src/release/generated/baselineProfiles/baseline-prof.txt o'rniga qo'yib, commit qilamiz
cp com.example.bank-primary.prof.txt app/src/release/generated/baselineProfiles/baseline-prof.txt
Bitta muhim detal: standart Gradle task'ni baribir ishga tushiramiz, chunki u yaxshi startup-prof.txt generatsiya qiladi — logindan o'tmagan startup yo'li har bir foydalanuvchi uchun bir xil. Faqat u generatsiya qilgan baseline-prof.txt'dan foydalanmaymiz, chunki bu fayl faqat logindan oldingi holatni biladi. Uning o'rniga qo'lda yig'ilgan profilni saqlaymiz.
Profillarni yangilab turish: Fastlane
Qo'lda generatsiya qilingan profillarning asosiy muammosi "inson omili" dir. Bir necha relizdan keyin, yoki jamoada dasturchilar almashsa, bu qilingan usul unutilib ketishi mumkin.
Shuning uchun bu jarayonni release qilish jarayoniga qo'shdim. Bizda relizlarda Fastlane dan foydalanamiz. Har safar reliz komandasi berilishidan oldin, biz reliz qilayotgan odamdan baseline profillar yangilandimi yoki yo'qmi tasdiqlab olamiz.
up_to_date = UI.confirm("Baseline profillar yangilanganiga ishonchingiz komilmi?")
unless up_to_date
UI.user_error!("Avval baseline profillarni yangilang, keyin lane'ni qayta ishga tushiring.")
end
Oddiy yechim, lekin endi profillarni yangilash release o'tkazib yubora olmaydigan qadamga aylandi. Va hech kim adb komandalarini yodlab yurishi shart emas — jarayon nimani ishga tushirish kerakligini o'zi ko'rsatib beradi.
Natijalar va kamchiliklar
Qamrov ~50 ming qatordan ~107 ming qatorga oshdi — ikki baravardan ko'proq. Endi profilda faqat onboarding emas, login va asosiy autentifikatsiyadan keyingi oynalar ham bor.
Albatta, bu yondashuvning o'z kamchiliklari bor:
- Jarayon qo'lda bajariladi, ya'ni CI'da avtomatlashtirib bo'lmaydi — profil sifati kerakli oynalarni to'g'ri aylanib chiqqan odamga bog'liq.
- Aylanib chiqishda biror ekranni o'tkazib yuborsangiz, o'sha ekran profilga tushmaydi.
- Fastlane'dagi kabi tekshiruv bo'lmasa, ilova rivojlangan sari profil sezdirmasdan eskirib boradi.
Agar ilovangizdagi loginni xavfsiz avtomatlashtirish mumkin bo'lsa — test muhiti, bir martalik credential'lar, biometriya to'sig'i yo'q — Macrobenchmark yo'li baribir yaxshiroq yechim.
Xulosa
UI Automator — shunchaki qulaylik uchun xolos. ART ilovani kim boshqarishidan qat'i nazar profilni yig'ib boraveradi. Automator sizning login ekraningizdan o'ta olmasa, bir qatlam pastga tushib, ma'lumotni to'g'ridan-to'g'ri olishingiz mumkin.
Agar Baseline Profile'laringiz shubhali darajada kichik ko'rinsa va ilovangizda login ekrani bo'lsa — generatoringiz aslida nimani ko'rayotganini tekshirib ko'ring. Balki u faqat login ekranini profillayotgandir.