我的目標是寫一個運行在手機上,讓用戶從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();
非常感謝。 TBH我正在拉我的頭髮,認爲我一直在調用這個過程是錯誤的,但現在你已經解釋了它,我可以看到爲什麼它比我第一次假設更多。這對AT還是有用的,但我現在的工作量意味着我現在必須對它進行檢查。 –
其實想到了另一種可能更簡單的方法......使用服務器。你可以使用控制手機選擇,上傳然後安裝APK,但是你真正要做的就是告訴安裝了adb的服務器向目標發出適當的命令。 –
@CarlWhalley我認爲暗示,但這需要一臺機器在網絡上運行adb。儘管如此,你仍然需要做一些工作。在潛在的安全性丟失時,您可以爲adb服務器設置一個「passthrough」套接字,因爲它使用回送套接字來啓用與CLI客戶端之間的通信。我打算做一些類似的事情,儘管對於使用我的adb-nmap庫連接到adb服務器(和passthrough套接字)並在網絡上運行的應用程序的應用程序來說,這種應用程序更具限制性。 – EvilTak