I-binary yosizo ye-OpenVPN iyahluleka ku-Android 10: imvume inqatshiwe
I-Android 10 iyala ukusebenzisa usizo olwabhalwa uhlelo endaweni yalo yokugcina. Funda i-logcat, hlinzeka ngosizo njengelabhulali yomdabu futhi ulungise ukwakhiwa kwe-bundle.
Uhlelo lwalusebenza ku-Android 9 futhi luyafa kuyo leyo foni ngemva kokubuyekezwa ku-Android 10. Iphrofayela yakho ayithintwanga, izitifiketi ziyafana, futhi ukuphahlazeka kufika ngaphambi kwanoma yikuphi ukuxhumana kokuqinisekisa. I-logcat ibonisa kuqala isikhombi esinguziro, futhi imigqa embalwa ngenhla kukhona Cannot run program ...: error=13, Permission denied. Lowo mlayezo ukhuluma ngokusebenzisa ifayela, hhayi ngokufunda ukucushwa kwakho.
Yini iphutha 13 eliyenqabayo ngempela
I-Android 10, izinga le-API 29, yamisa izinhlelo ekusebenziseni amafayela eziwabhale kusigcinalwazi sazo sedatha. Umthetho uqondisa endaweni yokugcina ebhalelekayo kuqala bese isebenziseka, futhi yilokho kanye okwakhiwa isiqalisi esikopisha kusuka ku-assets. Ukwakhiwa okudala kwengqikithi ye-ics-openvpn kukhipha ifayela elisebenzisekayo openvpn ku-APK ekugijimeni kokuqala bese likuqalisa nge-ProcessBuilder. Ukukhipha kusaphumelela; okwenqatshwayo ukusebenza. Uhlelo oluhlose i-API 29 luthola lo mthetho ngisho nalapho lusebenza kudivayisi eyaphuma nenguqulo endala, yingakho ukubuyekezwa kungaphula ukwakhiwa okungekho muntu owakuthinta.
Akukho lutho ekwenqatshweni okuqondene negama elilodwa lefolda. Ifayela elidalwe uhlelo ngaphansi kwesigcinalwazi salo sedatha lithathwa njengelingakwazi ukusebenza kungakhathaleki indlela, ngakho-ke getFilesDir(), getCacheDir() kanye nesigcinalwazi esincane esenziwe ngezifiso konke kwehluleka ngendlela efanayo.
Ihlukanise ukuphahlazeka kosizo nenkinga yephrofayela
Funda ilogi ezungeze ukuqala kwenqubo esikhundleni sokuskrola kusuka phezulu. Isiginesha okufanele uyifune umugqa error=13, futhi umkhondo wesitaki ongenhla uvamise ukusho indlela yesiqalisi eyabiza ProcessBuilder:
adb logcat -d | grep -n -i -E "cannot run program|permission denied|startOpenVPN"Uma usizo lungazange luqale, ngeke ubone noma yikuphi ukuphuma kwelogi ye-OpenVPN: akukho ukuxoxisana nge-cipher, akukho migwaqo egxushiwe, akukho kucushwa kwe-DNS. Uma leyo migqa ivela futhi ukwehluleka kufika kamuva, i-binary yagijima futhi inkinga isephrofayeleni, kuseva noma kusendlalelo somzila. Lowo mehluko owodwa wonga isikhathi esiningi ebesingasetshenziswa ekuhleleni amafayela .ovpn ayengakaze abe necala. Kukhombisa futhi ukuthi yikuphi kokulungisa okubili okungezansi okudinga ngempela.
Hlola futhi izinga le-API kudivayisi oyihlolayo, hhayi lelo elikusimiso sokwakha sakho. Isithombe se-emulator ku-API 28 asikhiqizi lutho, ngoba umkhawulo uluma kuphela kusukela ku-29 kuya phezulu. Ngesikhathi esifanayo hlola i-SDK oqondiwe efayeleni lakho lokwakha: ukwenyusa kwayo yikho okudonsa lo mthetho.
adb shell getprop ro.build.version.sdkKungani ukukopisha i-binary kwenye indawo kungasizi
Indlela esobala, ukubhala usizo kwesinye isigcinalwazi esibhalelekayo, iyahluleka ngesizathu esifanayo naleyo yasekuqaleni. I-Android isavumela ukusebenzisa amalabhulali abiweyiwe afakwe kusigcinalwazi samalabhulali omdabu sohlelo, ngoba isifaki sizifaka hhayi ukuthi zibhalwa ngesikhathi sokusebenza. Leso sigcinalwazi yindawo eyodwa okufanele isiqalisi sikhombe kuyo. Noma yini oyikhiphayo ngokwakho ngesikhathi sokusebenza, noma ngabe uyibiza ngani, ihlala isesigabeni esinqatshiwe.
Isigcinalwazi sangaphandle siyesabeka kakhulu: sikhwezwa nge-noexec, futhi usizo olubekwe lapho alunakho ukuqalwa yinoma yiluphi uhlelo. Ukusula idatha yohlelo nakho akubuyiseli ukuziphatha kwakudala, ngoba ukugijima okulandelayo kumane kwakhe kabusha ikhophi efanayo engakwazi ukusebenza.
Qondisa isiqalisi kubhalabhulali efakiwe
Shintsha igama losizo libe yigama lelabhulali abiweyiwe bese ulinikeza ngaphansi kwe-jniLibs kuyo yonke i-ABI oyisekelayo, bese uvumela isiqalisi sibuyise indlela yelabhulali efakiwe kusukela ku-API 28 kuya phambili:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
return new File(context.getApplicationInfo().nativeLibraryDir,
"libovpnexec.so").getPath();
}Ilabhulali kufanele ikhishwe ngesikhathi sokufaka ukuze leyondlela ibe nefayela langempela, ngakho-ke setha android:extractNativeLibs="true" kusici <application>. Uma ihlanganisi lemanifesti iletha enye inani, engeza tools:replace="android:extractNativeLibs" eceleni kwayo. ireferensi yesici se-application ibhala phansi ukuthi lesi sici silawula ini.
Qaphela ukuguquguquka kwendawo okuphindiwe lapho uqobolonga isiqalisi ngesandla. Imithombo emidala imemezela nativeAPI kamuva kuleyo ndlela, futhi isimemezelo sesibili iyiphutha lokuhlanganisa hhayi lokusebenza, ngakho ukwakhiwa kwehluleka ngokushesha futhi iphutha liyasitholakala. Gcina uhlu lwe-ABI kusigaba se-Gradle luhambisana namafolda owengezayo.
Yenza umkhiqizo wokukhulula uhambisane nokwakhiwa kokuhlola
I-APK yokulungisa ingakhuphula umhubhe ngenkathi i-bundle yokukhulula isahhayiza, ngoba i-bundle ifaka amalabhulali omdabu ngendlela ehlukile futhi ingawanikeza ecindezelwe kusuka kungobo yomlando. Uma kuhluleka kuphela ukwakhiwa okuvela ku-bundle, engeza lokhu ku-gradle.properties bese wakha kabusha:
android.bundle.enableUncompressedNativeLibs=falseBese uqinisekisa ukuthi iphakethe elifakiwe libika i-ABI oyilindele, futhi uphinda ukuhlola kudivayisi engu-32-bit nengu-64-bit uma uhlinzeka ngakho kokubili. Isiphathi sephakethe sisho i-ABI esiyikhethile, ngakho idivayisi ebuyele ku-32 bit ivela lapha hhayi embikweni wokuphahlazeka:
adb shell dumpsys package com.example.openvpn | grep -i primaryCpuAbiIlabhulali elingekho ku-ABI eyodwa liphindakabusha iphutha lemvume lasekuqaleni kuleyo divayisi kuphela, yingakho ifoni eyodwa yokuhlola ephumelelayo ingesona ubufakazi. Hlinzeka ngefulegi lemanifesti, igama lelabhulali kanye nokucushwa kwe-bundle ndawonye; ukushintsha okukodwa nokukhohlwa okunye kukubuyisela kuleso siphahlazeka. Isixazululo esihlala njalo ukuthuthela ekukhishweni kwengqikithi okunakekelwayo esikhundleni sokuphatha isichibiyelo unomphela.