繁体   English   中英

如何在我的 Android 应用程序中运行打包的二进制文件?

[英]How do I run my packaged binary in my Android app?

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

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

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

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

有一种令人讨厌的hacky方式来欺骗Android为你做这件事(我成功)。

安装应用程序后,Android会将libs/$ARCH/libfoo.so适合您的体系结构的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之间的任何其他数据。 我确实在这里有一个关于所有细节的问题,但我找不到它。

我现在无权访问任何代码,但如果您愿意,我可以在星期一为您找到一些代码。

添加到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工作。

build.gradle 文件中的 jniLibs.srcDirs 已将某些目录设置为名为“jniLibs”的文件夹

src/main/jniLibs/arm64-v8a
src/main/jniLibs/armeabi-v7a
src/main/jniLibs/x86
src/main/jniLibs/x86_64

您可以通过在您的应用程序 build.gradle 文件中设置来更改路径:

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM