D’oibrigh an aip ar Android 9 agus faigheann sí bás ar an bhfón céanna tar éis an nuashonraithe go Android 10. Tá do phróifíl gan dochar, tá na teastais mar an gcéanna, agus tagann an tuairt roimh aon trácht fíordheimhithe. Taispeánann logcat pointeoir nialasach ar dtús, agus cúpla líne os a chionn sin tá Cannot run program ...: error=13, Permission denied. Baineann an teachtaireacht sin le comhad a rith, ní le do chumraíocht a léamh.

Cad a dhiúltaíonn earráid 13 i ndáiríre

Chuir Android 10, leibhéal API 29, stop le haipeanna comhaid a scríobh siad ina n-eolaire sonraí féin a rith. Díríonn an riail ar stóras atá inscríofa agus ansin inrite, agus sin go beacht an rud a chruthaíonn seoltóir a chóipeálann ó assets. Díphacálann seanbhuilteanna den eithne ics-openvpn inrite openvpn ón APK ar an gcéad rith agus seolann siad é le ProcessBuilder. Éiríonn leis an díphacáil fós; an rith atá á dhiúltú. Faigheann aip a dhíríonn ar API 29 an riail le hoidhreacht fiú nuair a ritheann sí ar ghléas a tháinig amach le heisiúint níos sine, agus is ar an gcúis sin gur féidir le nuashonrú buil a bhriseadh nár bhain duine ar bith leis.

Níl aon rud sa diúltú a bhaineann go sonrach le hainm fillteáin amháin. Caitear le comhad a chruthaigh an aip faoina heolaire sonraí mar rud nach féidir a rith is cuma cén cosán, mar sin teipeann ar getFilesDir(), getCacheDir() agus ar fho-eolaire saincheaptha ar fad ar an mbealach céanna.

Deighil tuairt an dénárthaigh ó fhadhb phróifíle

Léigh an log timpeall thús an phróisis seach scrollú ón mbarr. Is é an síniú atá le cuardach an líne error=13, agus ainmníonn an lorg cruachta os a chionn de ghnáth an modh seolta a ghlaoigh ar ProcessBuilder:

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

Murar ndeachaigh an dénárthach ar siúl riamh, ní fheicfidh tú aon aschur loga OpenVPN ar chor ar bith: gan idirbheartaíocht sifir, gan róid bhrúite, gan chumraíocht DNS. Má thagann na línte sin chun solais agus má thagann an teip níos déanaí, rith an dénárthach agus tá an fhadhb sa phróifíl, sa fhreastalaí nó sa chiseal ródaithe. Sábhálann an t-aon idirdhealú sin a lán ama a chaitfí ag cur eagarthóireachta ar chomhaid .ovpn nár cuireadh riamh ina leith. Insíonn sé duit freisin cé acu den dá cheartú thíos a theastaíonn uait i ndáiríre.

Seiceáil leibhéal API ar an ngléas atá á thástáil agat, ní an ceann i do chumraíocht buil. Ní atáirgeann íomhá aithriseora ar API 28 aon rud, mar ní bhíonn an sriantacht i bhfeidhm go dtí 29 agus os a chionn. Seiceáil SDK sprice i do chomhad buil ag an am céanna: is é a ardú a tharraingíonn an riail isteach.

adb shell getprop ro.build.version.sdk

Cén fáth nach gcabhraíonn cóipeáil an dénárthaigh áit eile

Teipeann ar an seachbhealach soiléir, is é sin an dénárthach a scríobh chuig eolaire inscríofa eile, ar an gcúis chéanna ar theip ar an gceann bunaidh. Ceadaíonn Android go fóill leabharlanna comhroinnte a suiteáladh in eolaire leabharlann dúchasach na haipe a rith, mar is é an suiteálaí a dhéanann iad a phacáil seachas iad a scríobh ag am rite. Is é an t-eolaire sin an t-aon áit ar cheart don seoltóir díriú uirthi. Fanann aon rud a dhíphacálann tú féin ag am rite, cibé ainm a thugann tú air, sa chatagóir dhiúltaithe.

Tá an stóras seachtrach níos measa: tá sé gléasta le noexec, agus ní féidir le haon aip dénárthach a chuirtear ann a sheoladh. Ní dhearna sonraí na haipe a ghlanadh an seaniompar a athbhunú ach an oiread, mar ní dhéanann an chéad rith eile ach an chóip neamh-inrite chéanna a athchruthú.

Dírigh an seoltóir ar leabharlann phacáilte

Athainmnigh an dénárthach go hainm leabharlainne comhroinnte agus seol é faoi jniLibs do gach ABI a thacaíonn tú leis, ansin lig don seoltóir cosán na leabharlainne suiteáilte a thabhairt ar ais ó API 28 ar aghaidh:

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

Caithfear an leabharlann a dhíphacáil ag am suiteála chun go mbeidh fíorchomhad sa chosán sin, mar sin socraigh android:extractNativeLibs="true" ar an eilimint <application>. Má thugann cónascaire manifest luach difriúil isteach, cuir tools:replace="android:extractNativeLibs" leis. Déanann tagairt na heiliminte application doiciméadú ar a rialaíonn an tréith.

Bí airdeallach ar athróg áitiúil dhúbláilte nuair a phaistíonn tú an seoltóir de láimh. Dearbhaíonn foinsí níos sine nativeAPI níos déanaí sa mhodh céanna, agus is earráid tiomsaithe seachas earráid ama rite an dara dearbhú, mar sin teipeann an buil go tapa agus is furasta an botún a fheiceáil. Coinnigh liosta ABI sa bhloc Gradle ar aon dul leis na fillteáin a chuireann tú leis.

Déan an t-artafact eisiúna a mheaitseáil leis an mbuil tástála

Is féidir le APK dífhabhtaithe an tollán a ardú agus bundle eisiúna fós ag tuairt, mar phacálann bundle leabharlanna dúchasacha i gcruth difriúil agus is féidir leis iad a sheirbheáil comhbhrúite ón gcartlann. Mura dteipeann ach ar bhuilteanna a thagann ó bundle, cuir seo le gradle.properties agus atóg:

android.bundle.enableUncompressedNativeLibs=false

Ansin deimhnigh go bhfuil an pacáiste suiteáilte ag tuairisciú an ABI a bhfuil súil agat leis, agus déan an tseiceáil arís ar ghléas 32-giotán agus 64-giotán má sheolann tú an dá cheann. Ainmníonn bainisteoir na bpacáiste an ABI a roghnaigh sé, mar sin taispeántar gléas a thit siar go 32 giotán anseo seachas i dtuarascáil tuairte:

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

Atáirgeann leabharlann atá ar iarraidh d’ABI amháin an earráid cheada bunaidh ar an ngléas sin amháin, agus is ar an gcúis sin nach cruthúnas é aon fhón tástála amháin a n-oibríonn. Seol bratach an manifest, ainm na leabharlainne agus socrú an bundle le chéile; má athraíonn tú ceann amháin agus má dhéanann tú dearmad ar na cinn eile, tá tú ar ais ag an tuairt chéanna. Is é an réiteach buan ná bogadh go heisiúint eithne a chothaítear seachas an paiste a iompar go deo.

Ailt ghaolmhara