【问题标题】:How do I run my packaged binary in my Android app?如何在我的 Android 应用程序中运行打包的二进制文件?
【发布时间】:2011-07-27 05:22:24
【问题描述】:

我有一个需要运行我编写的自定义二进制应用程序的 Android 应用程序。我已经使用 ndk 构建了二进制文件并将其打包在 res/raw 下的 apk 中

我做了这样的事情来首先运行 su 进程。

Process process;
process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());

在此之后我该怎么做才能从资源中运行二进制文件?这里有另一个问题建议使用 AssetManager,但我不明白该怎么做。我检查了一些开源应用程序(android-wifi-tether 等),它们打包了二进制文件,但我在它们的源代码中的任何地方都没有看到 AssetManager,也不明白它们是如何做到的。

【问题讨论】:

  • 您不能从资源中运行二进制文件。您必须将其复制到文件系统中允许可执行文件的位置。另请注意,“su”仅适用于一些根手机。
  • 好的,所以这需要在应用程序第一次运行时完成..我会试一试
  • 它可以工作,但文件不可执行。有没有一种java方法可以让它可执行,或者我只是做 Runtime.getRuntime().exec("chmod 770 /path/to/binary"); ?
  • 通常最好为 chmod/fchmod 函数找到一个 java 包装器,或者从 ndk jni 代码中调用一个包装器,而不是启动一个单独的进程;但是,您的项目已经依赖于执行新流程的非官方能力,因此反对这样做的论据较弱。尽管您在路径中添加了对具有可用 chmod 可执行文件的系统的依赖项。
  • 当心! 'libs' 文件夹在 android6 Galaxy s5 中不存在,因此此代码将导致异常。而是将库复制到应用程序目录下的“lib”目录。

标签: android c android-ndk


【解决方案1】:

有一种令人讨厌的 hacky 方法可以欺骗 Android 为您执行此操作(我成功地做到了)。

安装应用程序后,Android 会为您将适合您架构的库从libs/$ARCH/libfoo.so 复制到/data/data/$PACKAGE/libs。棘手的一点是它只会复制lib$SOMETHING.so 形式的文件。它甚至会保留执行权限。

因此,如果您将 su 可执行文件重命名为 libsu.so,Android 将为您完成所有工作。然后,您可以使用 Activity 提供的路径找到它。

但是,请注意! Android 不是为运行独立应用程序而设计的,而且 Zygote 真的不能很好地接受分叉。我发现Runtime.exec() 有竞争条件并且可能崩溃。我发现的唯一可靠的技术是使用 JNI 来实现一个小库,该库执行 fork 和 exec,而不会触及 fork 和 exec 之间的任何其他数据。我确实在这里有一个关于所有细节的问题,但我找不到它。

我目前无权访问任何代码,但如果您需要,我可以在星期一为您找到其中的一些。

【讨论】:

    【解决方案2】:

    添加到 David Given 的回复中,这很棒,这是我在 Android.mk 末尾用来自动重命名二进制文件的内容。可能对其他尝试相同事情的人有用:

    ...
    LOCAL_MODULE := yourbinarynamehere
    
    include $(BUILD_EXECUTABLE)
    
    all: $(LOCAL_MODULE)
        $(shell (mv libs/$(TARGET_ARCH_ABI)/$< libs/$(TARGET_ARCH_ABI)/lib$<.so))
    

    注意 $(shell... 空格之前的 TAB 不能按照标准 GNU Make 工作。

    【讨论】:

    • 谢谢马丁马可! Windows 用户在这里:all: $(LOCAL_MODULE) cmd /c move libs\$(TARGET_ARCH_ABI)\$&lt; libs\$(TARGET_ARCH_ABI)\lib$&lt;.so
    猜你喜欢
    • 2010-09-12
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多