設備端直裝Hap的具體方案:開發(fā)Shell服務提供調用
序言
之前在《OpenHarmony設備直裝hap脫離電腦hdc的兩種實現(xiàn)思路》一文中,我提到了兩種實現(xiàn)直裝hap的思路,上篇文章已經(jīng)講過了第一種思路(包管理API)的實現(xiàn)細節(jié)了,那這次再來分享一下第二種思路(另辟蹊徑)的實現(xiàn)細節(jié)。
第二種思路是:開發(fā)一個shell命令服務放到系統(tǒng)內,用于操作bm/aa等本地shell命令去安裝和打開應用,并提供http或其他協(xié)議的接口給上層應用調用。很明顯這種方式違背了OpenHarmony的訪問控制權限機制,只需要申請一個基本的INTERNET權限用于調用本機接口即可,這種方式很不安全,只是探索研究和嘗試。
開發(fā)shell服務
這里以go語言為例。
myshell.go:
package main
import (
"fmt"
"log"
"net/http"
"os/exec"
"strings"
)
func main() {
http.HandleFunc("/execCommand", ExecCommand)
err := http.ListenAndServe("0.0.0.0:23333", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
func ExecCommand(w http.ResponseWriter, r *http.Request) {
name := r.FormValue("name")
args := r.FormValue("args")
argsArr := strings.Split(args, " ")
cmd := exec.Command(name, argsArr...)
out, err := cmd.CombinedOutput()
if err != nil {
_, err := fmt.Fprintf(w, err.Error())
if err != nil {
return
}
return
}
_, err = fmt.Fprintf(w, string(out))
if err != nil {
return
}
}
在 windows 平臺上交叉編譯生成 linux arm64 平臺的的可執(zhí)行程序。
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=arm64
go build -o myshell myshell.go
配置shell服務開機自啟
編寫一個 myshell.cfg 文件,用于描述開機自啟shell服務的信息。
{
"import" : [],
"jobs" : [{
"name" : "init",
"cmds" : [
"start myshell"
]
}
],
"services" : [{
"name" : "myshell",
"path" : ["/system/bin/myshell"]
}
]
}
推送 myshell 和 myshell.cfg 到系統(tǒng)目錄,然后重啟設備,此服務將開機自啟。
hdc shell mount -o remount,rw /
hdc file send myshell /system/bin/myshell
hdc file send myshell.cfg /system/etc/init/myshell.cfg
hdc shell chmod 777 /system/bin/myshell
hdc shell reboot
項目權限配置
entry/src/main/module.json5:
{
"name": "ohos.permission.INTERNET",
},
安裝應用
調用剛才開發(fā)的shell服務提供的htpp接口,傳遞兩個參數(shù),第一個name是調用本地shell的絕對路徑,第二個args是要執(zhí)行命令的參數(shù)
import http from '@ohos.net.http';
function installAppByMyShell() {
let httpRequest = http.createHttp();
httpRequest.request("http://127.0.0.1:23333/execCommand", {
method: http.RequestMethod.POST,
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
extraData: "name=/bin/bm&args=install -r -p /data/local/tmp/testapp.hap",
}, (err, data) => {
if (!err) {
if (data.responseCode == 200) {
if (data.result.toString().startsWith("install bundle successfully.")) {
promptAction.showToast({message: '安裝成功', duration: ToastDuration});
} else {
promptAction.showToast({message: '安裝失敗', duration: ToastDuration});
}
}
} else {
console.info('error:' + JSON.stringify(err));
httpRequest.destroy();
}
}
);
}
打開/卸載應用
由于這種實現(xiàn)方法的特殊性,你可以通過http接口調用任何本地的shell命令,因此,你可以調用bm/aa等本地shell去實現(xiàn)打開應用、卸載應用,甚至是其他的任何操作。
想了解更多關于開源的內容,請訪問:
51CTO 開源基礎軟件社區(qū)