首页 > 其他分享 >Android开发笔记[16]-简单使用wasmedge运行时

Android开发笔记[16]-简单使用wasmedge运行时

时间:2024-03-22 23:33:18浏览次数:25  
标签:val 16 i32 wasmedge https Android WasmEdge

摘要

使用wasmedge运行时在Android实现"容器化"运行,将fibonacci计算函数打包进入wasm然后打包进入APK中.

关键信息

  • Android Studio:Iguana | 2023.2.1
  • Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zip
  • jvmTarget = '1.8'
  • minSdk 24
  • targetSdk 34
  • compileSdk 34
  • 开发语言:Kotlin,Java
  • ndkVersion = '21.1.6352462'
  • kotlin版本:1.9.20
  • kotlinCompilerExtensionVersion '1.5.4'
  • com.android.library:8.3

原理简介

wasm简介

[https://juejin.cn/post/7033585275791998990]
[https://developer.mozilla.org/zh-CN/docs/WebAssembly/Concepts]
WebAssembly 是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如 C、C++ 和 Rust 等低级源语言提供一个高效的编译目标。

对于网络平台而言,这具有巨大的意义——这为客户端 app 提供了一种在网络平台以接近本地速度的方式运行多种语言编写的代码的方式;在这之前,客户端 app 是不可能做到的。

而且,你在不知道如何编写 WebAssembly 代码的情况下就可以使用它。WebAssembly 的模块可以被导入的到一个网络 app(或 Node.js)中,并且暴露出供 JavaScript 使用的 WebAssembly 函数。JavaScript 框架不但可以使用 WebAssembly 获得巨大性能优势和新特性,而且还能使得各种功能保持对网络开发者的易用性。

wasmedge简介

[https://www.bilibili.com/video/BV1A341177qn]
[https://wasmedge.org/docs/contribute/source/os/android/apk/]
[https://gitcode.com/WasmEdge/WasmEdge]
[https://wasmedge.org/docs/contribute/source/os/android/build/]
WasmEdge (之前名为 SSVM) 是为边缘计算优化的轻量级、高性能、可扩展的 WebAssembly (Wasm) 虚拟机,可用于云原生、边缘和去中心化的应用。WasmEdge 是目前市场上 最快的 Wasm 虚拟机。WasmEdge 是由 CNCF (Cloud Native Computing Foundation 云原生计算基金会)托管的官方沙箱项目。其应用场景包括 serverless apps, 嵌入式函数、微服务、智能合约和 IoT 设备。

The WasmEdge Runtime releases come with pre-built binaries for the Android OS. Why WasmEdge on Android?

  • Native speed & sandbox safety for Android apps
  • Support multiple dev languages — eg C, Rust, Go & JS
  • Embed 3rd party functions in your android app
  • Kubernetes managed android apps

For the Android 10 or greater versions, SELinux will disallow the untrusted applications' exec() system call to execute the binaries in home or /data/local/tmp folder.
The Android SELinux policy will disallow the untrusted applications to access the /data/local/tmp folder.

在本节中,将构建一个“常规”的 Android 应用程序(即,可以安装在 Android 设备上的 APK 文件)。该 APK 应用程序嵌入了一个 WasmEdge 运行时。它可以通过嵌入的 WasmEdge 调用 WebAssembly 函数。这样做的好处是,开发者可以安全地将多种不同语言(例如,Rust、JS、Grain、TinyGo 等)编写的高性能函数嵌入到 Kotlin 应用程序中。
MainActivity.kt

class MainActivity : AppCompatActivity() {
  lateinit var lib: NativeLib

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val tv = findViewById<TextView>(R.id.tv_text)

    lib = NativeLib(this)

    Thread {
      val lines = Vector<String>()
      val idxArr = arrayOf(20, 25, 28, 30, 32)
      for (idx: Int in idxArr) {
        lines.add("running fib(${idx}) ...")
        runOnUiThread {
          tv.text = lines.joinToString("\n")
        }
        val begin = System.currentTimeMillis()
        val retVal = lib.wasmFibonacci(idx)
        val end = System.currentTimeMillis()
        lines.removeLast()
        lines.add("fib(${idx}) -> ${retVal}, ${end - begin}ms")
        runOnUiThread {
          tv.text = lines.joinToString("\n")
        }
      }
    }.start()
  }
}

NativeLib.kt

class NativeLib(ctx : Context) {
  private external fun nativeWasmFibonacci(imageBytes : ByteArray, idx : Int ) : Int

  companion object {
    init {
      System.loadLibrary("wasmedge_lib")
    }
  }

  private var fibonacciWasmImageBytes : ByteArray = ctx.assets.open("fibonacci.wasm").readBytes()

  fun wasmFibonacci(idx : Int) : Int{
    return nativeWasmFibonacci(fibonacciWasmImageBytes, idx)
  }
}

wasmedge_lib.cpp

extern "C" JNIEXPORT jint JNICALL
Java_org_wasmedge_native_1lib_NativeLib_nativeWasmFibonacci(
    JNIEnv *env, jobject, jbyteArray image_bytes, jint idx) {
  jsize buffer_size = env->GetArrayLength(image_bytes);
  jbyte *buffer = env->GetByteArrayElements(image_bytes, nullptr);

  WasmEdge_ConfigureContext *conf = WasmEdge_ConfigureCreate();
  WasmEdge_ConfigureAddHostRegistration(conf, WasmEdge_HostRegistration_Wasi);

  WasmEdge_VMContext *vm_ctx = WasmEdge_VMCreate(conf, nullptr);

  const WasmEdge_String &func_name = WasmEdge_StringCreateByCString("fib");
  std::array<WasmEdge_Value, 1> params{WasmEdge_ValueGenI32(idx)};
  std::array<WasmEdge_Value, 1> ret_val{};

  const WasmEdge_Result &res = WasmEdge_VMRunWasmFromBuffer(
      vm_ctx, (uint8_t *)buffer, buffer_size, func_name, params.data(),
      params.size(), ret_val.data(), ret_val.size());

  WasmEdge_VMDelete(vm_ctx);
  WasmEdge_ConfigureDelete(conf);
  WasmEdge_StringDelete(func_name);

  env->ReleaseByteArrayElements(image_bytes, buffer, 0);
  if (!WasmEdge_ResultOK(res)) {
    return -1;
  }
  return WasmEdge_ValueGetI32(ret_val[0]);
}

[https://github.com/WasmEdge/WasmEdge/blob/master/examples/wasm/fibonacci.wat]
factorial.wat

(module
  (func $fib (export "fib") (param $n i32) (result i32)
    local.get $n
    i32.const 2
    i32.lt_s
    if
      i32.const 1
      return
    end
    local.get $n
    i32.const 2
    i32.sub
    call $fib
    local.get $n
    i32.const 1
    i32.sub
    call $fib
    i32.add
    return
  )
)

CMakeLists.txt

cmake_minimum_required(VERSION 3.22.1)

project("wasmedge_lib")

set(WASMEDGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../..)
set(WASMEDGE_BUILD_PLUGINS OFF CACHE BOOL "" FORCE)
set(WASMEDGE_BUILD_TOOLS OFF CACHE BOOL "" FORCE)
set(WASMEDGE_BUILD_SHARED_LIB ON CACHE BOOL "" FORCE)
set(WASMEDGE_USE_LLVM OFF CACHE BOOL "" FORCE)
set(WASMEDGE_FORCE_DISABLE_LTO ON CACHE BOOL "" FORCE)  # fast fixed problem for `-fuse-ld=gold`, we use lld.
if (CMAKE_GENERATOR STREQUAL Ninja)
  set(CMAKE_JOB_POOLS "link=2")
  set(CMAKE_JOB_POOL_LINK link)
endif()
add_subdirectory(${WASMEDGE_SOURCE_DIR} WasmEdge)
include_directories(${WasmEdge_BINARY_DIR}/include/api)

add_library(
        wasmedge_lib

        SHARED

        wasmedge_lib.cpp)



target_link_libraries(
        wasmedge_lib

        log
        wasmedge_shared
)

实现

  1. 下载例程代码
# JAVA版本
git clone --recursive https://github.com/hangedfish/WasmEdge_AndroidExample.git
cd WasmEdge_AndroidExample
# 或者Kotlin版本
git clone --recursive https://github.com/WasmEdge/WasmEdge
# Android Studio打开WasmEdge/utils/android/app
  1. JAVA版需要配置cmake 3.18.1版本
    [https://cmake.org/cmake/help/v3.18/release/3.18.html]
    [https://cmake.org/files/v3.18/]
    [https://github.com/Kitware/CMake/tree/v3.18.1]
    放置3.18.1文件夹到/Users/workspace/Library/Android/sdk/cmake目录,
    配置sdk路径:
    local.properties
sdk.dir=/Users/workspace/Library/Android/sdk
cmake.dir=/Users/workspace/Library/Android/sdk/cmake/3.18.1
  1. kotlin版本需要手动放置JAVA版本的asset目录的fibonacci.wasm文件到asset目录;

  2. gradle同步&编译&运行测试

效果

JAVA版本 Kotlin版本

标签:val,16,i32,wasmedge,https,Android,WasmEdge
From: https://www.cnblogs.com/qsbye/p/18090593

相关文章

  • Android开发笔记[15]-设置页
    摘要使用MMKV数据框架实现设置页数据同步,设置页可以对其他页面进行设置;设置页数据通过MMKV框架持久化存储,重启APP不丢失.关键信息AndroidStudio:Iguana|2023.2.1Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zipjvmTarget='1.......
  • CF1618G Trader Problem 题解
    题目链接:CF或者洛谷本题挺有意思的,我们观察到\(\lek\)这个限制使得我们可以将原序列进行分组,把\(\lek\)的限制的元素放在一组中,那么根据题意,这组当中任意元素之间都是可以互相交换的,包括系统用品。那么假设一组中有\(x\)个自身的物品,\(y\)个系统物品,那么这\(x+y\)物......
  • Macbook air M2 16G 用cpu跑同大模型知识库文档系统(Langchain-chatchat+llama2-7B量化
    MacbookairM216G用cpu跑同大模型知识库文档系统(Langchain-chatchat+llama2-7B量化模型)经过了5个夜晚的煎熬,终于从一个完全不知大模型为何物的小白身份把知识库问答大模型搞起来,一路尝试几斤辛酸,特别记录下来踩过的各种坑,供大家借鉴!本人的目标:在我自己的Macbookair......
  • HJ16 购物单
    https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=&judgeStatus=&tags=&title=&gioEnter=menu王强决定......
  • Android 设置相关页面
    Android设置相关页面本文主要记录下android中跳转设置相关页面的一些action.在android中,我们一般使用intent+指定的action来跳转相关设置页面.1:WLANAction设置为Settings.ACTION_WIFI_SETTINGS,用户可以跳转wifi设置页面.Intentintent=newIntent(Settings.ACTION......
  • uniapp发布到h5调用Android原生拍照,相册,uniapp如何显示并上传
    先说一下我这边的需求:uniapp这边发布到h5,然后调用Android原生拍照,选择相册,最后将路径回调到uniapp,uniapp那边image要优先将图片回显出来,并将图片上传到服务器遇到的问题:1调用原生拍照,选择相册回调到uniapp,uniapp的image控件无法展示Android那边回调回来的图片路径,但是如......
  • 阿里巴巴中国站按图搜索1688商品(拍立淘) API接口item_search_img响应示例说明
    阿里巴巴中国站的按图搜索1688商品(拍立淘)API接口item_search_img允许用户通过上传图片来搜索与图片相似的商品。以下是关于该接口响应示例的说明:响应示例概述当调用item_search_img接口并成功上传图片后,接口会返回一个响应,该响应通常包含与上传图片相似的商品信息列表。这些......
  • Android View的动画效果,上移展示和下移隐藏
    原文:AndroidView的动画效果,上移展示和下移隐藏-Stars-One的杂货小窝项目里的一个小需求(实际是要和手势操作一起,上滑和下拉触发此动画效果),记录一下PS:本篇先记录下动画效果,下篇再将如何监听滑动手势效果原理实际通过View的translationY的属性来实现上移代码val......
  • Android 底层问题日志记录
    上电日志ddr异常(ddr内存-->内存是其它硬件与CPU进行沟通的桥梁)(220817_11:21:48.229)[dramc]DRAM_FATAL_ERR_FLAG=0x80000020(220817_11:21:48.229)[dramc]fataldramexceptionfound!resetsystem..(220817_11:22:25.531)Pllinitstart...PLL(PhaseLockedLoop......
  • Android11.0 SystemUI 下拉通知栏去掉左右滑动通知菜单功能
    1.前言在11.0的系统rom产品定制化开发中,在systemui模块中关于下拉状态栏这块也是非常重要的部分,最近在关于systemui下拉通知栏的每条通知部分要求去掉通知栏通知的长按事件,不需要长按功能,所以就需要分析下关于长按事件是在哪里注册的,然后去掉就可以了,接下来分析实现相关功能......