不借助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語言的介紹,請參見這篇文章。
(完)
相關文章
- 無需 root 實現在 Android 裝置上執行 LinuxAndroidLinux
- Android 應用檢測裝置是否被rootAndroid
- 在 WASI 上執行 .NET 7 應用程式
- Anbox:在 Linux 上執行 Android 應用程式的簡單方式LinuxAndroid
- 如何使用同一BluetoothGatt連線不同的android應用程式在相同的裝置上?Android
- 在Windows筆記本上除錯執行在iOS裝置上的前端應用Windows筆記除錯iOS前端
- 使用 ARChon 執行時環境在 Ubuntu 上執行 Android 應用UbuntuAndroid
- 不借助 Docker Desktop 在Mac上開發容器應用DockerMac
- 在 Linux 上安裝安卓 8.1 Oreo 來執行應用程式和遊戲Linux安卓遊戲
- 硬體裝置上能執行小程式嗎?
- Ubuntu 下使用 ADB 除錯 Android 應用時的裝置識別問題Ubuntu除錯Android
- 在 Mac 上執行 Windows 應用程式,只需一個CrossOver!MacWindowsROS
- Android逆向之旅---Android中如何獲取在非Root裝置中獲取應用隱私資料Android
- 釋出.NET應用程式,不單獨安裝執行時
- 可本地執行大模型的應用大模型
- 免root解除安裝Android預裝應用Android
- 用JMX怎樣連線本地JVM上執行的Java程式JVMJava
- 在 Java 應用程式中訪問USB裝置Java
- 如何通過wifi在android手機上安裝除錯應用WiFiAndroid除錯
- Android Studio adb連線不上Android
- 在 Flutter 應用程式中通過定製服務進行本地化Flutter
- Google為Wallet漏洞辯護:本就不應在root後的機器上執行Go
- 解決Arch Linux安裝AndroidStudio連結不上Android,執行adb devices出現no permissions的錯誤LinuxAndroiddev
- 在Linux作業系統上執行Windows應用程式(轉)Linux作業系統Windows
- Hummingbird: 在Web上執行Flutter應用WebFlutter
- ADB 連不上---埠被佔用
- 如何使用 CrossOver 在 Mac 蘋果電腦上安裝執行 win應用ROSMac蘋果
- Quick Touch – 在 iOS 裝置執行的 “Touch Bar”UIiOS
- 使用 mock 資料在本地執行 SAP Fiori Elements 應用的工作原理Mock
- Spark程式碼在叢集上執行過程理解Spark
- 在Kubernetes上執行SAP UI5應用(上)UI
- Parallels Desktop 19: 實現Windows應用程式在Mac上的無縫執行ParallelWindowsMac
- 在 Android 裝置上搭建 Web 伺服器AndroidWeb伺服器
- 終端裝置上的機器學習: Android裝置上的TensorFlow [session]機器學習AndroidSession
- Android應用程式獲得root許可權Android
- 在本地除錯移動裝置上的頁面——神器weinre介紹除錯
- 打破平臺限制,小程式如何在硬體裝置上執行?
- Win10工作列不顯示應用圖示怎麼辦 應用已經在執行但不顯示Win10