本文使用簡單易用的 aardio 開發環境,體積隻有幾 MB,下載下傳打開就可以寫代碼,不需要任何複雜的配置,可以友善地生成小巧的獨立 EXE 程式。
自動安裝安卓子系統
使用下面的 aardio 代碼可以擷取到安卓子系統的官方下載下傳位址,代碼很簡單:
import web.rest.htmlClient
var htmlDoc = web.rest.htmlClient.post("https://store.rg-adguard.net/api/GetFiles",{
type: "ProductId",
url: "9P3395VX91NR",
ring: "WIS",
lang: "zh"
})
var ele = htmlDoc.queryEle(tagName="a",innerText="\.msixbundle#34;);
var url = ele.href;
傳回的下載下傳連結如果不夠快,重新擷取幾次一般就變快了。
用下面的代碼下載下傳安卓子系統(支援斷點續傳),然後自動安裝:
//下載下傳安卓子系統
import inet.downBox;
var downBox = inet.downBox(winform,"下載下傳安卓子系統(WSA)",1);
var wsaPath = downBox.download(url,"/download/wsa")
//自動安裝安卓子系統
import process.popen;
process.popen.ps(`-command`,`&{Add-AppxPackage "`+wsaPath+`"}`);
用下面的代碼可以檢測系統是否已安裝安卓子系統:
import com.shell;
if( com.shell.findApp(,"WindowsSubsystemForAndroid") ){
}
用下面的代碼打開安卓子系統設定界面:
com.shell.activateApp("WindowsSubsystemForAndroid");
完整的安卓子系統自動安裝工具源代碼請參考 aardio 自帶範例:『 網絡應用 > 安卓子系統 > 一鍵安裝 』
在安卓子系統中自動安裝應用
在系統搜尋中輸入 "android" 搜尋,然後在搜尋結果中單擊打開安卓子系統設定。
也可以調用下面的 aardio 代碼直接打開安卓子系統設定:
import com.shell;
com.shell.activateApp("WindowsSubsystemForAndroid");
在設定界面切換到『開發人員』:
點下圖 ❶ 處切換為啟用開發人員模式:
然後在上圖 ❷ 處可以看到連接配接安卓子系統的 IP 位址與端口,IP 固定是 127.0.0.1,端口預設是 58526。
如果沒有看到 IP 與端口,這是因為安卓子系統還沒有啟動。點一下上圖 ❸ 處的『管理開發人員設定』就會啟動安卓子系統,然後再關閉『開發人員模式』,最後再開啟『開發人員模式』,連接配接安卓子系統的 IP 端口就會顯示出來了。
使用下面的 aardio 代碼就可以通過 ADB 連接配接安卓子系統:
import process.adb;
process.adb.connect("127.0.0.1:58526")
這個函數有 2 個傳回值,成功則傳回值 1 非空,失敗則傳回值 2 為錯誤資訊(非 null 值)。
如果要完美一些可以這樣寫:
import console.int;
import process.adb;
var ret,err = process.adb.connect("127.0.0.1:58526");
if(err){
console.log(err)
console.log("首次連接配接,請在 WSA 彈出的确認對話框中通過驗證")
return;
}
如果 Windows 彈出是否允許 ADB 調試連接配接的對話框,如下:
可勾選『始終允許從此計算機』,然後點選『允許』按鈕。
安裝安卓應用很簡單,代碼如下:
import process.adb;
//連接配接安卓子系統,注意參數 @2 要設為 true (連接配接後切換為目前裝置)
process.adb.connect("127.0.0.1:58526",true)
//下載下傳并安裝應用(參數可以是本地路徑)。
process.adb.installUrl("https://d.toutiao.com/PqXU");
查找與運作安卓子系統應用
用下面的 aardio 代碼可以檢測安卓子系統是否安裝了指定的應用:
import fsys.lnk;
if( fsys.lnk.search("wsa\://com.ss.android.article.news") ){
}
fsys.lnk.search() 的參數支援模式比對,是以上面的冒号前面用了轉義符寫為 "\:"。這個函數如果找到應用會傳回 2 個值(啟動路徑與參數)。
用下面的 aardio 代碼可以直接運作安卓子系統的應用:
raw.execute("wsa://com.ss.android.article.news")
打開安卓子系統内置設定:
raw.execute("wsa://com.android.settings")
運作效果如下:
在設定裡點選『 應用 > 所有應用』,點選應用頁面的『打開』連結可以啟動安卓應用。
可以運作 aardio 中的『工具 > 視窗探測器』,将視窗探針拖到安卓應用視窗上。在視窗探測器裡顯示了安卓應用的視窗類名,在類名前加上 wsa:// 就是這個應用的啟動連結。
例如内置安卓應用『檔案』的視窗類名是
"com.android.documentsui"
,那麼打開這個應用的連結就是
"wsa://com.android.documentsui"
,在 aardio 代碼中運作下面的代碼可以打開『檔案』應用:
raw.execute("wsa://com.android.documentsui")
其他我們自己安裝的安卓應用,在 Windows 開始菜單裡可以看到連結,右鍵看連結屬性,在啟動參數裡也可以看到 wsa:// 開頭的連結。
adb 開發
adb 可以做的事很多,不僅可以控制安卓子系統,也可以控制安卓手機。
下面是一個簡單的例子:
import console.int;
import process.adb;
/*
查找已連接配接裝置,找不到傳回 null,
找到多個裝置會自動設定預設裝置,找到單個裝置時不限定預設裝置。
*/
if(!process.adb.findDevice()){
return console.log("未連接配接手機裝置")
}
//擷取所有裝置
var devices = process.adb.getDevices();
console.dumpJson(devices);
//擷取目前裝置
var serialNo = process.adb.getSerialNo();
console.log("目前裝置",serialNo)
var state = process.adb.getState();
console.log(state=="device"?"已連接配接":"未連接配接")
//執行 ADB 指令并擷取結果,成功傳回程序輸出,失敗傳回 null,錯誤資訊。
console.log(process.adb.get("get-state"))
//執行 Shell 指令
var adb = process.adb.shell("ls");
var out = adb.readAll(); //讀取程序輸出,adb 是一個 process.popen 對象,請參考該庫函數文檔。
console.log(out);
//執行 am start 指令打開程式,例如調用浏覽器打開網址
var adb = process.adb.shell("am start -a android.intent.action.VIEW -d 'https://www.example.com'");
//或者直接調用下面的函數也可以
process.adb.startUrl("https://www.example.com");
通過 adb 模拟按鍵發送手機短信:
import process.adb;
process.adb.connect("IP:端口",true)
//發送短信
process.adb.shellGet(`am start -a android.intent.action.SENDTO -d sms:目标手機号碼 --es sms_body "短信内容" --ez exit_on_sent true`)
//模拟按鍵
process.adb.keyDpadRight();
process.adb.keyEnter();
process.adb.keyHome()
adb 還支援無線連接配接,掃碼配對,在 aardio 中實作掃碼配對很簡單,幾句代碼就可以了,如下:
import process.adb.qrCode;
var qrBmp = process.adb.qrCode(winform );
winform.plus.setBackground(qrBmp.copyBitmap(winform.plus.width));
aardio 範例中已經自帶了一個掃碼配對工具,範例位置:網絡應用 > adb > 掃碼配對。