本文转载自:http://www.ituring.com.cn/article/123780
Android 是一个以 Linux 为基础的开放源代码移动设备操作系统。很自然的,它应该可以运行 Linux 命令。也确实有很多终端模拟器应用可以用来运行有限的 Linux 命令。出于安全方面的考虑,系统对应用的权限做了诸多限制。其中有一项是,不能通过终端模拟器应用来运行本地可执行文件。例如,可以将一个可执行文件下载到 SD 卡的 Download 目录下(即 sdcard/Download/),然后执行此文件,系统会告诉你没有权限,另外,授权也是不被允许的!
这篇文章介绍了个中缘由。我们将可运行文件直接放入 SD 卡内,但是不能运行。原因在于不能给这些文件赋予执行权限。这是系统对 SD 卡的限制。但是可以在应用的存储区域——即位于 data/data 根目录下的部分——对文件设置可运行权限。在一台没有经过 root 的设备上,不能随便在这个区域创建任何文件。原因在于每一个 App 都有自己的安全凭证——实际上,每一个应用都运行在不同的用户下面。对于一个特定的 App 来说,在 data/data 目录下,有一个目录是有写权限的。这样的话,找到了终端模拟器的存储目录,将可执行文件拷贝到这个目录下,就可以在模拟器窗口运行了这个程序文件了。:-D
在未经过 root 的 Android 终端上运行命令行程序的原理,即找到终端模拟器应用的可存储区域,将要运行的可执行文件拷贝到它的存储区域,对其赋予可执行权限,然后就可以在命令行窗口运行这个程序文件了。这样的话,可执行程序在运行它们的终端模拟器应用的权限范围内运行,同时保证了 Android 系统的安全限制。
下面是一些具体操作细节。以 Android Terminal Emulator 为例。无论使用哪个终端模拟器,都需要知道内部名称。对于 Android Terminal Emulator 来说,它的内部名称是 jackpal.androidterm。这样的话,对于这个 App 来说,具有写权限的存储区域路径就是:/data/data/jackpal.androidterm/shared_prefs。在 jackpal.androidterm 下面还有其他一些文件夹,不过应用对它们没有写权限。
tips: 可以使用
cd
命令得到当前用户的 home 目录,进而获得这个内部名称。如在 Android Terminal Emulator 中输入cd,会得到/data/data/jackpal.androidterm/app_HOME
。
接下来把要运行的可执行文件拷贝到设备上面。假设存储路径为 /sdcard/Download/hello。打开终端模拟器,执行如下命令将可执行文件拷贝到可执行区域,并对可执行文件授权:
$ cd /data/data/jackpal.androidterm/shared_prefs $ cat /sdcard/Download/hello > hello $ chmod 755 ./hello
在原文中,作者说系统对 cp 命令有限制。经过测试,第二步使用 cp 命令也是可以的。可能不同的机型有差异,或者是系统有所改进。测试机型:三星 9250 (Nexus 2)。
然后就可以运行程序了:
$./hello 输出: Hello World!
注意,在终端模拟器中所能执行的权限取决于系统对这个 App 所赋予的权限。另外,这种方法适用于运行一些小的程序,对于大的复杂程序来说,可能就需要祭出 root 这把“牛刀”了!
如何进行交叉编译
可以使用任何一种你喜欢的工具进行交叉编译,文章中使用的是 NDK。下面介绍 Red 语言的交叉编译方法(参见:https://github.com/red/red):
- 下载预编译好的 Red 可执行文件(不到 1M):http://www.red-lang.org/p/download.html ;
- 编写 Red 脚本程序,保存为 hello.red 文件:
Red [] print reverse "!dlroW olleH"
- 采用如下命令进行编译:
red -c -t Android hello.red
Red 是一门快速发展中的语言。关于 Red 语言的介绍,请参见这篇文章。
(完)
读者评论