【问题标题】:How to package native commandline application in apk?如何在 apk 中打包原生命令行应用程序?
【发布时间】:2013-06-27 08:08:43
【问题描述】:

我想将一个 Android 原生命令行应用程序打包成一个 apk。我有使用 jni/Android.mk 的 ndk-build 构建应用程序。输出在 libs/armeabi/ 中。我也有 ant 的 apk 建设。但是,apk 似乎没有选择命令行应用程序。如果我解压缩 apk,应用程序不在其中。

我需要做什么才能让 ant 包含预构建的命令行应用程序?

另外,我需要做什么才能让 ant 运行 ndk-build? (这已经回答了:Android NDK build with ANT script

【问题讨论】:

    标签: android command-line android-ndk


    【解决方案1】:

    Android NDK build with ANT script

    如果 Ant 没有从 libs/armeabi 自动复制二进制文件,您可以使用 aapt 将二进制文件添加到 APK,请参阅 Documentation for aapt element in Ant script

    相信文件会正确解压到/data/data/your.package.full.name/lib,具有可执行权限。

    Ant 构建涉及一个名为“ApkBuilder”的步骤,该步骤仅添加来自 libs/armeabi 且匹配模式 ^.+\.so$gdbserver 的文件 - 后者仅用于调试构建。

    但是将可执行文件重命名为“myexecutable.so”是不够的:设备上的APK安装程序不会提取此文件。

    将可执行文件重命名为 "libmyexecutable.so" 即可:此文件将由 APK 提取安装程序 设备上的包管理器到/data/data/your.package.full.name/lib,具有可执行权限。

    我个人喜欢给这个不是真正的图书馆一些特殊的名字,例如lib...ffmpeg...so.

    更新 6 年和 12 个 API 级别之后,这种方法仍然有效。但是对于 Android App Bundle,包管理器的默认行为不是从 APK 中提取本机库,而是就地使用它们。 Here 并在此答案的 cmets 中,您会找到一些解决方法。一个特别吸引人的地方是将可执行文件称为"/path/to/MyApp.apk!lib...ffmpeg...so",但是我没有测试过这种表示法不适用于System.exec( )。请参阅IssueTracker 进行讨论。

    请注意,现在 wrap.sh 有一个特殊的 exception

    【讨论】:

    • 我这样做了,确定我可以添加一个 ant 任务来运行 ndk-build 并且它可以工作。 Ant 不会自动复制可执行文件。我还可以使用 aapt(从命令行或 ant)添加二进制文件。不幸的是,生成的 apk 没有安装? (某种明显的错误)可执行文件肯定在 apk 中,可以通过解压缩进行检查。这很有帮助,但不能完全完成工作,您有更多建议吗?
    • 好的,这是一种作弊方法:调用你的可执行文件“gdbserver”,它会被正确打包到APK中的lib/armeabi目录,并安装到设备上的/data/data/your.package.name/lib目录.正如您所注意到的,有两个障碍。第一,将二进制文件添加到 APK,可以作为自定义 ANT 步骤执行,但您应该注意在 APK 签名之前将其保存在其中。第二步,在设备上,可能会比较棘手。
    • 发生这种情况时,设备上的包管理器在将本机库复制到 /data/data/your.package.name/lib(这是 Android 4.2 上的符号链接)时会查找 ^lib.+\.so$ 模式。因此,请参阅更新的答案。
    【解决方案2】:

    一般来说,你应该把你的命令行应用程序放入Assets文件夹,然后使用AssetManager来提取你的资产(不要忘记在提取后chmod它!)。但是将它解压到哪里会有一个问题,因为并非Android中的每个目录都可以存储可执行的二进制文件。在 Android 2.2 上,我尝试过 /cache,它可以工作。不能说新的安卓。 抱歉,无法提供关于 ant 的建议。

    【讨论】:

    • 我正在尝试为 android 4.0/4.1/4.2 执行此操作。 /data/local work 中的可执行二进制文件。
    • /data/local 在许多 android 版本中是写入(并且很可能也是读取)受限的。可能最好的放置位置是在应用程序的私有存储中,但如果打算与其他应用程序或 adb shell 共享文件,请将文件的权限设置为全局可读和可执行。
    • 这不再适用于 Android 10+ developer.android.com/about/versions/10/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2014-07-31
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多