快速上手:在 Android 设备上运行 Pipy

Pipy 作为一个高性能、低资源消耗的可编程代理,通过支持多种计算架构和操作系统,Pipy 确保了它的通用性和灵活性,能够适应不同的部署环境,包括但不限于云环境、边缘计算以及物联网场景。它能够在 X86、ARM64、海光、龙芯、RISC-V 等架构上运行,支持众多 Linux 发行版,以及 FreeBSD、macOS、Windows 和国产操作系统。
总有用户问起 Pipy 能否运行在 Android 上运行,今天就来探索如何在 Android 平台上运行 Pipy。
环境准备
测试环境:
- 本地 macOS 地址为
10.1.1.18 - 安装 Android 命令行工具 adb(macOS 上可通过
brew install android-platform-tools安装) - Android 设备地址为
10.1.1.97(该设备 CPU 用的是 Cortex-A53,arm64-v8a 架构)
在开始之前,确保 Android 设备上已经开启开发者模式。通过 adb connect 命令无线连接到设备。
adb connect 10.1.1.97:5555
connected to 10.1.1.97:5555
可以通过命令查看当前已连接的设备。
adb devices
List of devices attached
10.1.1.97:5555 device
安装 Pipy
接下来 下载 Pipy Android 安装包,并解压缩得到两个文件:pipy 和 libc++shared.so,分别是二进制文件和动态链接库。
通过 adb push 命令将其复制到设备中,这里设备目录我们使用 /data/local/tmp。
adb push pipy /data/local/tmp
adb push libc++_shared.so /data/local/tmp
安装完 Pipy 之后,我们通过 adb shell 通过命令行访问设备,并验证 Pipy 运行情况。
LD_LIBRARY_PATH=. ./pipy -v | grep Version
Version : 0.99.0-2
测试
在 Android 设备上可以通过命令 dumpsys SERVICE_NAME 来获取系统服务信息,有了 Pipy 我们就可以通过 HTTP 来查看系统信息。
下面是一个十几行的 js 脚本,在这个脚本中启动了监听在 8081 和 8082 端口的两个服务。第一个服务直接返回 Hi Pipy!;第二个服务定义了几个 API,可以返回 CPU 以及其他的系统信息。
pipy.listen(8081, $=>$.serveHTTP(new Message('Hi Pipy!')))pipy.listen(8082, $ => $.serveHTTP(function (req) {var path = req.head.pathif (path === '/cpu') {var cpuF = pipy.exec('getprop ro.product.cpu.abi').toString().trim('\n')return new Message(cpuF)} else if (path.startsWith('/dump/')) {var service = path.substring(6)var sysInfo = pipy.exec(`dumpsys ${service}`).toString().trim('\n')return new Message(sysInfo)} else {return new Message({status: 400}, 'Bad Request!')}}
))
在设备上新建一个文件,比如 main.js ,将脚本的内容复制进去。
接下来执行命令来启动服务。
LD_LIBRARY_PATH=. ./pipy main.js
你将看到 Pipy 成功启动并监听端口。
2024-02-28 07:21:44.963 [INF] [listener] Listening on TCP port 8081 at 0.0.0.0
2024-02-28 07:21:44.964 [INF] [listener] Listening on TCP port 8082 at 0.0.0.0
2024-02-28 07:21:44.964 [INF] [worker] Thread 0 started
现在可以发起请求来验证了。
curl http://10.1.1.97:8081
Hi Pipy!
查看 CPU 信息。
curl http://10.1.1.97:8082/cpu
arm64-v8a
查看 cpu 占用。
curl -s http://10.1.1.97:8082/dump/cpuinfo | grep -i total
18% TOTAL: 16% user + 1.8% kernel + 0% softirq
也可以通过下面的请求查看当前运行了哪些服务,然后通过 API /dump/SERVICE_NAME 来查看对应服务的信息。
curl http://10.1.1.97:8082/dump/-l
Currently running services:DockObserverSurfaceFlingeraccessibilityaccountactivityalarmandroid.security.keystoreandroid.service.gatekeeper.IGateKeeperServiceappopsappwidgetassetatlasaudiobackupbattery...
总结
今天我们探索了如何在 Android 设备上运行 Pipy,并演示如何通过编程方式使用 HTTP 获取设备的运行状态。通过这个过程,我们不仅可以看到 Pipy 处理网络请求的能力,还能了解到其执行本地命令的功能。
Pipy 提供的 丰富 API 支持 开启了无限的可能性,让我们能够以更灵活、创新的方式利用这个工具。无论是开发者还是技术爱好者,都能通过 Pipy 实现各种复杂的网络交互和数据处理任务,从而充分发挥 Android 设备的潜能。
关于 Flomesh
Flomesh(易衡科技)成立于 2018 年,自主研发并开源了高性能可编程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 为基础,Flomesh 研发了软件负载均衡、服务网格两款软件产品。为工信部认证的可信云产品、可信开源项目。
Flomesh 核心竞争力来自完全自研的核心组件 Pipy,该组件高性能、高可靠、低延迟、可编程、可扩展、低依赖,采用 C++ 开发,内置自研的 JS 引擎,支持适用 JS 脚本做扩展开发。支持包括 x86、arm、龙芯、海光等硬件 CPU 架构;支持 Linux、FreeBSD、OpenWrt 等多种核心的操作系统。
Flomesh 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。

相关文章:
快速上手:在 Android 设备上运行 Pipy
Pipy 作为一个高性能、低资源消耗的可编程代理,通过支持多种计算架构和操作系统,Pipy 确保了它的通用性和灵活性,能够适应不同的部署环境,包括但不限于云环境、边缘计算以及物联网场景。它能够在 X86、ARM64、海光、龙芯、RISC-V …...
【操作系统学习笔记】文件管理1.3
【操作系统学习笔记】文件管理1.3 参考书籍: 王道考研 视频地址: Bilibili I/O 控制方式 程序直接控制方式中断驱动方式DMA 方式通道控制方式 程序直接控制方式 关键词: 轮询 完成一次读/写操作的流程 CPU 向控制器发出读指令。于是设备启动,并且状态寄存器设…...
基于springboot+vue的酒店管理系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
Linux 相关命令
文章目录 目录相关操作vim 编辑器命令行模式插入模式底行模式 目录相关操作 查看当前目录下的文件 ls创建目录 mkdir 目录名进入文件,首先确认位于文件的目录 vi 文件名 vim 编辑器 命令行模式 控制光标的移动,字符或行的删除,移动复制某区域…...
阿里云搭建私有docker仓库(学习)
搭建私有云仓库 首先登录后直接在页面搜索栏中搜索“容器镜像服务” 进入后直接选择个人版(可以免费使用) 选择镜像仓库后创建一个镜像仓库 在创建仓库之前我们先创建一个命名空间 然后可以再创建我们的仓库,可以与我们的github账号进行关联…...
MySQL数据库基本操作(一)
数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库?* 用于存储和管理数据的仓库。 3. 数据库的特点:1. 持久化存储数据的。其实数据库就是一个文件系统2. 方便存储和管理数据3. 使用了统一的方式操作数…...
【暗月安全】2021年渗透测试全套培训视频
参与培训需要遵守国家法律法规,相关知识只做技术研究,请勿用于违法用途,造成任何后果自负与本人无关。 中华人民共和国网络安全法(2017 年 6 月 1 日起施行) 第二十二条 任何个人和组织不得从事入侵他人网络、干扰他…...
HTML极速入门
HTML基础 什么是HTML HTML(Hyper Text Markup Language),超文本标记语言. 超文本:比文本更强大.通过链接和交互式方式来组织和呈现信息的文本形式.不仅仅有文本,还可能包括图片,音频,或者自己经审阅过它的学者所加的评注,补充或脚注等. 标记语言:由标签构成的语言 HTML的标…...
Django框架——请求与响应
上篇文章我们学习了Django框架——配置文件和视图函数,这篇文章我们学习Django框架——请求与响应。 客户端和服务端的请求与响应过程:客户端访问某个网站并发出URL请求,服务器接受到请求后,根据请求内容来返回响应,如…...
rearrangement-challenge-2022环境使用学习(一)
搭建了rearrangement-challenge-2022的环境: https://github.com/facebookresearch/habitat-challenge/tree/rearrangement-challenge-2022 habitat最大的缺点是对不同的版本非常的敏感。本文只是针对rearrangement-challenge-2022的学习。 文档一开始会很不完善&a…...
[Uniapp]携带参数跳转界面(两种方法)
一、方法1:路由携参 假设现在有两个界面:界面A和界面B。并要由界面A跳转到界面B,则我们可以使用 uni.navigateTo({}) 跳转界面时,将参数附加在URL后,…...
Scrapy与分布式开发(2.1.2):python常用网络请求库httpx
Python httpx 模块详细讲解 一、引言 httpx 是一个用于发送 HTTP 请求的 Python 库,它提供了简单易用的 API,支持同步和异步请求,并且具有出色的性能和灵活性。httpx 是 requests 的一个现代替代品,它使用 httpcore 作为底层传输…...
07. Nginx进阶-Nginx负载均衡
简介 负载均衡 什么是负载均衡? 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。 Nginx负载均衡 什么是Nginx负载均衡? Nginx负载均衡可以大…...
windows/linux下其他位置调用指定nodejs脚本报错Error: Cannot find module ‘esm’
问题: 有一个nodejs脚本名为html2word,同目录下还有它对应的package.json,正常在html2word所在目录下执行脚本没问题,但是在其他目录执行时报错:Error: Cannot find module ‘esm’ 原因: 在其他位置执行node脚本时…...
2024-03-05 linux 分区老显示满,Use 100%,原因是SquashFS 是一种只读文件系统,它在创建时就已经被填满,所有空间都被使用。
一、这两天一直纠结一个问题,无论怎么修改,linux 分区老显示满,Use 100%,全部沾满。如下图的oem分区。 二、导致出现上面的原因是:SquashFS文件系统里的空间利用率总是显示为100%。 三、SDK里面也说明SquashFS文件系统…...
蓝桥杯倒计时 41天 - KMP 算法
KMP算法 KMP算法是一种字符串匹配算法,用于匹配模式串P在文本串S中出现的所有位置。 例如S“ababac,P“aba”,那么出现的所有位置是13。 在初学KMP时,我们只需要记住和学会使用模板即可,对其原理只需简单理解ÿ…...
《汇编语言》- 读书笔记 - 第13章-int 指令
《汇编语言》- 读书笔记 - 第13章-int 指令 13.1 int 指令13.2 编写供应用程序调用的中断例程中断例程:求一 word 型数据的平方主程序中断处理程序执行效果 中断例程:将一个全是字母,以0结尾的字符串,转化为大写主程序中断处理程序…...
深入了解 Golang 条件语句:if、else、else if 和嵌套 if 的实用示例
条件语句 用于根据不同的条件执行不同的操作。Go中的条件可以是真或假。Go支持数学中常见的比较运算符: 小于 < 小于等于 < 大于 > 大于等于 > 等于 不等于 ! 此外,Go还支持常见的逻辑运算符: 逻辑与 && 逻辑或…...
大数据和机器学习在气象预报中的应用-张平文院士
报告链接:张平文院士 -- 大数据和机器学习在气象预报中的应用_哔哩哔哩_bilibili...
C#高级:Winform桌面开发中DataGridView的详解
一、每条数据增加一个按钮,点击输出对应实体 请先确保正确添加实体的名称和文本: private void button6_Click(object sender, EventArgs e) {//SQL查询到数据,存于list中List<InforMessage> list bll.QueryInforMessage();//含有字段…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
