Android Q 内部运行二进制文件

Android Q 内部运行二进制文件

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 的版本上可以用以下方式临时处理:

  1. 首先将二进制文件准备好,并改名为 libxxx.so 文件。(前面加 lib ,后面加 .so)
  2. 将那个重命名的文件放入 Android Studio 的jniLibs/arm64-v8a 目录
  3. 清单文件的 application 节点添加:android:extractNativeLibs="true"

上面的准备工作完成后,修改二进制的执行路径:

String path = context.getApplicationInfo().nativeLibraryDir + "/libserver" + "." + "arm64" + ".so";

注意根据自己需要修改后面的 libserver.so 文件名称,然后再继续使用原来的方式执行即可

 Runtime.getRuntime().exec("<这里是二进制文件路径>")

缺点

在 Android Q 之后,只能执行 apk 本身附带的二进制文件了,无法再去通过网络下载、或者资源文件拷贝到某个目录然后调用执行

此种方式确实提高了安全性,程序无法随意执行二进制文件,但 Android 的灵活性也被约束。开发上也更为难受,二进制附加在 apk 中,也导致包体积的增大

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2022/03/19/androidq内部运行二进制文件

Buy me a cup of coffee ☕.