JNI GlobalRef 管理:Android Plugin におけるメモリリーク回避のベストプラクティス Android Plugin の開発において、Java とネイティブコード間の相互運用を可能にする JNI (Java Native Interface) は不可欠なツールです。しかし、JNI を不適切に利用すると、特に GlobalRef の管理において深刻なメモリリークを引き起こす可能性があります。本講義では、Android Plugin の文脈に特化し、GlobalRef の基本的な概念から、その課題、そしてメモリリークを回避するための実践的なベストプラクティスまでを深く掘り下げていきます。 JNI と Android Plugin における GlobalRef の役割と重要性 JNI は、Java 仮想マシン (JVM) 上で動作する Java コードと、C/C++ などのネイティブコードとの間で相互に呼び出しを行うための標準インターフェースです。Android アプリケーションや特に Android Plugin の開発では、パフォーマンスクリティカルな処理、既存のネ …
Android TalkBack 与 Flutter:`AccessibilityNodeInfo` 的填充与更新机制
Android TalkBack 与 Flutter:AccessibilityNodeInfo 的填充与更新机制 在构建现代移动应用时,可访问性(Accessibility)是一个不容忽视的关键方面。它确保了所有用户,包括那些有视力、听力、认知或运动障碍的用户,都能够有效地使用我们的应用程序。在 Android 生态系统中,TalkBack 是最主要的屏幕阅读器服务,它通过语音反馈帮助视障用户与设备进行交互。而 Flutter,作为一个跨平台的 UI 框架,其独特的渲染机制给可访问性带来了特定的挑战和解决方案。 本讲座将深入探讨 Android TalkBack 如何与 Flutter 应用交互,核心在于理解 AccessibilityNodeInfo 这个数据结构在两者之间扮演的桥梁角色。我们将详细解析 Flutter 如何填充和更新这些 AccessibilityNodeInfo 对象,从而使其内部的语义树能够被 Android 平台的可访问性服务所理解和消费。 1. Android 原生可访问性机制回顾 在深入 Flutter 之前,我们首先需要回顾 Android 原生的可访 …
继续阅读“Android TalkBack 与 Flutter:`AccessibilityNodeInfo` 的填充与更新机制”
Android Fragment Embedding:多 FlutterView 实例的 Engine Group 资源复用
Android Fragment Embedding:多 FlutterView 实例的 Engine Group 资源复用 大家好,今天我们来探讨一个在 Android 原生应用中嵌入 Flutter 模块时,经常会遇到的性能优化问题:如何在多个 FlutterView 实例之间复用 Engine Group 资源,以提升应用启动速度和内存利用率。 背景:Flutter Engine 的资源占用 在 Android 应用中嵌入 Flutter,本质上是启动一个或多个 Flutter Engine 实例,并通过 FlutterView 将 Flutter 渲染的内容显示出来。每个 Flutter Engine 实例都需要加载 Dart 代码、Skia 图形渲染引擎、字体资源等等。这些资源统称为 Engine Group 资源。 如果一个应用中需要多个独立的 Flutter 模块,比如一个首页用 Flutter 实现,一个用户中心也用 Flutter 实现,那么如果每个 FlutterView 都对应一个独立的 Flutter Engine 实例,就会导致 Engine Group 资源 …
继续阅读“Android Fragment Embedding:多 FlutterView 实例的 Engine Group 资源复用”
ExternalTexture(外部纹理):在 Android SurfaceTexture 上实现视频零拷贝渲染
Android SurfaceTexture 上的视频零拷贝渲染:ExternalTexture 技术深度解析 大家好,今天我们来深入探讨一个在Android平台上实现视频高效渲染的关键技术:ExternalTexture。具体来说,我们将专注于如何利用ExternalTexture在SurfaceTexture上实现视频的零拷贝渲染。 1. 视频渲染的传统方式及其局限性 在深入ExternalTexture之前,我们先回顾一下传统的视频渲染方式及其固有的问题。 通常,在Android上渲染视频,我们需要经过以下步骤: 解码: 使用 MediaCodec 解码器将视频数据解码为原始的 YUV 或 RGB 帧。 数据传输: 将解码后的帧数据从 MediaCodec 的输出缓冲区复制到应用程序的内存空间。 格式转换(可选): 如果解码后的格式与渲染器所需的格式不同,则需要进行格式转换。例如,将 YUV420P 转换为 RGB565 或 RGBA8888。 纹理上传: 将转换后的像素数据上传到 OpenGL ES 的纹理对象。 渲染: 使用 OpenGL ES 着色器将纹理渲染到屏幕上。 这 …
继续阅读“ExternalTexture(外部纹理):在 Android SurfaceTexture 上实现视频零拷贝渲染”
Flutter Android Embedding V2:Activity/Fragment 生命周期与 Surface 的绑定
Flutter Android Embedding V2:Activity/Fragment 生命周期与 Surface 的绑定 大家好,今天我们深入探讨 Flutter Android Embedding V2 中 Activity/Fragment 生命周期与 Surface 的绑定机制。 理解这一机制对于构建稳定、高效、与原生 Android 平台良好集成的 Flutter 应用至关重要。 一、Flutter Android Embedding V2 的核心概念 在深入生命周期绑定之前,我们先回顾一下 Flutter Android Embedding V2 的几个关键概念: FlutterEngine: Flutter 引擎是 Flutter 运行时的核心,负责 Dart 代码的执行、渲染和平台交互。每个 Flutter 应用至少需要一个 FlutterEngine 实例。 FlutterEngineGroup: 允许你共享一个 Flutter 引擎的资源(例如 isolate)在多个 FlutterActivity/FlutterFragment 实例之间。 这对于模块化 F …
继续阅读“Flutter Android Embedding V2:Activity/Fragment 生命周期与 Surface 的绑定”
端侧推理的内存映射(mmap):在Android设备上利用分页机制加载大模型权重
Android 端侧推理:基于内存映射的分页加载大模型权重 大家好,今天我们来聊聊如何在 Android 设备上进行端侧推理,特别是针对那些模型权重体积庞大的情况。我们重点讨论利用内存映射(mmap)和分页机制来解决大模型权重加载的问题。 1. 端侧推理的挑战 在移动设备上进行机器学习推理,相比于服务器端,面临着诸多挑战: 资源限制: 移动设备的内存、CPU、GPU 资源都相对有限。 功耗限制: 推理过程需要尽可能降低功耗,延长电池续航。 模型体积: 深度学习模型的体积越来越大,难以一次性加载到内存中。 启动速度: 应用启动时加载模型,需要尽可能缩短启动时间。 对于大模型而言,一次性加载所有权重数据到内存中,很容易导致内存溢出(OOM)错误,或者显著增加应用启动时间。因此,我们需要一种高效的方式来管理模型权重,按需加载,减少内存占用。 2. 内存映射(mmap)机制 内存映射(Memory Mapping)是一种将文件或设备映射到进程地址空间的技术。通过 mmap,进程可以直接像访问内存一样访问文件内容,而无需显式地进行读写操作。这为我们加载大模型权重提供了很大的便利。 mmap 的工 …
Android AICore适配:利用Gemini Nano在移动端NPU上的异构计算调度
Android AICore适配:利用Gemini Nano在移动端NPU上的异构计算调度 各位同学,大家好!今天我们来探讨一个非常热门且具有挑战性的领域:如何在Android平台上,利用AICore适配,将Google的Gemini Nano模型部署到移动端的NPU(Neural Processing Unit)上,并实现高效的异构计算调度。 一、AICore与Gemini Nano简介 在深入技术细节之前,我们需要对AICore和Gemini Nano有一个基本的了解。 AICore: AICore是Android 12引入的一个系统服务,旨在提供统一的API,方便开发者利用设备上的各种AI加速器(例如NPU、GPU、DSP)来运行机器学习模型。它提供了一种抽象层,使得开发者可以不必关心底层硬件的差异,从而实现模型的跨平台部署和优化。AICore的核心理念是“hardware abstraction”,即硬件抽象化。 Gemini Nano: Gemini Nano是Google Gemini系列模型中专门为移动设备设计的版本。它具有模型体积小、推理速度快、功耗低的特点,非常适合在 …