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

开篇记

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.mzph.cn/news/586414.shtml

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

相关文章

大数定律中心极限定理

1.切比雪夫不等式 切比雪夫不等式可以对随机变量偏离期望值的概率做出估计,这是大数定律的推理基础。以下介绍一个对切比雪夫不等式的直观证明。 1.1 示性函数 对于随机事件A,我们引入一个示性函数 I A { 1 , A发生 0 , A不发生 I_A\begin{cases} 1&…

Chrome浏览器进程工作原理和机制

Chrome浏览器进程工作原理和机制 Chrome架构:一个页面四个进程进程和线程单进程浏览器多进程浏览器多进程浏览器解决的问题Chrome的进程模式 TCP协议:如何保证页面文件被完整送达浏览器IP:把数据包送达目的主机UDP:把数据包送达应…

vivado CDC约束-约束总线偏移

CDC限制 关于CDC约束 时钟域交叉(CDC)约束适用于具有不同启动和捕获时钟。根据发布和捕获时钟关系以及在CDC路径上设置的定时异常。例如同步时钟之间但被错误路径约束覆盖的CDC路径不定时,并且因此被视为异步CDN。异步CDC路径可以是安全的&…

vue 导出 HTML 结构为 Word 文档(.docx)-支持表格、css样式、图片

在 Web 开发中,有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档,以便更方便地分享和打印。本文将介绍如何使用 html-docx-js 和 file-saver 这两个 JavaScript 库,实现将 HTML 结构导出为 Word 文档的功能。 工具简介 1. html-d…

lv13 内核模块参数和依赖

1 模块传参 1.1 模块参数设置 将指定的全局变量设置成模块参数 module_param(name,type,perm);//将指定的全局变量设置成模块参数 /* name:全局变量名 type:使用符号 实际类型 传参方式bool bool insmod xxx.ko 变量名0 …

进阶学习——Linux系统磁盘管理与文件系统

目录 一、磁盘 1.认识磁盘 2.分区 2.1MBR(Master Boot Record)——主引导记录 2.2GPT分区 2.3磁盘分区结构 3.文件系统 3.1文件系统组成 3.1.1XFS ext4 3.1.2swap 3.1.3FAT16、FAT32 3.1.4NTFS(xfs) 3.1.5EXT4 3…

[Angular] 笔记 9:list/detail 页面以及@Output

1. Output input 好比重力,向下传递数据,list 传给 detail,smart 组件传给 dumb 组件,父组件传给子组件。input 顾名思义,输入数据给组件。 output 与之相反,好比火箭,向上传递数据或事件。ou…

云计算IaaS、PaaS和SaaS之

提供的服务来比较如下两图 示例图 示例图

整数规划-割平面法

整数规划-割平面法 割平面法思想Gomorys割平面法原理实例 谨以此博客作为学习期间的记录。 割平面法思想 在之前,梳理了分支定界法的流程:分支定界法 除了分支定界法,割平面法也是求解整数规划的另一个利器。 我们已经知道,线性规划的可行域…

vscode软件安装步骤

目录 一、下载软件安装包 二、运行安装包后 一、下载软件安装包 打开vscode官方网址,找到下载界面 链接如下:Download Visual Studio Code - Mac, Linux, Windows 我是windows电脑,各位小伙伴自己选择合适的版本,点击下载按钮…

基于虚拟机ubuntu的linux和shell脚本的学习,以及SSH远程登陆实战

简介 特点 是一款操作系统,跟windows,macos一样,有下面的特点 简单和高效,一切皆文件,所有配置都通过修改文件解决,不需要繁琐的权限和设置 权限高,把所有细节都交给用户,可完全自定义 安全,所有程序只有自己执行才会启动 分类 1、debian系主要有Debian,Ubun…

ESP32入门六(读取引脚的模拟信号[3]:信号出现误差的原因[硬件篇])

在之前的文章中,我们介绍了ESP32在读取模拟信号时出现的误差的软件方面原因,在这一篇中,将会介绍并测试由于硬件或其它方面导致数据出现误差的原因。 一、厂商原因 首先,我们需要知道,在每块EPS32中,在出…

海凌科HLK-V2语音识别模块更新词条

简介 HLK-V20 是海凌科的离线语音识别模块, 中英文不同时支持, 只支持中文/英文, 具体识别看每次的SDK更新设置;资料下载 可以在微信公众包搜索海凌科或HI-LINK, 下载资料 感知模块->HLK-V20 模块限制 中英文被限制, 需要根据你在官网设置的SDK信息进行确定;可以仅设置3…

goframe v2 模板引擎的用法

这里用的goframe v2框架 提醒:下面的import 引入的控制器和api,根据自己实际项目路径 main函数 import ("context""github.com/gogf/gf/v2/net/ghttp""github.com/gzdzh/dzhgo/modules/dzhCms/controller/web""gith…

STM32移植LVGL图形库

1、问题1:中文字符keil编译错误 解决方法:在KEIL中Options for Target Flash -> C/C -> Misc Controls添加“--localeenglish”。 问题2:LVGL中显示中文字符 使用 LVGL 官方的在线字体转换工具: Online font converter -…

深入浅出理解TensorFlow的padding填充算法

一、参考资料 notes_on_padding_2 二、TensorFlow的padding算法 本文以TensorFlow v2.14.0版本为例,介绍TensorFlow的padding算法。 1. 引言 tf.nn.conv2d and tf.nn.max_pool2d 函数都有padding参数,在执行函数之前,都需要进行填充padd…

数字资产学习笔记

附:2023年数据资源入表白皮书下载: 关注WX公众号: commindtech77, 获得数据资产相关白皮书下载地址 1. 回复关键字:数据资源入表白皮书 下载 《2023数据资源入表白皮书》 2. 回复关键字:光大银行 下载 光…

基于 Vue3 和 WebSocket 实现的简单网页聊天应用

首先附上项目介绍,后面详细解释技术细节 1. chat-websocket 一个基于Vue3和WebSocket的简易网络聊天室项目,包括服务端和客户端部分。 项目地址 websocket-chat 下面是项目的主要组成部分和功能: 项目结构 chat-websocket/ |-- server/ # WebSocket 服…

二分查找(非朴素)--在排序数组中查找元素的第一个和最后一个位置

个人主页:Lei宝啊 愿所有美好如期而遇 目录 本题链接 输入描述 输出描述 算法分析 1.算法一:暴力求解 2.算法二:朴素二分算法 3.算法三:二分查找左右端点 3.1查找左端点 3.1.1细节一:循环条件 3.1.2细节二…

pycharm找回误删的文件和目录

昨天不知道做了什么鬼操作,可能是运行了几个git命令,将项目里面的几个文件删除了,有点懵。 我知道pycharm可以找回文件的历史修改记录,但是对于删除的文件能否恢复,一直没试过。 找到删除文件的目录,点击右…