【问题标题】:Packaging linux binary in Android apk在 Android apk 中打包 linux 二进制文件
【发布时间】:2013-02-12 04:08:09
【问题描述】:

如果我想在我的 .apk 文件中包含一个 linux 二进制文件(如 ffmpeg)(仅适用于基于 ARM 的设备),这是否可以分发给非 root 手机?我知道可以使用 Runtime.exec() 调用包含的二进制文件,但这是推荐的做法吗?

【问题讨论】:

    标签: android android-ndk ffmpeg android-build


    【解决方案1】:

    您可以将二进制文件存储在res/rawassets 文件夹中。这样,它将部署在设备上。你应该在安装后“解压”它,你的/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 来提取二进制文件:armeabiarmeabi-v7amips、或 x86

    诀窍是遵循 共享库 命名约定。因此,当您将 ffmpeg 可执行文件放入 libs/armeabi 时,将文件重命名为 lib_ffmpeg_.so。当然,你也会Runtime.exec()文件使用完整路径,以及新添加的前缀和后缀。

    【讨论】:

    • 从 Android 应用程序启动本机可执行文件相当普遍,但您应该知道 Android 架构师不赞成这种做法。他们不断威胁要在未来禁用该设施,因为他们无法像对主应用程序进程那样精确地调节这些进程的资源使用。
    • 谢谢@AlexCohn。您知道使用最新版本 FFMPEG 的 FFMPEG JNI 包装器吗? (最好是 2.0 以后的版本?)。
    • @StackOverflowed:不,我不跟踪几十个 ffmpeg 包装器和衍生产品。
    • @JonesV 是的,是的。我尚未在 Android Pie 设备上对此进行测试,但没有记录在案的更改可能会破坏此功能。一个警告:不幸的是,这不适用于android:extractNativeLibs=false
    【解决方案2】:

    我认为没有 root 用户将无法将它们标记为 +x。

    使用 ffmpeg,更常见的是为 libffmpeg 创建 JNI 包装器。

    【讨论】:

    猜你喜欢
    • 2015-11-30
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2015-05-02
    相关资源
    最近更新 更多