2017-07-02 19 views
1

我的目標是寫一個運行在手機上,讓用戶從APK的列表中選擇一個應用程序,然後安裝一個選擇的Android Things設備在同一網絡上。運行ADB設備本身,也就是說,好像它是在PC發出指令

我們實際上可以忘記Android的東西,因爲相同的代碼可以在兩個手機之間工作,它只是在那裏沒有意義,因爲目標只能通過許多其他方式接收APK,例如附件,BT等。AT設備除了最近公佈的Android Things Console之外,這個產品只有亞行支持這個功能,這對於定期的本地開發來說是過分的。因此,我正在試圖複製PC將要經過的順序來安裝它,即「adb connect,adb install ...」等,但是從手機本身。我們可以假設所涉及的所有設備都是根植的。

在我看來,這意味着我的應用程序必須發出這些命令是一個過程,但我有一個很難得到它完全正常。當我發出「adb幫助」時,我找回幫助信息,當我發出「adb reboot」時,設備重新啓動,所以我認爲我處於正確的路線。這是當我嘗試除了那些我什麼都沒有回來的東西之外 - 例如「adb shell ping -c 1 192.168.62.40」失敗,但在PC上的亞行可以正常運行。此外,它非常好奇,「adb版本」失敗,從終端再次OK。

起初我以爲手機可能只安裝了一個「adb lite」,它剛剛足以讓它們作爲adb目標工作,但是使用PC上的shell顯示情況並非如此。

這裏是我想要的代碼:

Process process = Runtime.getRuntime().exec("su adb help"); 
//Process process = Runtime.getRuntime().exec("su adb reboot"); 
//Process process = Runtime.getRuntime().exec("su adb version"); 
//Process process = Runtime.getRuntime().exec("su adb shell ping -c 1 192.168.62.40"); 
process.waitFor(); 

Log.d("PROCESS", "Status: "+process.exitValue()); 
BufferedReader bufferedReader = new BufferedReader(
     new InputStreamReader(process.getInputStream())); 

StringBuilder everything = new StringBuilder(); 
String line; 
while((line = bufferedReader.readLine()) != null) { 
    everything.append(line); 
} 

Log.d("PROCESS", "Process output: "+everything.toString()); 

Toast.makeText(MainActivity.this, everything.toString(), Toast.LENGTH_SHORT).show(); 

回答

0

的問題是,adb客戶(您可以使用它傳達給ADB 服務器這和從設備通信的發展機器)不包含在Android設備上。但是,adbd守護程序(用於在客戶端和設備之間進行通信)可以並將在Android系統上找到。

有幾個選項,以幫助使用adb客戶端在Android設備上:

  • 嘗試並建立adb客戶端從adb sources on GitHub Android設備。
  • 試着做一個臨時的adb「客戶端」。由於adb客戶端和adbd守護程序通過USB或TCP進行通信,因此您可以嘗試模擬通信協議以在設備上打開讀取/寫入流。更多關於客戶端守護進程通信協議here。我的工作對這個庫可以幫助你:eviltak/adb-nmap

的快速和骯髒的方法是從源構建adb客戶端,並推送到設備。也就是,如果你可以讓它在Android設備上構建。

第二個選項可能是最消耗時間,但可能是最「乾淨」的選擇。但是,您將不得不模擬adb認證系統,正確處理流等等,這可能很麻煩。來源將幫助你。

在這兩種情況下,GitHub的adb源目錄應該有你需要爲今後的漫漫長路的一切。如果沒有,那麼你必須自己弄明白。

+0

非常感謝。 TBH我正在拉我的頭髮,認爲我一直在調用這個過程是錯誤的,但現在你已經解釋了它,我可以看到爲什麼它比我第一次假設更多。這對AT還是有用的,但我現在的工作量意味着我現在必須對它進行檢查。 –

+0

其實想到了另一種可能更簡單的方法......使用服務器。你可以使用控制手機選擇,上傳然後安裝APK,但是你真正要做的就是告訴安裝了adb的服務器向目標發出適當的命令。 –

+0

@CarlWhalley我認爲暗示,但這需要一臺機器在網絡上運行adb。儘管如此,你仍然需要做一些工作。在潛在的安全性丟失時,您可以爲adb服務器設置一個「passthrough」套接字,因爲它使用回送套接字來啓用與CLI客戶端之間的通信。我打算做一些類似的事情,儘管對於使用我的adb-nmap庫連接到adb服務器(和passthrough套接字)並在網絡上運行的應用程序的應用程序來說,這種應用程序更具限制性。 – EvilTak

相關問題