Android 10下OpenVPN连接权限错误问题求助
Looking at your Logcat, the core issue is that your app can't execute the pie_openvpn.x86_64 binary in the cache directory—note that android:requestLegacyExternalStorage="true" doesn't help here because we're dealing with the app's private internal storage, not external storage. Here are the actionable solutions to resolve this:
1. Ensure the OpenVPN Binary Has Execute Permissions
The most common cause of this error is that the binary lacks executable permissions after being copied to your app's storage. Right after extracting the binary from your app's assets to the target directory, explicitly set the executable flag:
Java Example:
File openvpnBinary = new File(getCacheDir(), "pie_openvpn.x86_64"); // After copying the asset to this file: openvpnBinary.setExecutable(true);
Kotlin Example:
val openvpnBinary = File(cacheDir, "pie_openvpn.x86_64") // After copying the asset to this file: openvpnBinary.setExecutable(true)
Run this code before attempting to launch OpenVPN to guarantee the binary can be executed.
2. Switch to the App's Private Files Directory
While the cache directory is private, system cleanup or edge-case permissions can sometimes interfere. Try moving the binary to your app's files directory instead:
Java:
File openvpnBinary = new File(getFilesDir(), "pie_openvpn.x86_64");
Kotlin:
val openvpnBinary = File(filesDir, "pie_openvpn.x86_64")
Don’t forget to set the executable permission for this file as well.
3. Verify Binary Integrity and Architecture Match
- Check that the
pie_openvpn.x86_64binary isn’t corrupted: confirm its file size matches the original asset, and that it’s compiled specifically for the x86_64 architecture (matching your device’s CPU). - If supporting multiple architectures, ensure you’re copying the correct binary variant for the device (e.g.,
arm64-v8afor 64-bit ARM devices).
4. Confirm Correct SELinux Contexts
Your Logcat shows an SELinux audit entry granting execute permission, but this might be a delayed grant. To ensure the binary has the proper SELinux context, use MODE_PRIVATE when writing the file:
Java:
OutputStream outputStream = openFileOutput("pie_openvpn.x86_64", Context.MODE_PRIVATE); // Write the binary data to outputStream outputStream.close();
This ensures the file is created with the correct context for app-private files, allowing execution.
5. Validate OpenVPN Library Integration
If using the official OpenVPN for Android library (de.blinkt.openvpn):
- Double-check that you’ve included the correct native binaries in your app’s
jniLibsdirectory (or via the library’s dependencies). - Confirm the library is configured to locate the binary path correctly.
After applying these steps, rebuild your app and test the VPN connection again.
内容的提问来源于stack exchange,提问作者Muhammad Sabeel Ahmed

