【发布时间】:2013-02-12 04:08:09
【问题描述】:
如果我想在我的 .apk 文件中包含一个 linux 二进制文件(如 ffmpeg)(仅适用于基于 ARM 的设备),这是否可以分发给非 root 手机?我知道可以使用 Runtime.exec() 调用包含的二进制文件,但这是推荐的做法吗?
【问题讨论】:
标签: android android-ndk ffmpeg android-build
如果我想在我的 .apk 文件中包含一个 linux 二进制文件(如 ffmpeg)(仅适用于基于 ARM 的设备),这是否可以分发给非 root 手机?我知道可以使用 Runtime.exec() 调用包含的二进制文件,但这是推荐的做法吗?
【问题讨论】:
标签: android android-ndk ffmpeg android-build
您可以将二进制文件存储在res/raw 或assets 文件夹中。这样,它将部署在设备上。你应该在安装后“解压”它,你的/data/data/your.package/files/ 是一个有效的目的地; /sdcard/ 不是。您的应用程序无法访问通常的/data/local/ 目的地,即使它是用于 adb shell 也是如此。 chmod 500 也可以。
也就是说,带有 JNI 包装器的 libffmpeg.so 更易于在 Android 应用中使用,并且占用的系统资源更少。
更新,2014 年 4 月 您可以欺骗系统,将二进制文件存储在 libs/armeabi 文件夹中,然后让安装程序为您提取此二进制文件。它将最终在/data/data/your.package/lib/ 文件夹中,具有+x 权限。这个 hack 还有一个很好的优势,它可以让系统选择正确的 ABI 来提取二进制文件:armeabi、armeabi-v7a、mips、或 x86。
诀窍是遵循 共享库 命名约定。因此,当您将 ffmpeg 可执行文件放入 libs/armeabi 时,将文件重命名为 lib_ffmpeg_.so。当然,你也会Runtime.exec()文件使用完整路径,以及新添加的前缀和后缀。
【讨论】:
我认为没有 root 用户将无法将它们标记为 +x。
使用 ffmpeg,更常见的是为 libffmpeg 创建 JNI 包装器。
【讨论】: