【问题标题】:Package Android apk with additional executables使用其他可执行文件打包 Android apk
【发布时间】:2011-10-23 07:52:25
【问题描述】:

作为对先前问题 (Android ioctl - root permissions and usage) 的后续处理,是否可以创建单独的本机可执行文件并将其打包到 APK 中?

该应用需要 root 访问权限并且不会进入 Android 市场,但我希望能够在不使用将额外可执行文件推送到设备上的脚本的情况下安装它。

【问题讨论】:

    标签: android deployment jar apk android-ndk


    【解决方案1】:

    有一种简单的方法可以将可执行文件打包到 APK 中,并让系统安装程序负责解压此可执行文件,请参阅 How to package native commandline application in apk?

    诀窍(测试到 Jelly Bean 4.3)是将文件命名为“libmyexecutable.so”并将其放入您的 Android 项目的libs/armeabi(我假设是 ADT 或 ant 构建)。包管理器会将文件解压到设备上的/data/data/your.package.full.name/lib(这是一个符号链接,出于向后兼容性的原因,所以可能在未来的某些Android版本中这将不再起作用),具有可执行权限。

    请注意,该文件具有all 读取和执行权限,因此您也可以在其他应用中使用Runtime.getRuntime().exec()system()

    更新: 现在,您应该将libs/armeabi-v7a 用于 32 位 ARM 可执行文件,并且您可能还需要准备相同可执行文件的 64 位 ARM 版本。

    【讨论】:

    • 我试过这个,但是当我执行二进制文件时,(使用Runtime.getRuntime().exec("/data/data/your.package.full.name/lib/libmyexec.so",什么都没有发生(但相同的命令在 adb shell 中有效)。
    • @Nutomic:“什么都没有发生”是什么意思?您是从 adb shell 运行相同的可执行文件,还是运行了这个已安装的文件?问题自然是:文件是否存在,权限是否正确,这是哪个设备和操作系统版本?
    • 好吧,我想通了,我必须运行Process p = Runtime.getRuntime().exec("sh"),获取数据输出流并执行dos.writeBytes("path/to/lib/libexec.so)。谢谢:)
    • @Nutomic:它不是一个可执行的二进制文件,而是一个 shell 脚本。不是吗?在这种情况下,你不需要 eXecutable 权限,也不需要这个技巧。
    • 这是一个期望在 shell 上运行的二进制文件(接受标志,写入标准输出等)。无论如何,它现在可以工作了。
    【解决方案2】:

    您可以将其放入资产中,并在首次运行时将其复制到应用程序的私有目录中。设置可执行位后,您应该能够运行它。

    【讨论】:

    • 请注意,您需要权限 android.permission.INSTALL_PACKAGES
    • 有什么用?它不是一个包,只是一个复制到应用私有目录的文件。
    • 这在 Android 10 之后不再有效。请参阅developer.android.com/about/versions/10/…
    • 是的,最新的 SELinux 政策阻止了这一点,尽管有一些方法可以绕过它。执行此操作的“正确”(最不可能中断)方法是将可执行文件链接为库并具有来自 JNI 的入口点。如果您根据 OP 的问题在 root 设备上运行,也应该能够修改 SELinux 策略
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2014-06-12
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多