java - 使用 OpenVPN 创建 VPN

标签 java android connection openvpn android-10.0

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

D/ConnectionStatus:IO 异常java.io.IOException:无法运行程序“/data/user/0/com.casvpnapp/cache/pie_openvpn.x86_64”:错误=13,权限被拒绝

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

最佳答案

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

看起来您还在应用程序中使用旧版本的 ics-openvpn,该版本与 android 10 不兼容,因为它尝试通过从 Assets 加载 ovpn 二进制文件(而不是使用 JNI lib 来启动进程),这是被禁止的安卓 10。

要解决此问题,请在 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 最初建议的那样

在 list 文件中添加以下代码:

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

现在获取适合您的目标平台的 libovpnexec.so 并将它们适本地粘贴到应用程序的 jniLibs 文件夹中,这应该可以修复 Android 上的异常。

可以引用这个EasyVPN-Free我专门制作了 fork 来解决这个问题。

我希望这能帮助所有可能遇到同样问题的其他人。

关于java - 使用 OpenVPN 创建 VPN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59406168/

相关文章:

java - 数值超出范围

java - 如何在android 10中获取图像的方向信息?

android - 如何使用库 mikepenz/MaterialDrawer 自定义 DrawerItem

java - Java 应用程序终止时是否释放了所使用的资源?

c# - 底层连接已关闭 : An unexpected error occurred on a receive

java - ExoPlayer 显示黑屏而不是加载视频(仅有时)

java - 为什么我的maven模块在项目中找不到另一个模块?

android - 如何打开 robolectric 日志记录

java - 错误 :Connection timed out: connect - Android

java - 将字符串类型的日期作为日期类型保存到数据库中