不借助ADB在未經過root的Android裝置上執行本地應用程式

,發表於2014-09-21

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):

  1. 下載預編譯好的Red可執行檔案(不到1M):http://www.red-lang.org/p/download.html ;

  2. 編寫Red指令碼程式,儲存為hello.red檔案:

    Red []
    print reverse "!dlroW olleH"
    
  3. 採用如下命令進行編譯: red -c -t Android hello.red

Red是一門快速發展中的語言。關於Red語言的介紹,請參見這篇文章

(完)

相關文章