Manhajar tana aiki a Android 9 kuma tana mutuwa a wannan wayar bayan sabuntawar Android 10. Bayananka bai taɓa ba, takaddun shaida iri ɗaya ne, kuma faɗuwar tana zuwa kafin duk wani zirga-zirgar tabbatarwa. logcat yana nuna alamar sifili da farko, kuma layi kaɗan a samansa akwai Cannot run program ...: error=13, Permission denied. Wannan saƙon game da aiwatar da fayil ne, ba game da karanta tsarin ka ba.

Abin da kuskure 13 yake ƙi da gaske

Android 10, matakin API 29, ya hana manhajoji aiwatar da fayilolin da suka rubuta a cikin nasu babban fayil ɗin bayanai. Dokar tana nufin ajiya wadda ake iya rubutawa sannan a iya aiwatarwa, wanda shi ne ainihin abin da mai ƙaddamarwa da ke kwafa daga assets ke ƙirƙira. Tsofaffin gine-ginen ics-openvpn suna fitar da fayil ɗin aiwatarwa openvpn daga APK a farkon gudu kuma suna farawa da shi ta ProcessBuilder. Fitarwar tana ci gaba da yin nasara; aiwatarwar ita ce ake ƙi. Manhajar da ke nufin API 29 tana gado dokar ko da tana gudana a na’urar da ta zo da tsohuwar siga, shi ya sa sabuntawa za ta iya karya ginin da babu wanda ya taɓa.

Babu wani abu a cikin ƙin da ya keɓance ga sunan babban fayil ɗaya. Fayil ɗin da manhajar ta ƙirƙira a ƙarƙashin babban fayil ɗinta na bayanai ana ɗaukarsa maras iya aiwatarwa ko da menene hanyar, don haka getFilesDir(), getCacheDir() da wani ƙaramin babban fayil na musamman duk suna gazawa iri ɗaya.

Ka raba faɗuwar taimakon daga matsalar bayanai

Karanta log ɗin da ke kusa da farkon tsari maimakon yin gungurawa daga sama. Alamar da za ka nema ita ce layin error=13, kuma bin diddigin tari da ke samansa yawanci yana ambaton hanyar mai ƙaddamarwa da ta kira ProcessBuilder:

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

Idan taimakon bai taɓa farawa ba, ba za ka ga wani fitowar log na OpenVPN kwata-kwata ba: babu tattaunawar sirri, babu hanyoyin da aka tura, babu tsarin DNS. Idan waɗannan layukan sun bayyana kuma gazawar ta zo daga baya, binariyoyin sun gudana kuma matsalar tana cikin bayanan, uwar garken ko Layer ɗin tafiyar da hanya. Wannan bambanci ɗaya yana ceton lokaci mai yawa da za a kashe wajen gyara fayilolin .ovpn waɗanda ba su taɓa yin laifi ba. Yana kuma gaya maka wanne daga cikin gyare-gyare biyu da ke ƙasa kake buƙata da gaske.

Ka kuma duba matakin API a na’urar da kake gwadawa, ba wanda ke cikin tsarin gininka ba. Hoton emulator a API 28 ba ya haifar da komai, domin ƙuntatawar tana cizo ne kawai daga 29 zuwa sama. A lokaci guda ka duba SDK ɗin manufa a cikin fayil ɗin gininka: ɗaga shi ne ke jawo dokar.

adb shell getprop ro.build.version.sdk

Me ya sa kwafin binariyoyin wani wuri ba ya taimakawa

Hanyar da ke bayyane, rubuta taimakon a wani babban fayil da ake iya rubutawa, tana gazawa saboda dalilin da na asali ya gaza. Android har yanzu yana ba da izinin aiwatar da ɗakunan karatu na raba da aka shigar a cikin babban fayil ɗin ɗakunan karatu na asali na manhajar, domin mai shigarwa ne ke tattara su maimakon a rubuta su a lokacin gudu. Wannan babban fayil shi ne wuri ɗaya da mai ƙaddamarwa ya kamata ya nuna. Duk abin da kake fitarwa da kanka a lokacin gudu, ko da wane suna ka ba shi, yana zama cikin rukunin da aka ƙi.

Ajiyar waje ta fi muni: an ɗora ta da noexec, kuma babu manhajar da za ta iya tayar da taimakon da aka ajiye a can. Share bayanan manhaja shima ba ya maido da tsohuwar ɗabi’a, domin gudu na gaba kawai yana sake ƙirƙirar kwafin maras iya aiwatarwa ɗaya.

Nuna mai ƙaddamarwa ga ɗakin karatu da aka tattara

Ka canza sunan taimakon zuwa sunan ɗakin karatu na raba sannan ka ba da shi ƙarƙashin jniLibs ga kowane ABI da kake tallafawa, sannan ka sa mai ƙaddamarwa ya mayar da hanyar ɗakin karatu da aka shigar daga API 28 zuwa gaba:

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

Dole ne a fitar da ɗakin karatu a lokacin shigarwa domin wannan hanyar ta ƙunshi ainihin fayil, don haka saita android:extractNativeLibs="true" a kan sinadarin <application>. Idan mai haɗa manifest ya kawo wata ƙima daban, ƙara tools:replace="android:extractNativeLibs" a gefensa. bayanin sinadarin application yana rubuta abin da sifar take sarrafawa.

Ka yi hankali da maimaita mai canji na gida idan kana facin mai ƙaddamarwa da hannu. Tsofaffin maɓuɓɓuka suna ayyana nativeAPI daga baya a cikin wannan hanyar, kuma ayyana na biyu kuskuren tarawa ne ba kuskuren lokacin gudu ba, don haka gin ɗin yana gazawa da sauri kuma kuskuren yana da sauƙin gani. Ka riƙe jerin ABI a cikin toshe Gradle daidai da manyan fayilolin da kake ƙarawa.

Ka sa kayan aikin saki ya dace da ginin gwaji

APK na gyara zai iya tayar da rami yayin da bundle na saki har yanzu yana faɗuwa, domin bundle yana tattara ɗakunan karatu na asali a wani siffa dabam kuma yana iya ba da su a matse daga ajiya. Idan gin ɗin da ya fito daga bundle ne kawai ke gazawa, ƙara wannan a gradle.properties kuma sake ginawa:

android.bundle.enableUncompressedNativeLibs=false

Sannan tabbatar da cewa kunshin da aka shigar yana ba da rahoton ABI da kake tsammani, kuma sake maimaita dubawa a na’urar bit 32 da bit 64 idan kana ba da duka biyu. Manajan kunshi yana ambaton ABI da ya zaɓa, don haka na’urar da ta koma bit 32 tana bayyana a nan maimakon a rahoton faɗuwa:

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

Ɗakin karatu da ya ɓace ga ABI ɗaya yana sake haifar da kuskuren izini na asali a wannan na’urar kaɗai, shi ya sa wayar gwaji ɗaya da ta yi nasara ba hujja ba ce. Ka ba da tutar manifest, sunan ɗakin karatu da saitin bundle tare; canza ɗaya da manta sauran yana mayar da kai ga wannan faɗuwar. Maganin dawwamai shi ne ƙaura zuwa fitowar cibiyar da ake kula da ita maimakon ɗaukar facin har abada.

Labarai masu alaƙa