簡體   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