我有一个Android应用程序,需要运行我写的自定义二进制应用程序。我已经使用ndk构建了二进制文件并将其打包在res / raw
下的apk中我做了类似这样的事情来首先运行su进程。
Process process;
process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
在此之后如何从资源运行二进制文件?这里还有另一个问题,建议使用AssetManager,但我不明白如何完成它。我查看了一些开源应用程序(android-wifi-tether等),这些应用程序包含了二进制文件,我没有在其源代码中看到AssetManager,也不明白他们究竟是如何做到的。
答案 0 :(得分:3)
有一种令人讨厌的hacky方式来欺骗Android为你做这件事(我成功地做了)。
安装该应用程序后,Android会将libs/$ARCH/libfoo.so
中适用于您的体系结构的相应库复制到/data/data/$PACKAGE/libs
中。棘手的是它只会 复制lib$SOMETHING.so
形式的文件。它甚至会保留执行权限。
因此,如果您将su
可执行文件重命名为libsu.so
,Android将为您完成所有工作。然后,您可以使用“活动”中提供的路径找到它。
但是,要小心! Android是未设计来运行独立应用程序,而Zygote实际上并没有很好地分叉。我发现Runtime.exec()
有竞争条件,可能会崩溃。我发现唯一可靠的技术是使用JNI实现一个小型库,它可以执行fork和exec,而不会触及fork和exec之间的任何其他数据。我确实在这里有一个关于所有细节的问题,但我找不到它。
我现在无法访问任何代码,但如果您愿意,我可以在星期一为您找到一些代码。
答案 1 :(得分: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))
在$之前注意TAB(shell ...空格不会按照标准GNU Make工作。