APK yaratish muhiti

APK yaratish muhiti

- Windows’da React Native APK yo‘lining uzunlik cheklovlarini qanday tuzatish mumkin -

1. Xulosa

Windows’da Expo CNG asosidagi React Native ilovasi uchun Android APK yaratish quyidagi tarzda muvaffaqiyatsiz yakunlanishi mumkin.

ninja: error: Stat(...): Filename longer than 260 characters

Bu muammo ilova kodi tufayli emas, balki Windows’dagi yo‘l uzunligi cheklovlari va CMake/Ninja tomonidan yaratiladigan native build artefaktlarining yo‘l tuzilishi tufayli yuzaga keladi.

Quyidagi uchta yechim tavsiya etiladi.

  1. Loyiha ildizida Junction yarating va build’ni ishga tushirish uchun foydalaniladigan yo‘lni qisqartiring.

  2. CMake’ning buildStagingDirectory qiymatini qisqa absolyut yo‘lga o‘zgartiring.

  3. Mavjud .cxx keshini o‘chirib, to‘liq qayta build qiling.

Junction 생성 → buildStagingDirectory 지정 → android/app/.cxx 삭제 → 재빌드

subst virtual disklar yo‘llarni qisqartirishi mumkin, ammo ular tavsiya etilmaydi, chunki Metro, realpath va Gradle keshi yo‘llari aralashib ketib, boshqa muammolarni keltirib chiqarishi mumkin.

2. Sabab

Windows’dagi umumiy Win32 yo‘l uzunligi cheklovi MAX_PATH bo‘lib, u 260 ta belgidan iborat. Windows Long Path qo‘llab-quvvatlashi yoqilgan bo‘lsa ham, bu imkoniyatdan foydalanishga tayyorlanmagan vositalar uzun yo‘llar bilan ishlashda xatoga uchrashi mumkin.

React Native’ning New Architecture arxitekturasi yoki avtomatik bog‘langan native modullar CMake va Ninja orqali C++ kodini build qiladi. Bu jarayonda obyekt fayllari yo‘llari nihoyatda uzun bo‘lib ketishi mumkin.

<빌드 스테이징 경로>/<빌드 타입>/<해시>/<ABI>/
<target>_autolinked_build/CMakeFiles/<target>.dir/
<원본 소스 경로를 포함한 경로>

Xususan, node_modules ichidagi uzun C++ manba yo‘llari obyekt fayllari yo‘llariga yana qo‘shiladi. Loyiha yo‘li chuqur ichma-ich joylashganida va react-native-screens, safe-area-context kabi native paketlar qo‘shilganida, 260 ta belgi cheklovidan osonlik bilan oshib ketish mumkin.

Quyida har bir staging joylashuvi uchun eng uzun obyekt fayli yo‘llariga misollar keltirilgan.

Build yo‘li

Eng uzun obyekt yo‘li

Natija

Oddiy loyiha yo‘li + standart .cxx

331 ta belgi

Muvaffaqiyatsiz

Junction yo‘li + standart .cxx

290 ta belgi

Muvaffaqiyatsiz

Junction yo‘li + qisqa staging yo‘li

248 ta belgi

Muvaffaqiyatli

Faqat loyiha ildizini qisqartirish yetarli emas; CMake’ning oraliq artefaktlari joylashuvini ham qisqartirish kerak.

3. Amalga oshirish

3.1 Junction yaratish

Agar loyiha uzun yo‘lda joylashgan bo‘lsa, Junction yordamida monorepo ildizini qisqa yo‘lga bog‘lang.

cmd /c mklink /J C:\v "C:\Users\<사용자>\<긴 경로>\<프로젝트 루트>"

Shundan so‘ng native build’ni Junction yo‘lidan ishga tushiring.

C:\v\<프로젝트 경로>

Junction bir xil volume’dagi haqiqiy katalog yozuvi sifatida ishlaydi. subst alohida yaratiladigan virtual disk ildizidan farqli ravishda, fayl tizimi yo‘llarining yanada izchil aniqlanishini ta’minlaydi.

3.2 CMake staging yo‘lini qisqartirish

android {} blokiga android/app/build.gradle faylida quyidagi sozlamani qoʻshing.

externalNativeBuild {
    cmake {
        buildStagingDirectory = file("C:/cxx-build")
    }
}

buildStagingDirectoryCMake tashqi native build artefaktlari va Ninja bilan bogʻliq fayllar yaratiladigan joyni belgilaydi. Standart .cxx yoʻli oʻrniga obyekt fayllari yoʻllarining umumiy uzunligini kamaytirish uchun qisqaroq ildiz yoʻlidan foydalaning.

3.3 Mavjud CMake keshini oʻchirish

Yoʻl sozlamalarini oʻzgartirgandan soʻng, mavjud keshni oʻchirishni unutmang.

rm -rf android/app/.cxx

Windows PowerShellʼda quyidagi buyruqni bajarishingiz mumkin.

Remove-Item -Recurse -Force android\app\.cxx

CMake keshi dastlabki konfiguratsiyadagi kanonik yoʻllarni oʻz ichiga olishi mumkin. Keshni oʻchirmasangiz, Junction va qisqaroq staging yoʻllarini qoʻllaganingizdan keyin ham avvalgi uzun yoʻllardan foydalanishda davom etilishi mumkin.

3.4 Build jarayonini ishga tushirish

Native build jarayonini Junction yoʻlidan ishga tushiring.

.\gradlew.bat assembleRelease --max-workers=2

Release builddan oldin Metro va barcha web dasturlash serverlarini toʻxtatish tavsiya etiladi, chunki xotira uchun raqobat Gradle Worker Daemon xatolariga olib kelishi mumkin.

4. Ishlash tamoyillari va ehtiyot choralari

subst oʻrniga Junctionʼdan foydalaning

substyoʻlni qisqa disk harfiga bogʻlashi mumkin, biroq virtual disk yoʻli va haqiqiy C: yoʻli birgalikda ishlatilganda, quyidagi muammolar yuzaga kelishi mumkin.

  • Codegenʼda turli ildiz yoʻllari bilan bogʻliq xatolar

  • Metroʼda workspace paketlari yoki aliaslarni aniqlashning imkonsizligi

  • Gradle global keshida saqlangan kanonik yoʻllar bilan ziddiyatlar

  • Bogʻlash qayta yuklashdan keyin yoʻqoladi va har safar qaytadan sozlanishi kerak

Shuning uchun yoʻlni qisqartirish uchun Junctionʼdan foydalaning.

Metroʼni kanonik yoʻldan ishga tushiring

Native Gradle buildlarini Junction yoʻlidan, Metroʼni esa kanonik loyiha yoʻlidan ishga tushiring.

Vazifa

Ishga tushirish yoʻli

Native C++ buildi (gradlew, expo run:android)

Junction yoʻli

Metro bundlerʼi (expo start)

Kanonik C: yoʻli

Ayrim Expo/React Native loyihalari TypeScriptʼning paths, Babel yoki Metro konfiguratsiyasiga asoslangan aliaslar hamda workspace paketlarini aniqlashga tayanadi. Metroʼni Junction yoʻlidan ishga tushirish loyiha ildizi va fayllarning realpath qiymati farq qilishiga olib kelishi, natijada alias yoki workspace paketlarini aniqlashda muammolar yuzaga kelishi mumkin.

Bular Expo CNG tomonidan yaratiladigan fayllar ekanini yodda tuting

android/ katalogi Expo CNG tomonidan yaratiladi. Agar expo prebuild --clean buyrugʻini ishga tushirsangiz, android/app/build.gradle fayliga bevosita qoʻshilgan buildStagingDirectory sozlamasi oʻchirilishi mumkin.

Bu sozlama faqat Windowsʼdagi lokal buildlarda oraliq artefaktlar yoʻlini oʻzgartiradi va hosil boʻladigan APKʼga taʼsir qilmaydi. Shuning uchun Windowsʼda native buildlar uchun masʼul shaxs uni qoʻlda qoʻllashi orqali boshqarish mumkin.

Agar uzoq muddatda avtomatlashtirish zarur boʻlsa, faqat Windows foydalanuvchilariga qiymatni tanlab taqdim etish imkonini beradigan Gradle Property asosidagi opt-in yondashuvini koʻrib chiqing. Config Plugin orqali barcha operatsion tizimlar va EAS buildlariga mutlaq yoʻlni majburan kiritmang.

5. Dasturlash muhiti va deploy jarayonini ajratish

Java va Android Studio

Android Studioʼda android/ loyihasini ochganda, agar Gradle Sync bajarilmasa, loyiha Gradle Wrapperʼi, Android Gradle Plugin va Kotlin plugin kombinatsiyasi bilan JDK versiyasi oʻrtasidagi moslikni tekshiring.

Loyiha uchun tasdiqlangan JDK versiyasidan Gradle JDK sifatida foydalaning. Masalan, Java 21 ishlatiladigan muhitda uni quyidagicha sozlashingiz mumkin.

$env:JAVA_HOME = "C:\Program Files\Microsoft\jdk-21"
$env:ANDROID_HOME = "C:\Users\<사용자>\AppData\Local\Android\Sdk"

Android Studio dasturining android/ jildi CNG tomonidan yaratiladigan artefakt bo‘lib, doimiy manba kodi emas. Native loglar va Gradle holatini tekshirish uchun Android Studio dasturidan foydalaning, saqlanib qolishi kerak bo‘lgan sozlamalarni esa app.json yoki Config Plugin ichiga joylashtiring.

Debug APK va Release APK

Kategoriya

Debug

Release

JS bundle

Metro’dan real vaqt rejimida yuklanadi

APK ichiga kiritiladi

Ishlash shartlari

Ishlab chiqish kompyuterida Metro’ga kirishni talab qiladi

Mustaqil ishlashi mumkin

Maqsad

Mahalliy ishlab chiqish va nosozliklarni tuzatish

Hamkasblar va testchilarga tarqatish

Yig‘ish vaqti

Nisbatan qisqa

Barcha ABI’lar kiritilgani sababli uzoqroq bo‘lishi mumkin

APK artefaktlarini odatda quyidagi yo‘ldan topish mumkin.

android/app/build/outputs/apk/debug/app-debug.apk
android/app/build/outputs/apk/release/app-release.apk

Gibrid ilovalar ko‘pincha aksariyat ekranlarni WebView orqali serverdan yuklaydi.

  • Web-ekrandagi o‘zgarishlar: web-kontentni joylashtirgandan so‘ng ilovani to‘liq yoping va qayta ishga tushiring

  • RN shell’dagi o‘zgarishlar: tab paneli, deep linklar, bridge’lar, native SDK’lar va hokazolardagi o‘zgarishlar APK’ni qayta yig‘ish va qayta o‘rnatishni talab qiladi

Justin

Site footer