Android Q上无法运行二进制文件现象
...
ExecUtil.execCommend("chmod +x " + binFile.getAbsolutePath())
...
Runtime.getRuntime().exec("<这里是二进制文件路径>")
上面是之前的Android 版本运行二进制文件的伪代码。但是由于 Android Q 的文件机制、并且官方出于省电、管理等方面的考虑,上方代码运行后会出现:
Cannot run program "xxxxxx": error=13, Permission denied
解决方案
目前有很多实用的二进制文件可以达到某些功能。比如 frp 内网穿透、rtsp 服务、ffmpeg 视频处理的二进制文件。由于Android本身基于Linux,所以这些github开源软件是可以在Android上直接运行的
如果不能使用是一大损失。于是在高于 Android Q 的版本上可以用以下方式临时处理:
- 首先将二进制文件准备好,并改名为
lib
xxx.so
文件。(前面加 lib ,后面加.so
) - 将那个重命名的文件放入 Android Studio 的
jniLibs/arm64-v8a
目录 - 清单文件的
application
节点添加:android:extractNativeLibs="true"
上面的准备工作完成后,修改二进制的执行路径:
String path = context.getApplicationInfo().nativeLibraryDir + "/libserver" + "." + "arm64" + ".so";
注意根据自己需要修改后面的 libserver.so
文件名称,然后再继续使用原来的方式执行即可
Runtime.getRuntime().exec("<这里是二进制文件路径>")
缺点
在 Android Q 之后,只能执行 apk 本身附带的二进制文件了,无法再去通过网络下载、或者资源文件拷贝到某个目录然后调用执行
此种方式确实提高了安全性,程序无法随意执行二进制文件,但 Android 的灵活性也被约束。开发上也更为难受,二进制附加在 apk 中,也导致包体积的增大