使用 OpenVPN 创建 VPN

Creating VPN by using OpenVPN

我在 Android 10 上连接 VPN 并在 logcat 中收到以下消息时遇到问题。 这是权限错误。寻找解决方案。 还在 Mainfest 中添加了 android:requestLegacyExternalStorage="true" 但对我不起作用。

D/ConnectionStatus: IO Exceptionjava.io.IOException: 无法 运行 编程 "/data/user/0/com.casvpnapp/cache/pie_openvpn.x86_64": error=13, Permission拒绝

D/de.blinkt.openvpn.core.OpenVPNService: onStartCommand: Australia
I/VpnState: VPN_GENERATE_CONFIG  LEVEL_START
D/ConnectionStatus: ---/data/user/0/com.casvpnapp/cache/android.conf
D/ConnectionStatus: ---/data/user/0/com.casvpnapp/cache/android.conf
D/de.blinkt.openvpn.core.OpenVPNService: startOpenVPN: argv:3
D/ConnectionStatus: --[Ljava.lang.String;@ef1521a
I/OpenVPN: Starting openvpn  [Ljava.lang.String;@ef1521a
D/ConnectionStatus: ---29
    startOpenVPNThread---/data/user/0/com.casvpnapp/cache/pie_openvpn.x86_64
D/ConnectionStatus: IO Exceptionjava.io.IOException: Cannot run program "/data/user/0/com.casvpnapp/cache/pie_openvpn.x86_64": error=13, Permission denied
E/OpenVPN: OpenVPNThread Got java.lang.NullPointerException: Attempt to invoke virtual method 'void java.lang.Process.destroy()' on a null object reference
I/VpnState: NOPROCESS No process running. LEVEL_NOTCONNECTED
W/Thread-20: type=1400 audit(0.0:55): avc: granted { execute } for name="pie_openvpn.x86_64" dev="vdc" ino=23035 scontext=u:r:untrusted_app:s0:c139,c256,c512,c768 tcontext=u:object_r:app_data_file:s0:c139,c256,c512,c768 tclass=file app=com.casvpnapp
I/OpenVPN: Exiting

您的 OpenVPN 库似乎有问题。 虽然我也开发了一个基于 OpenVPN 库的 VPN 应用程序,但它对我来说运行良好。你可以查看我的源代码。

https://github.com/ashraf789/Cake-VPN

我最近 运行 遇到了完全相同的问题。我正在使用 EasyVPN-Free 的克隆。经过仔细检查,我发现这些应用程序中的大多数都使用相同的方法并使用旧版本的 ics-openvpn 核心。

看起来你也在你的应用程序中使用旧版本 ics-openvpn,它与 android 10 不兼容,因为它试图通过从资产加载 ovpn 二进制文件(而不是使用 JNI)来启动进程lib for this) 被 Android 10.

禁止

要解决此问题,请在 Class VPNLaunchHelper.java 中找到以下方法:

private static String writeMiniVPN(Context context)

在开头添加以下行

String nativeAPI = NativeUtils.getNativeAPI();
/* Q does not allow executing binaries written in temp directory anymore */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
    return new File(context.getApplicationInfo().nativeLibraryDir, "libovpnexec.so").getPath();

现在找到以下行并评论/删除它:

String nativeAPI = NativeUtils.getNativeAPI();

[更新]

正如 Md. Ikramul Murad 最初建议的那样

在清单文件中添加以下代码:

<application     android:extractNativeLibs="true"     ... >

现在为您的目标平台获取 libovpnexec.so 并将它们适当地粘贴到您应用程序的 jniLibs 文件夹中,这应该可以解决您的问题android.

异常

你可以参考这个 EasyVPN-Free 我专门为解决这个问题而制作的叉子。

我希望这会帮助所有可能 运行 遇到同样问题的人。