PLC-IoT 网关开发札记(1):存档和分发 Android App

news2025/1/31 18:04:24

开篇记

PLC-IoT 网关是作者开发的产品,根据客户需求,立项开发手机 App,为用户提供一种方便、直观、友好的设备操控方式。网关运行的是嵌入式 Linux 操作系统,计划通过某一种通信协议(例如 HTTP,MQTT或者 TCP Socket 等)和手机 App 数据交互。网关已经安装了 HTTP 协议栈,从今天开始手机侧的 App 开发。

开发使用的 IDE 是 Visual Studio,开发框架使用 Xamarin.Forms,同时开发 Android 和 IOS 应用,优先开发 Android,然后再考虑 IOS。

之所以选择 Visual Studio 而没有选择 Android Studio,首要的原因是 VS 可以同时开发 Android 和 IOS 应用,而 AS 好像不能开发 IOS 应用;另一个原因是 VS 使用 C#,AS 使用 Java(我没碰过 Kotlin)。我对 C# 比较熟悉,对 Java 比较不熟悉。C# 11 也具备了 Interface,功能覆盖能力不输于 Java。

开发嵌入式软件和开发手机 App 差异很大,扔下 VS 和 C# 也很长时间了,只能慢慢捡起来。

这一次的目标是建立一个简单的移动应用,然后打包分发到本地,生成一个 .apk,在手机上安装这个 .apk,能正确运行。

使用 Visual Studio 分发 Android 项目是移动 App 开发的必备步骤。在 Visual Studio 的各个版本中,App 分发的步骤和选项略有不同,本文使用 Visual Studio 2022 版本发布 Xamarin.Forms 的 Android App,经过诸多尝试,顺利地走通了发布的程序,供各位码神参考。

文中遵照 learn.microsoft.com (创建 Xamarin.Forms 应用程序快速入门 - Xamarin | Microsoft Learn)的步骤操作,创建了 Notes 项目,如下图所示。项目创建了三个页面:NotesPage、AboutPage和NoteEntryPage,纳入 Views,Models 中定义了 Note 类,使用 sqlite-net-pcl 作为本地数据源。项目的建立严格地遵照了 Microsoft Learn 的指引,在 Debug/Any CPU 配置下可以正确地在 Android 模拟器上运行。

分发步骤(亲测可用)

配置 Notes.Android

在解决方案管理器中,右键点击 Notes.Android 项目,点击 “属性”,打开其项目配置界面如下图。

“应用程序” 选项卡

通过“应用程序”选项卡中可以重新定义程序集的名称和默认命名空间(Namespace),可以重新指定 Android 编译版本的目标框架。这里均使用项目的默认值。

填写 Android 清单(Android Manifest)

如果不关注发布的 apk 的取名,可以使用项目的默认值,程序包名称的取名这时也不需要过多关注,应用程图标可以不设置(有些应用商店要求 apk 必须设置图标,那时再设置也不迟),应用程序主题保持不变,版本号设置为1,版本名称随便取名即可(我的做法是每一次发布都在版本名称的最后一部分bxxx的数字加1)。最低 Android 版本和目标 Android 版本设置成当前流行值,所需权限使用项目创建时的默认值。

需要注意的是 VS 有时会莫名其妙地修改了“最低 Android 版本”号,每一次设置时,应检查一遍,如果“最低 Android 版本”号和“目标 Android 版本”过低时,会导致分发失败,或者在手机真机上运行时发生闪退。

配置 “Android 选项”

确保“配置”为 Release,“平台”为 Any CPU。Debug 配置是不能分发的,指定 Any CPU 才可以在分发时获得支持多个 CPU 体系结构的代码和动态库。

Android 包格式选择 APK,Dex 编译器选用 d8(当前项目 VS 不支持 dx),代码压缩器可以不选,要选的话,应指定 r8,链接选择 “仅 SDK 程序集”,这样可以缩小 APK 的尺寸。

Android 选项卡的参数中大部分可以使用默认值,要特别注意 “调试程序” 要选择 “.NET (Xamarin)”,点击“高级”按钮,在 “支持的体系结构” 里,把 armeabi-v7a,arm64-v8a,x86 和 x86_64 都选中。当前市面上手机的处理器体系结构大多数都是 armv7 和 armv8 的,我尝试过不选择 x86 和 x86_64,打包过程中都发生了错误,现在尚不知为什么——反正,成功的打包和分发操作中,我总是把这四个体系结构都选中了。我猜想这其中一定会有某种副作用的,但在当前测试中没有发现运行时错误。以后留心就是了,先把整个流程走通再说。

“Android 包签名”选项卡

请注意:这里不要勾选“使用以下密钥存储详细信息对 .APK 文件签名”。我的操作过程中,每一次选中这个选项都会导致打包过程失败。

图中灰显的内容是我操作失败时的设置,不用管它们。

“生成”、“生成时间” 和 “引用路径” 选项卡使用默认值,不需要修改

生成和打包、分发

完成上述配置后,按 CTRL+S 保存。然后重新生成解决方案,等待生成成功(如果出错,那肯定是要修改的啦)。生成过程有点漫长,需要耐心等待 VS 底部状态栏的“漏斗”装满。点击 “生成” 菜单(或者右键点击 “Notes.Android”,选择 “存档...”),VS 启动打包和存档。

存档过程在 “存档管理器” 中自动开始,一个无范围进度条在滚动,

等待存档成功,可以看到这一次存档的基本信息如下。

然后点击 “分发”。

  1. 出现选择通道时选择 “临时”;
  2. 签名标识时选中一个先前已经生成的签名标识,如果没有签名标识,VS 会引导建立一个,然后点击 “另存为”;
  3. 在 “另存为” 对话框选择一个你认为方便存储的地方(我选择的是桌面的一个文件夹,专门存放分发的 apk 文件);
  4. 保存后,VS 提示输入签名密码,这时输入你在创建签名标识时设定的密码;
  5. 存档继续进行,如果没有错误的话,很快就完成了分发过程。

转存和安装

我使用微信的文件传输助手把分发的 apk 转存到我的手机,在手机上安装这个 app,手机会提示 “xxx 应用不符合 xx 市场安全规范,有风险......”,选择 “继续安装” 即可。App 安装好后,运行正确。

总结

Visual Studio 2022 发布 Xamarin.Forms 应用操作成功的关键如下。

  • 选择 “Release” 配置,和 “Any CPU”。
  • 调试程序选择 “.NET (Xamarin)”,“高级” 选项中把 armeabi-v7a、arm64-v8a、x86、x86_64 四个 CPU 体系结构都选中。
  • 在发布 Xamarin.Forms 应用时,在生成和存档(Archive)之前不要设置签名,而是在发布时选择签名标识。

谬误之处,请多指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1338435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序预览pdf,修改pdf文件名

记录微信小程序预览pdf文件,修改pdf名字安卓和ios都可用。 1.安卓和苹果的效果 2.需要用到的api 1.wx.downloadFile wx.downloadFile 下载文件资源到本地。客户端直接发起一个 HTTPS GET 请求,返回文件的本地临时路径 (本地路径),单次下载…

2024年元旦节放假通知

致尊敬的客户以及全体同仁: 旧岁已展千重锦,新年再进百尺竿。在这辞旧迎新之际,易天光通信提前祝您元旦快乐!生意兴隆,身体健康,万事如意!根据国家法定假期的规定,并结合公司实际情…

C# 使用Pipelines处理Socket数据包

写在前面 在上一篇中对Pipelines进行简单的了解,同时也留下了未解的问题,如何将Pipelines类库运用到Socket通讯过程中来解决粘包和分包。链接地址如下: 初识System.IO.Pipelines https://rjcql.blog.csdn.net/article/details/135211047 这…

嵌入式单片机的存储区域与堆和栈

一、单片机存储区域 如图所示位STM32F103ZET6的参数: 单片机的ROM(内部FLASH):512KB,用来存放程序代码的空间。 单片机的RAM:64KB,一般都被分配为堆、栈、变量等的空间。 二、堆和栈的概念 …

深入探索Spring Boot的核心功能:快速构建原生程序响应式处理数据(文末送书)

🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式:关注博主、点赞、收藏、评论,任意评论(每人最多评论…

【linux】Linux管道的原理与使用场景

Linux管道是Linux命令行界面中一种强大的工具,它允许用户将多个命令链接起来,使得一个命令的输出可以作为另一个命令的输入。这种机制使得我们可以创建复杂的命令链,并在处理数据时提供了极大的灵活性。在本文中,我们将详细介绍Li…

什么是焊点保护胶?它的作用是什么

焊点保护胶是一种用于电子元件焊点和连接处的保护的特殊胶水。它主要作用是提供以下几点的保护和增强功能: 防腐蚀保护 电子元件的焊点容易受到环境中的湿度、化学物质和其他腐蚀性因素的影响。焊点保护胶能够形成一层防护膜,减少腐蚀的风险&#xff0c…

苏州科技大学计算机817程序设计(java) 学习笔记

之前备考苏州科技大学计算机(专业课:817程序设计(java))。 学习Java和算法相关内容,现将笔记及资料统一整理归纳移至这里。 部分内容不太完善,欢迎提议。 目录 考情分析 考卷题型 刷题攻略…

Typora使用PicGo+Gitee上传图片报错403 Forbidden

Typora使用PicGoGitee上传图片报错403 Forbidden Typora使用PicGoGitee上传图片,上传失败了,错误信息如下 打开PicGo的日志文件查看,可以看到错误详情如下 换了一个插件github-plus重新配置,解决了这个问题 再打开日志查看&…

vue+element+springboot实现多张图片上传

1.需求说明 2.实现思路 3.el-upload组件主要属性说明 4.前端传递MultipartFile数组与服务端接收说明 5.完整代码 1.需求说明 动态模块新增添加动态功能,支持多张图片上传.实现过程中对el-upload组件不是很熟悉,踩了很多坑,当然也参考过别的文章,发现处…

浅谈互联网架构演变

更好的阅读体验 \large{\color{red}{更好的阅读体验}} 更好的阅读体验 前言 可以将某个项目或产品的架构体系按照如下方式分层: 业务层面:项目业务体系技术层面: 数据架构:数据持久层策略应用架构:应用层的实现方式 …

HBase深度历险 | 京东物流技术团队

简介 HBase 的全称是 Hadoop Database,是一个分布式的,可扩展,面向列簇的数据库,是一个通过大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案。本文会像剥洋葱一样,层层剥开她的心。 特点 首先我…

Android中_Service生命周期和AMS流程的创建

Service生命周期可以结合Android生命周期分析。 Service生命周期可以从两种启动Service的模式开始讲起,分别是context.startService()和context.bindService()。 Service的生命周期与启动和绑定状态相关。当调用startService()方法启动服务时,会执行onS…

65内网安全-域环境工作组局域网探针

这篇分为三个部分,基本认知,信息收集,后续探针, 基本认知 分为,名词,域,认知; 完整架构图 名词 dwz称之为军事区,两个防火墙之间的区域称之为dwz,但安全性…

大象机器人发布万元级水星Mercury人形机器人产品系列,联结未来,一触即达!

十四五机器人产业发展规划指出机器人的研发、制造、应用是衡量一个国家科技创新和高端制造业水平的重要标志。当前,机器人产业蓬勃发展,正极大改变着人类生产和生活方式,为经济社会发展注入强劲动能。 人形机器人作为机器人产业中重要的一环&…

【nw.js】使用nw.js将html页面打包成exe免安装程序

文章目录 一、批处理zip命令(已有可跳过此步骤)二、nw.js包三、使用批处理命令打包成exe可执行文件四、使用EnigmaVB打包成免安装可独立运行的exe文件五、结束 一、批处理zip命令(已有可跳过此步骤) 下载zip,你可以到该…

连续语义分割(CSS)24种最新经典方法汇总,包含数据回放、自监督、正则化等5个细分方向

连续语义分割(CSS)是计算机视觉中的一个新兴领域,其基本任务是在某一时刻学习预测特定类别的图像分割,并在随后需要的时候连续增加学习类别的数量,同时保持对已有类别的分割能力。这个过程中需要解决的主要挑战包括灾难…

Java虚拟机知识点总结

总结黑马程序员笔记 Java运行时数据区域 可以分成线程私有的和线程共享的区域。 线程私有的区域有:虚拟机栈,本地方法栈,程序计数器 线程共享的区域有:堆,方法区(在JDK1.8中,方法区放在了本…

【验证概括 SV的数据类型_2023.12.18】

验证概括 验证的过程是保证芯片实现符合规格说明书(Specification,spec)的过程 验证的两项任务: RTL sim:前仿真,验证功能 GLS-Gate (Level Simulation):后仿真,验证功能和时序 验…

JDK 14全景透视:每个Java开发者必知的新特性

欢迎来到我的博客,代码的世界里,每一行都是一个故事 JDK 14全景透视:每个Java开发者必知的新特性 前言:switch表达式标准化Switch表达式成为正式特性的意义:如何使用Switch表达式:注意事项: ins…