L-app ħadmet fuq Android 9 u tmut fuq l-istess telefon wara l-aġġornament għal Android 10. Il-profil tiegħek mhux mittiefes, iċ-ċertifikati huma l-istess, u l-crash jiġi qabel kwalunkwe traffiku ta’ awtentikazzjoni. Logcat l-ewwel juri pointer null, u ftit linji ’l fuq minnu jinsab Cannot run program ...: error=13, Permission denied. Dak il-messaġġ huwa dwar it-twettiq ta’ fajl, mhux dwar il-qari tal-konfigurazzjoni tiegħek.

X’inhu fil-fatt jirrifjuta l-iżball 13

Android 10, livell API 29, waqqaf lill-apps milli jwettqu fajls li kitbu fid-direttorju tad-dejta tagħhom stess. Ir-regola timmira lejn ħażna li l-ewwel tinkiteb u mbagħad titwettaq, u dan huwa eżattament dak li joħloq fajl tal-bidu li jikkopja mill-assets. Builds anzjani tal-qalba ics-openvpn jiżżippjaw fajl eżegwibbli openvpn mill-APK fl-ewwel tħaddim u jibdewha b’ProcessBuilder. Il-jiżżippjar għadu jirnexxi; dak li jiġi miċħud huwa t-twettiq. App li timmira lejn API 29 tiret ir-regola anki meta taħdem fuq apparat li ħareġ b’verżjoni anzjana, u għalhekk aġġornament jista’ jkisser build li ħadd ma messu.

Xejn mir-rifjut mhuwa speċifiku għal isem wieħed ta’ folder. Fajl li l-app ħolqot taħt id-direttorju tad-dejta tagħha jiġi trattat bħala mhux eżegwibbli tkun xi tkun il-mogħdija, għalhekk getFilesDir(), getCacheDir() u sotto-direttorju personalizzat kollha jfallu bl-istess mod.

Aqsam il-crash tal-awżiljarju minn problema tal-profil

Aqra l-log madwar il-bidu tal-proċess minflok ma tagħmel scroll mill-bidu. Il-firma li trid tfittex hija l-linja error=13, u l-istack trace ’il fuq minnha s-soltu jsemmi l-metodu tal-fajl tal-bidu li sejjaħ ProcessBuilder:

adb logcat -d | grep -n -i -E "cannot run program|permission denied|startOpenVPN"

Jekk l-awżiljarju qatt ma beda, mhux se tara ebda output tal-log tal-OpenVPN: l-ebda negozjazzjoni taċ-ċifrar, l-ebda rotta mbuttata, l-ebda konfigurazzjoni DNS. Jekk dawk il-linji jidhru u l-falliment jiġi aktar tard, il-binarju ħadem u l-problema tinsab fil-profil, fis-server jew fis-saff tar-routing. Dik id-differenza waħda tiffranka ħafna ħin li kien jintefa’ biex jiġu editjati fajls .ovpn li qatt ma kienu ħatja. Tgħidlek ukoll liema miż-żewġ tiswijiet hawn taħt fil-fatt għandek bżonn.

Iċċekkja wkoll il-livell API fuq l-apparat li qed tittestja, mhux dak fil-konfigurazzjoni tal-build tiegħek. Immaġini tal-emulatur fuq API 28 ma tirriproduċi xejn, għax ir-restrizzjoni tigdim biss mil-29 ’il fuq. Iċċekkja fl-istess ħin l-SDK immirat fil-fajl tal-build tiegħek: it-tlugħ tiegħu huwa dak li jġib din ir-regola.

adb shell getprop ro.build.version.sdk

Għaliex l-ikkupjar tal-binarju band’oħra ma jgħin

Is-soluzzjoni ovvja, li l-awżiljarju jinkiteb f’direttorju ieħor li jinkiteb, ifalli għall-istess raġuni li fallew l-oriġinal. Android għadu jippermetti t-twettiq ta’ libreriji kondiviżi installati fid-direttorju tal-libreriji nattivi tal-app, għax l-installer jippakkjahom u mhumiex miktubin waqt il-ħidma. Dak id-direttorju huwa l-uniku post li l-fajl tal-bidu għandu jindika lejh. Kull ma tneħħi int stess waqt il-ħidma, x’isem tagħtih, jibqa’ fil-kategorija miċħuda.

Il-ħażna esterna hija agħar: hija mmuntata b’noexec, u awżiljarju mqiegħed hemm ma jistax jibda minn ebda app. It-tħassir tad-dejta tal-app lanqas ma jġib lura l-imġiba l-qadima, għax it-tħaddim li jmiss sempliċement joħloq mill-ġdid l-istess kopja mhux eżegwibbli.

Indika l-fajl tal-bidu lejn librerija ppakkjata

Ibdel isem l-awżiljarju għal isem ta’ librerija kondiviża u ħarġu taħt jniLibs għal kull ABI li tappoġġja, imbagħad ħalli l-fajl tal-bidu jirritorna l-mogħdija tal-librerija installata minn API 28 ’il quddiem:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    return new File(context.getApplicationInfo().nativeLibraryDir,
                    "libovpnexec.so").getPath();
}

Il-librerija trid tiġi żżippjata waqt l-installazzjoni biex dik il-mogħdija jkollha fajl veru, għalhekk issettja android:extractNativeLibs="true" fuq l-element <application>. Jekk il-merger tal-manifest iġib valur ieħor, żid tools:replace="android:extractNativeLibs" maġenbu. Ir-referenza tal-element application tiddokumenta x’jikkontrolla l-attribut.

Oqgħod attent għal varjabbli lokali doppju meta tissewwi l-fajl tal-bidu bl-idejn. Sorsi anzjani jiddikjaraw nativeAPI aktar tard fl-istess metodu, u t-tieni dikjarazzjoni hija żball tal-kompilazzjoni mhux tal-ħidma, għalhekk il-build ifalli malajr u l-iżball huwa faċli li jidher. Żomm il-lista tal-ABI fil-blokk Gradle agħqad mal-folders li żżid.

Agħmel l-artefatt tar-rilaxx jaqbel mal-build tat-test

APK tad-debug jista’ jtella’ l-mina waqt li bundle tar-rilaxx għadu jikkraxxja, għax bundle jippakka l-libreriji nattivi f’forma differenti u jista’ jservihom kompressi mill-arkivju. Jekk jfallu biss il-builds li ġejjin mill-bundle, żid dan fil-gradle.properties u erġa’ ibni:

android.bundle.enableUncompressedNativeLibs=false

Imbagħad ikkonferma li l-pakkett installat jirrapporta l-ABI li tistenna, u erġa’ għamel il-verifika fuq apparat ta’ 32 bit u apparat ta’ 64 bit jekk tforni t-tnejn. Il-maniġer tal-pakketti jsemmi l-ABI li għażel, għalhekk apparat li waqa’ lura għal 32 bit jidher hawn u mhux f’rapport ta’ crash:

adb shell dumpsys package com.example.openvpn | grep -i primaryCpuAbi

Librerija nieqsa għal ABI waħda tirriproduċi l-iżball oriġinali tal-permess biss fuq dak l-apparat, u għalhekk telefon tat-test wieħed li jaħdem mhuwiex prova. Ipprovdi l-bandiera tal-manifest, l-isem tal-librerija u s-setting tal-bundle flimkien; jekk tbiddel waħda u tinsa l-oħrajn terġa’ lura għall-istess crash. It-tiswija dejjiema hija li tinqaleb għal rilaxx tal-qalba miżmum minflok ma żżomm it-tiswija għal dejjem.

Artikli relatati