【问题标题】:Is it possible to run a native arm binary on a non-rooted android phone?是否可以在非 root 的 android 手机上运行本机 arm 二进制文件?
【发布时间】:2011-06-09 20:12:56
【问题描述】:

好吧,我一直在低级 Android 编程(使用 CodeSourcery 工具链的本机 C/C++)的混沌水域潜水。我在模拟器上试用了可执行文件,它工作正常。我想在真实设备上试用一下。所以我插入了我的关系并将文件推送到文件系统。然后我尝试执行二进制文件,但出现权限错误。我如何安装它,或者我将它发送到哪里并不重要,我不是 root 并且它不允许我执行它。有没有办法在非root手机上运行这样的程序?

【问题讨论】:

  • 你几乎肯定需要root。如果你的手机没有root,你是怎么在手机上得到它的?
  • 你把二进制文件放在哪里了?你不能把它放在 sdcard 上,因为它是用“noexec”选项挂载的(除非有根)。
  • 没错,这就是它在 sdcard 上不起作用的原因。我能够把它放在 /data 中(但它不会执行甚至让我 chmod 它)。至于如何将可执行文件放入文件系统:“adb push”。
  • 在某些手机上,您可以将其复制到/data/local/tmp/,然后添加+x 权限,它就会运行。不作为答案发布,因为这仅适用于少数设备。

标签: android android-ndk arm root codesourcery


【解决方案1】:

使用 Android NDK 中包含的工具链编译您的二进制文件后,可以将它们与典型的 Android 应用程序打包,并将它们作为子进程生成。

您必须在应用程序的 assets 文件夹中包含所有必要的文件。为了运行它们,您必须让程序将它们从资产文件夹复制到可运行的位置,例如:/data/data/com.yourdomain.yourapp/nativeFolder

你可以这样做:

private static void copyFile(String assetPath, String localPath, Context context) {
    try {
        InputStream in = context.getAssets().open(assetPath);
        FileOutputStream out = new FileOutputStream(localPath);
        int read;
        byte[] buffer = new byte[4096];
        while ((read = in.read(buffer)) > 0) {
            out.write(buffer, 0, read);
        }
        out.close();
        in.close();

    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

请记住,assetPath 不是绝对的,而是相对于 assets/。

IE:“assets/nativeFolder”只是“nativeFolder”

要运行您的应用程序并读取其输出,您可以执行以下操作:

  Process nativeApp = Runtime.getRuntime().exec("/data/data/com.yourdomain.yourapp/nativeFolder/application");


            BufferedReader reader = new BufferedReader(new InputStreamReader(nativeApp.getInputStream()));
            int read;
            char[] buffer = new char[4096];
            StringBuffer output = new StringBuffer();
            while ((read = reader.read(buffer)) > 0) {
                output.append(buffer, 0, read);
            }
            reader.close();

            // Waits for the command to finish.
            nativeApp.waitFor();

            String nativeOutput =  output.toString();

【讨论】:

  • 乐于助人。希望看到 google 使 NDK 的非 JNI 端更易于使用。
  • 嘿,您提到“扩展上述答案”并且没有“以上答案”,您可以编辑您的帖子以添加“以上答案”(可能已删除)吗?
  • 我猜作者删了,我把引用删了。我相信它只是建议“你应该检查一下 NDK”。
  • 确保将新的(复制的)二进制文件标记为可执行文件:mBin.setExecutable(true);,如果您使用的是 Java 的 File 对象。
  • 是的,Android 有一个 chmod,但它至少曾经是一个简单的,只接受八进制模式,而不是大多数桌面 unix 上可用的文本标志。众所周知,Android 的 shell 错误消息是不具体的——权限被拒绝实际上可能是任何类型的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2012-07-08
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2017-03-20
  • 2011-10-08
相关资源
最近更新 更多