技术速递|适用于 .NET 和 .NET MAUI Android 应用程序的 Android 资产包

MAUI 框架安卓入门开发01 界面设计 1.导航栏设计1.1 由于需要水平布局的设计方式,所以外围需要使用一个HorizontalStackLayout 进行包裹着所有的子控件,来达到水平布局的效果。页面大概是这样子,按钮全部由RadioButton 进行重绘 阅读详情

作者:Dean Ellis - 高级软件工程师
排版:Alan Wang

我们在 .NET 9 中为 .NET 和 .NET MAUI Android 应用程序引入了一种生成资产包的新方法,您可以从今天就开始尝试使用。什么是资产包?为什么要使用它们?如何开始?让我们一起了解一下吧!

什么是资产包?

早在 2018 年,Google 就推出了一种新的软件包格式,用于将 Android 应用程序部署到 Google Play Store。自 .NET 6 以来,.NET Android 就一直支持Android App Bundles (AAB)这种新格式。Android App Bundles 有很多功能,我们优先考虑了开发人员最需要的功能。AAB 格式的一项高级功能是资产包,它现在将成为 .NET 9 的一部分。那么什么是资产包呢?

新软件包格式的一部分是可以将资产放入单独的软件包中。开发者可以上传通常比 Google Play 允许的基本软件包大小更大的游戏和应用。通过将这些资产放入单独的软件包中,开发者可以上传最多2 GB大小的软件包。基本软件包大小为 200 MB。有一个条件,资产包只能包含资产。对于 .NET Android,这意味着具有 AndroidAsset 构建操作的项目。

资产包可以有不同的交付选项。这决定了您的资产将在何时安装在设备上。安装时交付(Install Time)的资产包与应用程序同时安装。这种类型的包最大可达 1 GB,但您只能拥有其中一种。快速跟随(Fast Follow)类型的包将在应用程序安装完成后不久的某个时间点安装。应用程序将能够在安装此类包时启动,因此开发人员在尝试使用资产之前应检查它是否已完成安装。这种资产包最大可达 512 MB。最后一种类型是按需交付(On Demand)类型。除非应用程序特别要求,否则这些资产包永远不会下载到设备上。如上所述,所有资产包的总大小不能超过 2 GB,并且您最多可以拥有 50 个单独的资产包。

如果您的应用程序包含大量资产,例如游戏,您会发现这些类型的包非常有用。音乐、电影或纹理等资产会占用应用程序包中的大量空间。如果能够将它们拆分出来,您可以更自由地将基于代码的功能放入实际游戏或应用程序中。

如果您想了解更多信息,您可以阅读 https://developer.android.com/guide/playcore/asset-delivery 上的 Asset Delivery。

问题:构建资产包

使用 .NET 8 版本的 .NET Android,.NET 构建系统不支持构建资产包。有一个名为“AndroidAppBundleModules”的MSBuild ItemGroup,可以将其他 zip 文件添加到 aab 包。然而,用户仍然需要想办法使用 gradle 或 aapt2 手动构建资产包。有些社区提供的技巧可以使用,但如果能够直接在 .NET Android 中使用此功能就更好了。这些技巧中的大多数都需要创建一个单独的项目,并在解决方案中添加自定义构建目标,以构建相应的zip文件。这使得操作起来有点不便。

解决方案:AssetPack 元数据

我们花了很长时间思考如何最好地实现资产包支持。理想情况下,我们希望不仅 .NET Android 开发人员可以轻松创建资产包,还允许 .NET Maui 开发人员使用它。

我们决定使用 MSBuild 元数据来控制资产包的创建。无需创建任何额外的项目或处理自定义目标。只需为AndroidAsset项目添加一些简单的元数据即可让用户定义资产包。

以下是示例项目中的文件

MyProject.csproj
MainActivity.cs
Assets/
    MyLargeAsset.mp4
    MySmallAsset.json
AndroidManifest.xml

文件 MyLargeAsset.mp4 和 MySmallAsset.json 都会在发布应用程序时被打包到主 .aab 文件中。假设 MyLargeAsset.mp4 超过了 200 MB的限制,因此将其放在主应用程序包中是不可行的。所以我们想要做的是将此资产放入一个Install Time资产包中。这样我们就可以确保该资产在应用程序在设备上安装时就已就位。

通过新系统,我们可以利用为 AndroidAsset ItemGroup 支持的两个新元数据属性。

第一个 Metadata 属性是 AssetPack。如果存在该属性,它将控制资产最终将被放入哪个资产包中。如果不存在,则资产将默认被放入主应用包中。AssetPack 名称将采用 $(AndroidPackage).%(AssetPack) 的形式,因此,如果您的项目包名称是 com.foo.myproject,并且 AssetPack 值为 bar,则资产包将为 com.foo.myproject.bar。AssetPack 有一个特殊值base。它可以用于确保某些资产最终被放入主应用程序包而不是资产包。关于这一点,稍后将详细介绍。另一个是 DeliveryType。如果定义了这个属性,您可以使用它来控制创建的资产包类型。此值的有效值为 InstallTime、FastFollow 和 OnDemand。如果不存在,默认值为 InstallTime。

因此,在我们的示例中,如果我们想将 MyLargeAsset.mp4 资产移至其自己的资产包中,我们可以在 MyProject.csproj 中使用以下内容。请注意,我们使用 Update 而不是 include,因为 .NET Android 支持资产的自动导入。

<ItemGroup>
    <AndroidAsset Update="Assets/MyLargeAsset.mp4" AssetPack="myassets" />
</ItemGroup>

这将导致 .NET Android 构建系统创建一个名为 com.foo.myproject.myassets 的新资产包,并将 MyLargeAsset.mp4 包含在该包中。此资产包将自动包含在最终的 .aab 文件中。根本不需要手动创建此包。由于 DeliveryType 的默认值默认为 InstallTime,因此在这种情况下不需要额外的操作。

更完整的示例

现在可能存在一些需要控制哪些资产放入包、哪些不放入包的用例。但您也有数百个资产。在这种情况下,您可能希望使用通配符来更新自动导入的项目。

<ItemGroup>
    <AndroidAsset Update="Assets/*" AssetPack="myassets" DeliveryType="FastFollow" />
</ItemGroup>

上面的代码片段将使所有从 Assets 文件夹导入的资源都进入 myassets 资源包,且该资源包的交付类型为 FastFollow(快速跟随)。但是,如果您有一两个需要放入主程序包中的资产,因为资产包可能在需要时未被安装,我们需要一种方法来实现这一点。

这就是前面提到的 AssetPack base 值的由来。

<ItemGroup>
    <AndroidAsset Update="Assets/*" AssetPack="myassets" DeliveryType="FastFollow" />
    <AndroidAsset Update="Assets/myimportantfile.json" AssetPack="base" />
</ItemGroup>

在上述更新的示例中,myimportantfile.json 现在将出现在主应用程序包中,而不是 myassets 资产包中。这是一种控制哪些特定资产最终出现在特定位置的好方法。

检查 FastFollow 资产包的状态

如果您使用的是基于 FastFollow 的资产包,则需要在尝试访问其内容之前检查它是否已安装。首先将 PackageReference 添加到 Xamarin.Google.Android.Play.Asset.Delivery NuGet 包。

<ItemGroup>
<PackageReference Include="Xamarin.Google.Android.Play.Asset.Delivery" Version="2.0.5.0" />
</ItemGroup>

这将引入与资产包配合使用所需的 API。

接下来,我们需要使用 Google.Play.Core.Assets.AssetPackManager 来查询 FastFollow 资产包的位置。我们可以使用 GetPackLocation 方法来执行此操作。如果它对返回的 AssetPackLocation 上的 AssetsPath 方法返回 null,则表示该包尚未安装。如果它返回任何其他内容,则表示包的安装位置。

var assetPackManager = AssetPackManagerFactory.GetInstance (this);
AssetPackLocation assetPackPath = assetPackManager.GetPackLocation("myfastfollowpack");
string assetsFolderPath = assetPackPath?.AssetsPath() ?? null;
if (assetsFolderPath is null) {
    // FastFollow Pack 未安装。
}

下载 OnDemand 资产包

如果您想使用 OnDemand 包,则需要手动下载这些包。为此,您必须使用 Google.Play.Core.Assets.IAssetPackManager。为了监控下载进度,您需要使用 AssetPackStateUpdateListener 类型。但是,由于此类型是 Java 通用类型,因此您不能直接使用它。为了解决这个问题,.NET Binding 提供了一个 AssetPackStateUpdateListenerWrapper 类,可用于连接事件来监控进度。

首先我们需要声明我们需要的字段。

// 这是底层的 IAssetPackManager
IAssetPackManager assetPackManager;
//这是 AssetPackStateUpdateListener 的包装器,它允许我们提供事件来从 IAssetPackManager 获取更新。
AssetPackStateUpdateListenerWrapper listener;

接下来,我们声明要用来监控下载的委托。请注意,AssetPackStateEventArgs 是 AssetPackStateUpdateListenerWrapper 的嵌套类。您可以在 Android 文档中了解可以使用哪些 AssetPackStatus 值。

void Listener_StateUpdate(object sender, AssetPackStateUpdateListenerWrapper.AssetPackStateEventArgs e)
{
    var status = e.State.Status();
    switch (status)
    {
        case AssetPackStatus.Downloading:
            long downloaded = e.State.BytesDownloaded();
            long totalSize = e.State.TotalBytesToDownload ();
            double percent = 100.0 * downloaded / totalSize;
            Android.Util.Log.Info ("Listener_StateUpdate", $"Downloading {percent}");
            break;
        case AssetPackStatus.Completed:
            break;
        case AssetPackStatus.WaitingForWifi:
            assetPackManager.ShowCellularDataConfirmation (this);
            break;
    }
}

接下来要做的是通过 AssetPackManagerFactory.GetInstance 方法创建一个IAssetPackManager 实例。然后我们需要创建一个AssetPackStateUpdateListenerWrapper 实例并连接 StateUpdate 委托。

assetPackManager = AssetPackManagerFactory.GetInstance (this);
// 创建我们的包装器并设置事件处理程序。
listener = new AssetPackStateUpdateListenerWrapper();
listener.StateUpdate += Listener_StateUpdate;

当应用程序恢复或暂停时,我们需要确保使用 assetPackManager RegisterListener 和 UnregisterListener 监听器,以确保能收到进度更新。

protected override void OnResume()
{
    // 使用 SplitInstallManager 注册我们的 Listener Wrapper 以便我们得到反馈。
    assetPackManager.RegisterListener(listener.Listener);
    base.OnResume();
}
protected override void OnPause()
{
    assetPackManager.UnregisterListener(listener.Listener);
    base.OnPause();
}

在下载 OnDemand 资产包之前,我们需要先检查它是否已安装。与 FastFollow 资源包类似,如果 AssetsPath() 返回 null,则说明资源包尚未安装。您可以调用 assetPackManager.Fetch 来开始下载。您还可以使用 C# 扩展方法 AsAsync,它返回一个可以 await 的 Task。此扩展方法在 Android.Gms.Extensions 命名空间中可用。

// 尝试安装新功能。
var assetPackPath = assetPackManager.GetPackLocation ("myondemandpack");
string assetsFolderPath = assetPackPath?.AssetsPath() ?? null;
if (assetsFolderPath is null) {
    await assetPackManager.Fetch(new string[] { "myondemandpack" }).AsAsync<AssetPackStates>();
}

从此时起,我们可以通过之前设置的 AssetPackStateUpdateListenerWrapper 来监控下载状态和进度。

调试和测试

若要在本地测试您的资产包,您需要确保正在使用 aab格式 AndroidPackageFormat。默认情况下,.NET Android 将使用 apk 进行调试。如果 AndroidPackageFormat 保留为 apk,则所有资产将像平常一样打包到 apk 中。

在您的csproj 中的设置以下选项,将启用调试资产包所需的设置。

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<AndroidPackageFormat>aab</AndroidPackageFormat>
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
<AndroidBundleToolExtraArgs>--local-testing</AndroidBundleToolExtraArgs>
</PropertyGroup>

–local-testing 标志是本地设备上测试所必需的。它告诉 bundletool 应用程序,所有资产包都应安装在设备上的缓存位置。它还设置 IAssetPackManager 以使用将使用缓存的模拟下载器。这允许您在调试环境中测试安装 OnDemand 和 FastFollow 资产包。

我可以在我的 Maui 应用程序中使用它吗?

是的,当然!在为 Android 构建 Maui 应用程序时,您使用的是 .NET Android SDK。因此,Maui 开发人员可以使用 .NET Android 用户可用的所有功能。Maui 确实有自己的定义资产的方式,即通过 MauiAsset 构建操作。向 MauiAsset 项目添加额外的 AssetPack 和 DeliveryType 元数据将产生相同的结果。其他平台将忽略额外的元数据。

<MauiAsset
    Include="Resources\Raw\**"
    LogicalName="%(RecursiveDir)%(Filename)%(Extension)"
    AssetPack="myassetpack"
/>

如果您有想要放置在 Asset Pack 中的特定项目,则可以使用 Update 方法来定义 AssetPack 元数据。

<MauiAsset Update="Resources\Raw\MyLargeAsset.txt" AssetPack="myassetpack" />

结论

Asset Packs 提供了一种很好的方式,可以在不影响随应用程序媒体或数据量的情况下增加应用程序的大小。将部分或全部资产移入资产包,可以让您将更多的基础包大小用于代码和用户界面。请务必阅读有关 .NET 9 中 .NET MAUI 的新增功能的更多信息。

【MAUI】图标和启动页面(安卓) 阅读详情

相关推荐

移动开发(一):使用.NET MAUI开发第一个安卓APP

它是.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。.NET MAUI 是一款开放源代码应用,是 Xamarin.Forms 的进化版,从移动场景扩展到了桌面场景,并从头重新生成了 UI 控件,以提高性能和可扩展性。

IT技术分享社区 2708

基于最新的MAUI混合VUE3开发Android应用(2022-11-01)

微软MAUI框架集成VUE3开发,支持js调用C#方法

weixin_46545658的博客 5340

.Net MAUI 搭建Android 开发环境

1. 安卓手机设备,开启 “开发者模式”,开启USB调试。安装时候选择上 .Net MAUI 跨平台开发。,Android镜像、编译工具、加速工具。4.调试成功,安装运行到手机上了。3.启动调试,选择 安卓设备。

天马3798 2261

初学者记录一下,MAUI-Android开发中遇到的坑之TCP监听

只会用C#,没接触过安卓,用MAUI开发AndroidAPP,功能很简单, 就是实时显示ModBus传过来的数据,UI和逻辑没啥问题,就是在写TCP监听的时候,死活报错Permission denied。实在没办法了,困扰了我两天了,于是又仔细看ai给的建议,发现一条我一直默认忽略从来没试过的,就是建议使用1024以上的端口。为啥一直忽略这条建议,我用C#的时候,从来没有遇到这种啊,端口想用啥用啥,只要没占用,随便用,没想到安卓来这么一手,学到了。这个就是初学者做一下笔记,各位大拿笑笑就好。

qq_21090867的博客 1171

ubuntu20.04下dsp-slam的运行配置

DSP-SLAM:具有深度形状先验的面向对象的 SLAM

baidu_38431960的博客 3159

数学概念 | 旋转矩阵、欧拉角、四元数

旋转矩阵、欧拉角、四元数概念及相关运算;

NapoleonCoder的博客 772

技术速递|使用 Native Library Interop 为 .NET MAUI 创建绑定

作者:Rachel Kang排版:Alan Wang在当今的应用开发领域,通过利用本机功能来扩展 .NET 应用程序的能力非常宝贵。.NET MAUI 处理程序架构使开发人员能够使用 .NET 代码直接操作本机控件,甚至允许无缝创建跨平台自定义控件。然而,其潜力不仅限于原生平台 API。如果您还能利用本机库 API,将会解锁更多可能性。

MicrosoftReactor的博客 1399

解决LangChain4j报错HTTP/1.1 header parser received no bytes

当使用调用自己部署的大模型服务时报错: 报错信息如下:

weixin_44455388的博客 2336

技术速递|介绍 .NET MAUI 社区工具包 v8 :包含 TouchBehavior 支持!

作者:Gerald Versluis排版:Alan Wang.NET MAUI 社区工具包团队很自豪地向您介绍 .NET MAUI 社区工具包的第 8 版!在这个最新的主要版本中,我们为您带来了备受期待的 TouchBehavior(以前称为 TouchEffect)。此外,请注意 Windows 上 Snackbar 的重大变化,而且您知道可以为 Android 导航栏着色吗?

MicrosoftReactor的博客 1265

MacOS M芯片部署ComfyUI:从环境排雷到插件生态一站式指南

本文为MacOS M系列芯片用户提供了一份详尽的ComfyUI部署指南。文章深入剖析了因架构差异导致的常见安装报错根源,并给出了基于MPS后端的正确PyTorch安装命令。从创建纯净Python虚拟环境、分步安装依赖,到验证GPU加速,手把手指导完成部署。同时,还推荐了包括管理器、汉化在内的必备插件,以完善使用生态,帮助用户一站式解决从环境搭建到效率提升的所有问题。

weixin_29261711的博客 994

Python多进程实战:用BaoStock高效下载股票历史数据的5个优化技巧

本文详细介绍了使用Python多进程技术通过BaoStock高效下载股票历史数据的5个优化技巧。从理解BaoStock的数据获取机制到进程池配置、智能任务分片、异常处理及性能监控,帮助开发者显著提升数据下载效率,特别适合量化交易领域的数据采集需求。

weixin_30369041的博客 458

.NET MAUI 跨平台应用程序 (Windows App 和 Android )示例

也就前周,.Net MAUI正式版出来了 ,一个支持跨平台的UI框架,Linux支持情况官网也没说,按理来说应该也是支持的,刚好,我最近也在研究GUI的基本原理,微软出品还是值得深入研究一下的,就先来个样例,瞅瞅。MAUI 安装首先得是 Visual Studio 2022,然后,版本更新到最新,版本为 17.3.0打开 Visual Studio Installer 进行安装版本,即可,建议直接...

zls365365的博客 3453

黑猫带你学eMMC协议第1篇:全网最全emmc协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

黑猫带你学eMMC协议第7篇:全网最全emmc写保护详解(write protect) 黑猫带你学eMMC协议第8篇:emmc可靠写详解(Write Reliability) 黑猫带你学eMMC协议第9篇:emmc的分区配置(partitioning) 黑猫带你学eMMC协议第10篇:eMMC命令队列详解(CMDQ) 黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim…) 黑猫带你学eMMC协议第12篇:

黑猫奥利奥的博客 2万+

.NET MAUI 安卓应用开发初体验

.NET MAUI 安卓应用开发

徐业贵 2913

基于RK3568的YOLOv11模型端侧推理优化与部署实战指南

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

m0_64661770的博客 115

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

如何使用.NET MAUI开发Android扫码应用

NETMAUI是Xamarin的进化版,如果你已经用了Xamarin,那么可以尝试把工程移植到.NETMAUI。这篇文章分享下我的移植心得。

yushulx的专栏 7859

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MAUI(C#)安卓开发起步

MAUI(C#)安卓开发起步

编程之道在明明德在亲民在止于至善 3167

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MAUI Android 关联文件类型

打开某个文件,后缀是自己想要的类型,在弹出的窗口(用其它应用打开)的列表中显示自己的应用图标 点击后可以获得文件信息以便于后续的操作

IT老大哥 422

使用.NET MAUI开发第一个安卓APP

它是.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。.NET MAUI可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。使用 .NET MAUI 开发第一个 Android 应用是一个直观的过程,涉及到安装必要的工具、创建项目、编写代码、调试以及运行应用。

zzlyx99的专栏 4679

MAUI开发Android程序使PDA扫码广播消息转发至Web页面

公司系统的手持终端(PDA)是用的Vue写的前端代码在PDA上用浏览器直接打开Web页面PDA扫码的时候,输出模式直接用模拟键盘按键的方式输出这样在Web页面上,如果一个输入框在当前有焦点的情况下PDA扫码的内容会直接填充至对应的输入框正常的话这样没有问题但是最近有一个项目,PDA不是我们提供。而是使用现有PDA,要把我们的系统在现有PDA上使用但是现有PDA使用的扫码输出方式是用的Andorid广播因为现有PDA不只有我们一家系统,所以不能修改扫码输出方式。

Gefangenes的博客 3350

MAUI 开发 Android 程序配置

首先安装工作负荷 然后设置 Android SDK 的代理,网上的一些旧的博文可能会使用 android 命令,实际上该命令已经被 google 弃用,应该使用 sdkmanager 命令 打开此文件夹(如果 VS 为默认安装位置) 然后设置代理运行一下命令 .\sdkmanager.bat --proxy=http --proxy_host=mirrors.neusoft.edu.cn --...

weixin_43464294的博客 1398

.NET MAUI开发的安卓、iOS软件和Java开发的安卓和Swift开发的iOS的区别

NET MAUI使用C#,通过.NET 运行时和AOT编译,提供跨平台开发。使用Java语言,编译为Java 字节码,运行时依赖ART虚拟机来执行, ART 提供了 AOT 编译。使用Swift语言,直接编译为机器码,运行时没有虚拟机的开销,提供较高的性能和更紧密的与操作系统的集成。注意:该内容由由AIGC提供。

weixin_49784554的博客 1577

VS2022 MAUI Hello World——Windows平台及Android平台效果

学更好的别人,做更好的自己。——《微卡智享》本文长度为2426字,预计阅读7分钟前言微软的Visual Studio 2022在11月8号已发布,除了.Net6,改为64位的应用程序,将不...

Vaccae的博客 2万+

MAUI android连接sqlserver

在Platforms\Android下新建DangerousTrustProvider.cs文件,如下图。google搜索了一圈, 都需要使用ssl证书才能解决,终于找到不用证书的解决办法,参考地址。打开,MauiProgram.cs增加调用代码。复制上面的代码,粘贴替换,如图。再次用模拟器测试,读取成功。用控制台程序测试正常读取。

mansai的专栏 2336

【亲测免费】 简化MAUI安卓打包流程:MAUIAndroidReleaseTool 推荐

简化MAUI安卓打包流程:MAUIAndroidReleaseTool 推荐 项目介绍 在移动应用开发中,打包发布是一个不可或缺的环节。对于使用MAUI(.NET Multi-platform App UI)框架的开发者来说,安卓应用的打包过程可能显得有些繁琐。为了简化这一流程,我们推出了 MAUIAndroidReleaseTool,一个专为MAUI安卓应用设计的简易打包工具。 MAUIAndr...

gitblog_01160的博客 726
上一篇: GitHub 驱动 AIOps III|用 GitHub 构建 SLMOps
下一篇: 技术速递|Python in Visual Studio Code 2024年9月发布
微软Reactor
博客等级 码龄6年 9714粉丝 729原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值