设备端直装Hap的具体方案:开发Shell服务提供调用
创始人
2025-06-30 15:11:05
0

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

序言

之前在《OpenHarmony设备直装hap脱离电脑hdc的两种实现思路》一文中,我提到了两种实现直装hap的思路,上篇文章已经讲过了第一种思路(包管理API)的实现细节了,那这次再来分享一下第二种思路(另辟蹊径)的实现细节。

第二种思路是:开发一个shell命令服务放到系统内,用于操作bm/aa等本地shell命令去安装和打开应用,并提供http或其他协议的接口给上层应用调用。很明显这种方式违背了OpenHarmony的访问控制权限机制,只需要申请一个基本的INTERNET权限用于调用本机接口即可,这种方式很不安全,只是探索研究和尝试。

开发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 平台的的可执行程序。

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 到系统目录,然后重启设备,此服务将开机自启。

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",
},

安装应用

调用刚才开发的shell服务提供的htpp接口,传递两个参数,第一个name是调用本地shell的绝对路径,第二个args是要执行命令的参数

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();
    }
  }
  );
}

打开/卸载应用

由于这种实现方法的特殊性,你可以通过http接口调用任何本地的shell命令,因此,你可以调用bm/aa等本地shell去实现打开应用、卸载应用,甚至是其他的任何操作。

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...