不借助ADB在未經過root的Android裝置上執行本地應用程式
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語言的介紹,請參見這篇文章。
(完)
相關文章
- Android 應用檢測裝置是否被rootAndroid
- Anbox:在 Linux 上執行 Android 應用程式的簡單方式LinuxAndroid
- 如何使用同一BluetoothGatt連線不同的android應用程式在相同的裝置上?Android
- 在 WASI 上執行 .NET 7 應用程式
- 不借助 Docker Desktop 在Mac上開發容器應用DockerMac
- Ubuntu 下使用 ADB 除錯 Android 應用時的裝置識別問題Ubuntu除錯Android
- 解決Arch Linux安裝AndroidStudio連結不上Android,執行adb devices出現no permissions的錯誤LinuxAndroiddev
- 在Windows筆記本上除錯執行在iOS裝置上的前端應用Windows筆記除錯iOS前端
- Android Studio adb連線不上Android
- 免root解除安裝Android預裝應用Android
- 硬體裝置上能執行小程式嗎?
- 在 Mac 上執行 Windows 應用程式,只需一個CrossOver!MacWindowsROS
- Hummingbird: 在Web上執行Flutter應用WebFlutter
- 釋出.NET應用程式,不單獨安裝執行時
- 在 Linux 上安裝安卓 8.1 Oreo 來執行應用程式和遊戲Linux安卓遊戲
- 可本地執行大模型的應用大模型
- 在Kubernetes上執行SAP UI5應用(上)UI
- 「Do.003」 adb無線連線Android裝置Android
- 在 Flutter 應用程式中透過定製服務進行本地化Flutter
- ADB 連不上---埠被佔用
- 在 Android 裝置上搭建 Web 伺服器AndroidWeb伺服器
- 基於SkyEye執行Android——應用最為廣泛的移動裝置作業系統Android作業系統
- 多apk釋出的Android程式的adb安裝——adb install-multipleAPKAndroid
- Parallels Desktop 19: 實現Windows應用程式在Mac上的無縫執行ParallelWindowsMac
- 谷歌:截至2023年3月執行Android 13的裝置佔比超過 12%谷歌Android
- 使用 mock 資料在本地執行 SAP Fiori Elements 應用的工作原理Mock
- 6個在本地機器上執行 Kubernetes 的工具
- Spark程式碼在叢集上執行過程理解Spark
- windows10系統下執行Android應用程式的方法WindowsAndroid
- 如何使用 CrossOver 在 Mac 蘋果電腦上安裝執行 win應用ROSMac蘋果
- 伺服器上的程式碼怎麼可以在本地測試執行Debug伺服器
- 微軟允許測試人員在 Windows 11 上試用 Android 應用程式:已支援執行支付寶等APP微軟WindowsAndroidAPP
- 打破平臺限制,小程式如何在硬體裝置上執行?
- Win10工作列不顯示應用圖示怎麼辦 應用已經在執行但不顯示Win10
- HttpRuntime應用程式的執行時HTTP
- 2018-07-03 adb root/adb shell
- OEL6.8上安裝11.2.0.2執行root.sh報錯
- 在 Node.js 上執行 Flutter Web 應用和 APINode.jsFlutterWebAPI
- 在Suse 12.4上安裝11.2.0.4的rac執行root.sh報錯“ORA-12547: TNS:lost contact”