යෙදුම Android 9 හි වැඩ කළ අතර Android 10 යාවත්කාලීනයෙන් පසු එම දුරකථනයේම මිය යයි. ඔබේ පැතිකඩ ස්පර්ශ නොකළ, සහතික සමානය, සහ ක්‍රෑෂ් ඕනෑම සත්‍යාපන ප්‍රවාහයකට පෙර පැමිණේ. logcat මුලින් ශුන්‍ය දර්ශකයක් පෙන්වයි, සහ ඊට පේළි කිහිපයක් ඉහළින් ඇත Cannot run program ...: error=13, Permission denied. එම පණිවිඩය ගොනුවක් ක්‍රියාත්මක කිරීම ගැනය, ඔබේ වින්‍යාසය කියවීම ගැන නොවේ.

දෝෂය 13 සැබවින්ම ප්‍රතික්ෂේප කරන්නේ කුමක්ද

Android 10, API මට්ටම 29, යෙදුම් තමන්ගේම දත්ත නාමාවලියට ලියූ ගොනු ක්‍රියාත්මක කිරීම නැවැත්වීය. මෙම රීතිය පළමුව ලිවිය හැකි පසුව ක්‍රියාත්මක කළ හැකි ගබඩාව ඉලක්ක කරයි, සහ assets වලින් පිටපත් කරන දියත් කරන්නා සාදන්නේ හරියටම එයයි. ics-openvpn හරයේ පැරණි build පළමු වරට ධාවනයේදී APK වලින් ක්‍රියාත්මක කළ හැකි openvpn ගොනුවක් උපුටා ProcessBuilder මගින් එය ආරම්භ කරයි. උපුටා ගැනීම තවමත් සාර්ථකය; ප්‍රතික්ෂේප වන්නේ ක්‍රියාත්මක කිරීමයි. API 29 ඉලක්ක කරන යෙදුම පැරණි නිකුතුවක් සමඟ පැමිණි උපාංගයක් මත ධාවනය වුවද රීතිය උරුම කර ගනී, එබැවින් යාවත්කාලීනයක් කිසිවෙකු ස්පර්ශ නොකළ build එකක් කඩා දැමිය හැක.

ප්‍රතික්ෂේපයේ එක් ෆෝල්ඩර නාමයකට විශේෂ වූ කිසිවක් නැත. යෙදුම තම දත්ත නාමාවලිය යටතේ සාදන ලද ගොනුවක් මාර්ගය කුමක් වුවද ක්‍රියාත්මක කළ නොහැකි ලෙස සැලකේ, එබැවින් getFilesDir(), getCacheDir() සහ අභිරුචි උප නාමාවලියක් සියල්ල එකම ආකාරයට අසාර්ථක වේ.

සහායක ක්‍රෑෂ් එක පැතිකඩ ගැටලුවකින් වෙන් කරන්න

ඉහළින් ස්ක්‍රෝල් කරනවා වෙනුවට ක්‍රියාවලිය ආරම්භය අවට ලොගය කියවන්න. සොයා ගත යුතු අත්සන වන්නේ error=13 පේළියයි, සහ ඊට ඉහළින් ඇති අටවි ලුහුබැඳීම සාමාන්‍යයෙන් ProcessBuilder ලෙස හැඳින්වූ දියත් කරන්නාගේ ක්‍රමය නම් කරයි:

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

සහායකය කිසිදා ආරම්භ නොවූයේ නම්, ඔබට OpenVPN ලොග ප්‍රතිදානයක් කිසිසේත් නොපෙනෙනු ඇත: සයිෆර් සාකච්ඡාවක් නැත, තල්ලු කළ මාර්ග නැත, DNS වින්‍යාසයක් නැත. එම පේළි දිස්වී අසාර්ථකත්වය පසුව පැමිණෙන්නේ නම්, ද්වීමය ධාවනය වී ඇති අතර ගැටලුව පැතිකඩ, සේවාදායකය හෝ මාර්ගගත කිරීමේ ස්ථරයේ ඇත. එම එකම වෙනස .ovpn ගොනු සංස්කරණයට යන විශාල කාලයක් ඉතිරි කරයි, ඒවා කිසිදා වැරදිකරුවන් නොවීය. පහත සඳහා ඇති අලුත්වැඩියා දෙකෙන් ඔබට ඇත්තටම අවශ්‍ය කුමක්ද යන්නද එය පවසයි.

ඔබ පරීක්ෂා කරන උපාංගයේ API මට්ටමද පරීක්ෂා කරන්න, ඔබේ build වින්‍යාසයේ ඇති එක නොවේ. API 28 හි එමියුලේටර රූපයක් කිසිවක් නැවත නිපදවන්නේ නැත, මන්ද සීමාව බිඳෙන්නේ 29 සිට ඉහළට පමණි. එසේම ඔබේ build ගොනුවේ ඉලක්ක SDK පරීක්ෂා කරන්න: එය ඉහළ නැංවීමම මෙම රීතිය ඇතුළට අදින්නේය.

adb shell getprop ro.build.version.sdk

ද්වීමය වෙනත් තැනකට පිටපත් කිරීම උදව් නොවන්නේ ඇයි

පැහැදිලි වැඩපිළිවෙල, සහායකය තවත් ලිවිය හැකි නාමාවලියකට ලිවීම, මුල් පිටපත අසාර්ථක වූ එම හේතුව නිසාම අසාර්ථක වේ. Android තවමත් යෙදුමේ දේශීය පුස්තකාල නාමාවලියට ස්ථාපනය කළ හවුල් පුස්තකාල ක්‍රියාත්මක කිරීමට අවසර දෙයි, මන්ද ස්ථාපකය ඒවා ඇසුරුම් කරන අතර ධාවන කාලයේ ලියන්නේ නැත. දියත් කරන්නා යොමු විය යුත්තේ එම නාමාවලියට පමණි. ධාවන කාලයේ ඔබම උපුටා ගන්නා කිසිවක්, කුමන නමකින් හැඳින්වුවත්, ප්‍රතික්ෂේප කළ කාණ්ඩයේම රැඳේ.

බාහිර ගබඩාව වඩා නරකය: එය noexec සමඟ මවුන්ට් කර ඇති අතර, එහි තැබූ සහායකයක් කිසිදු යෙදුමකට ආරම්භ කළ නොහැක. යෙදුම් දත්ත මකා දැමීමද පැරණි හැසිරීම නැවත ගෙන එන්නේ නැත, මන්ද ඊළඟ ධාවනය එම ක්‍රියාත්මක කළ නොහැකි පිටපත නැවත සාදයි.

දියත් කරන්නා ඇසුරුම් කළ පුස්තකාලයකට යොමු කරන්න

සහායකය හවුල් පුස්තකාල නාමයකට නම් කර ඔබ සහාය දෙන සෑම ABI එකකටම එය jniLibs යටතේ ලබා දෙන්න, පසුව දියත් කරන්නා API 28 සිට ස්ථාපිත පුස්තකාලයේ මාර්ගය ආපසු දේවා:

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

එම මාර්ගයේ සැබෑ ගොනුවක් තිබීමට පුස්තකාලය ස්ථාපනයේදී උපුටා ගත යුතුය, එබැවින් android:extractNativeLibs="true" <application> අංගය මත සකසන්න. manifest ඒකාබද්ධ කරන්නෙක් වෙනත් අගයක් ගෙන එන්නේ නම්, ඊට යාබදව tools:replace="android:extractNativeLibs" එක් කරන්න. application අංග සමුදාය මෙම ගුණාංගය පාලනය කරන්නේ කුමක්ද යන්න ලේඛනගත කරයි.

දියත් කරන්නා අතින් පාච් කරන විට දෙවරක් ප්‍රකාශිත දේශීය විචල්‍යයක් ගැන සැලකිලිමත් වන්න. පැරණි මූලාශ්‍ර එම ක්‍රමයේම පසුව nativeAPI ප්‍රකාශ කරයි, දෙවන ප්‍රකාශය ධාවන කාලයේ නොව සම්පාදන දෝෂයකි, එබැවින් build ඉක්මනින් අසාර්ථක වන අතර වැරැද්ද පහසුවෙන් දිස්වේ. Gradle කොටසේ ABI ලැයිස්තුව ඔබ එක් කරන ෆෝල්ඩර සමඟ ගැළපෙන ලෙස තබා ගන්න.

නිකුතු නිෂ්පාදිතය පරීක්ෂණ build එකට ගැළපෙන ලෙස සකසන්න

ඩීබග් APK එකකට උමඟ ඔසවා ගත හැකි අතර නිකුතු bundle එකක් තවමත් ක්‍රෑෂ් වේ, මන්ද bundle එකක් දේශීය පුස්තකාල වෙනස් හැඩයකින් ඇසුරුම් කර සංරක්ෂිතයෙන් සම්පීඩිතව ලබා දිය හැක. bundle වලින් ලද build පමණක් අසාර්ථක වන්නේ නම්, මෙය gradle.properties වෙත එක් කර නැවත build කරන්න:

android.bundle.enableUncompressedNativeLibs=false

පසුව ස්ථාපිත පැකේජය ඔබ බලාපොරොත්තු වන ABI වාර්තා කරන්නේද යන්න තහවුරු කරන්න, දෙකම ලබා දෙන්නේ නම් 32-බිට් සහ 64-බිට් උපාංගයක පරීක්ෂාව නැවත කරන්න. පැකේජ කළමනාකරු තමා තෝරාගත් ABI නම් කරයි, එබැවින් 32 බිට් වෙත ආපසු වැටුණු උපාංගයක් ක්‍රෑෂ් වාර්තාවක නොව මෙහි දිස්වේ:

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

එක් ABI එකකට අස්ථානගත පුස්තකාලයක් මුල් අවසර දෝෂය එම උපාංගයේ පමණක් නැවත නිපදවයි, එබැවින් එක් සාර්ථක පරීක්ෂණ දුරකථනයක් සාක්ෂියක් නොවේ. manifest ධජය, පුස්තකාල නාමය සහ bundle සැකසුම එකට ලබා දෙන්න; එකක් වෙනස් කර අනෙක් ඒවා අමතක කිරීමෙන් ඔබ නැවත එම ක්‍රෑෂ් වෙතම එනවා. කල් පවතින විසඳුම වන්නේ පැච් සදාකාලිකව රැගෙන යාම වෙනුවට නඩත්තු කරන හර නිකුතුවකට මාරු වීමයි.

අදාළ ලිපි