我为什么选择Xamarin开发ios app安卓app
临岁之寒简书作者,转载
Xamarin是一项跨平台开发技术,之前是收费的,而且据说收费不菲,所以使用的人数比较少,在国内几乎无人问津。后来Xamarin被微软收购,现已免费开放,相信今后国内的使用人群会大幅地增长,一方面是因为免费的东西总是受人欢迎的,另一方面是Xamarin确实提供了一种比较强大的技术来支持跨平台开发(这里所指主要是Android和iOS上的开发,但其实不止于此)。
如今市面上号称可以提供跨平台开发的方案很多,比如React Native、PhoneGap、IONIC等,这些方面大多数都是基于HTML和JavaScript等技术实现的跨平台开发,在开发效率上自然是没话说,但是这些技术在性能上则逊色于原生的开发技术,而这恰恰是Xamarin得以生存的空间。
Xamarin声称可以获得不差于原生技术的性能,甚至在某些方面还有可能超越原生,我想这指的应该在是Android方面。我个人分析,原因可能是这样的。Xamarin使用C#进行开发(好像用F#也可以,不过我没有试过,据说F#也是一门非常不错,以后有时间会学习学习),C#默认方法是非虚的,即在子类中要重写方法,必须在父类中声明为virtual,而java默认所有方法都是虚方法,所以C#可以减少这方面的开销。其次的话,可能是微软毕竟也是老牌的IT公司,在系统软件方面的优化能力不容小觑,手里的黑科技也是不少,敢说这话应该是有底气的。当然这不是最重要的,只要能够在大多数情况获得近似于原生的性能,便已是非常不错了。
Xamarin主要有这么几项技术,Xamarin.Android、Xamarin.iOS和Xamarin.Forms,此外还有Xamarin.UWP、Xamarin.Windows、Xamarin.WinPhone等,但鉴于目前的市场占有率,后面几项可以暂时不去理会。
无论是Xamarin.Android还是Xamarin.iOS,本质都是对原生API做了一层C#的封装,因此在使用上与原生API会十分相似。这种封装会结合一些C#的语法特性,让开发者可以享受C#的语法糖。其中Xamarin.iOS是直接编译成ARM的二进制代码,因此执行效率肯定是非常高的。与此不同,Xamarin.Android被编译成中间语言,Xamarin在APK安装包中会包含一个mono的运行时,代码是在mono运行时和安卓本地的运行时上完成工作的,可想而知,这中间需要付出一些开销,而且会使安装包体积增大许多,但是考虑到设备的运行空间和存储空间都在高速增长,这也不能算是一个特别致命的缺点。
而Xamarin最为关键的技术还不是上面的两项,而是Xamarin.Forms。这项技术把IOS、android、UWP等平台的GUI进行了一统地抽象,开发者只需要写一套代码,编译器会在编译时将界面映射到原先控件上,从而获得原生平台的外观和性能。这种做法对于开发者应该是最喜闻乐见的,至少我是如此,相比于那种运行的虚拟层上的跨平台方式,这种做法性能损耗最少。当然,损耗小并不代表没有,官方也表示,Xamarin.Forms不适合用于开发图形界面操作特别复杂且频繁的应用。遇到这种情况,我们可以用Xamarin.IOS或Xamarin.Android来解决,也就是说Xamarin.Forms可以与Xamarin.IOS或Xamarin.Android在同一个项目结合使用。就以我准备使用Xamarin做输入法为例,根据Xamarin的特点,我用Xamarin.Forms来做输入法的设置界面,节省重复开发一套界面和业务逻辑的精力;而用Xamarin.IOS和Xamarin.Android来做输入法界面,以发挥最大的性能。目前从我实验的结果看,这个想法是可行的。虽然我最开始的想法是连输入法界面也用Forms来做,但发现在输入法界面无法使用Forms编写的界面(根据我的实验,Forms的界面应该只能用于制作Activity的界面,而不能做Service的界面,也可能是我不知道应该怎么实现),所以只好退而求其次,不过现在这个结果也是不错的,毕竟输入法界面本身对性能的要求就比较高,使用更接近原先代码的技术自然要好一些。
至此,我使用Xamarin的意图已经很明显了,就是想要用于它实现一个跨平台的移动输入法,具体的说是岁寒输入法。现在首先准备做的是IOS版的,然后再反过来重写Android版本,如果日后WindowPhone能有起色,并且开放第三放输入法的权限,那么基于这些代码实现一个WindowPhone就不会是一件再起炉灶又大费周章的事情。而如果使用原生语言开发的话,那每个平台都得重写一套代码,代价实在太大了,尤其对于个人开发者而言,不堪重负,这也是为什么Xamarin对我来说特别有吸引力的原因。
跨平台有跨平台的方便,自然也有跨平台的难处,Xamarin也仅仅提供了一种跨平台开发的手段而已,想要将这个手段发挥好,最大限度地实现对代码的重用,则需要更高的技巧和更多的思考。因此我不推荐初入开发门道的人选择Xamarin,在此之前,最好对其中一个平台及其开发过程有较深的理解。
Xamarin现在免费开放,显然这是微软的移动战略的一部分,由于自身操作系统在生态环境上的欠缺,迫使微软去推动跨平台技术的发展,以希望从其它平台上借势,从而反哺自身。在我看来,微软的移动操作系统不太可能会有转机,但这不意味着Xamarin作为一项技术没有希望。“有心栽花花不开,无心插柳柳成荫”的事情从不鲜见,只要抓住开发者这帮猢狲,微软这棵大树便不会倒,相信微软明白这个道理,作为开发者也不必过于担心微软过河拆桥。
这篇文章的目的不纯粹在于宣传Xamarin技术,毕竟微软没有给我发盒饭,但免费用着人家提供的技术,顺便给人家宣传宣传的好事也是值得做的。其实我主要是想在此立个字据,作为一个开始,日后尽可能地把开发过程中得到的经验和心得分享出来,既是一种记录,也是一种鞭策,以此自勉
相关文章:
我为什么选择Xamarin开发ios app安卓app
临岁之寒简书作者,转载 Xamarin是一项跨平台开发技术,之前是收费的,而且据说收费不菲,所以使用的人数比较少,在国内几乎无人问津。后来Xamarin被微软收购,现已免费开放,相信今后国内的使用人群会大幅地增长…...
安全基础~通用漏洞4
文章目录 知识补充XSS跨站脚本**原理****攻击类型**XSS-后台植入Cookie&表单劫持XSS-Flash钓鱼配合MSF捆绑上线ctfshow XSS靶场练习 知识补充 SQL注入小迪讲解 文件上传小迪讲解 文件上传中间件解析 XSS跨站脚本 xss平台: https://xss.pt/ 原理 恶意攻击者…...
2024/2/12 图的基础知识 2
目录 查找文献 P5318 【深基18.例3】查找文献 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 有向图的拓扑序列 848. 有向图的拓扑序列 - AcWing题库 最大食物链计数 P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 查找文献 P5318 【深基18.例3】…...
无人机飞行原理,多旋翼无人机飞行原理详解
多旋翼无人机升空飞行的首要条件是动力,有了动力才能驱动旋粪旋转,才能产生克服重力所必需的升力。使旋翼产生升力,进而推动多旋翼无人机升空飞行的一套设备装置称为动力装置,包括多旋翼无人机的发动机以及保证发动机正常工作所必…...
docker本地目录挂载
小命令 1、查看容器详情 docker inspect 容器名称 还是以nginx为例,上篇文章我们制作了nginx静态目录的数据卷,此时查看nginx容器时会展示出来(docker inspect nginx 展示信息太多,这里只截图数据卷挂载信息)&#…...
使用C++从零开始,自己写一个MiniWeb
第一步:新建项目 1、打开VS点击创建新项目 2、选择空项目并点下一步(切记不能选错项目类型) 3、填写项目名称和路径,点击创建即可 新建好后项目是这样的比较干净 4、右击源文件,点击添加,新建http.cpp文件…...
Android Graphics 图像显示系统 - 开篇
“ 随着学习的不断深入和工作经验的积累,欲将之前在博客中整理的Android Graphics知识做进一步整理,并纠正一些理解上的错误,故开设Graphics主题系列文章 ” 序言 由于工作需要,也源于个人兴趣,终于下决心花时间整理一…...
机器学习在各个行业的应用介绍
随着科技的飞速发展,机器学习已经从实验室走向了现实世界,逐渐成为各行各业不可或缺的工具。从金融领域到医疗健康,从零售市场到制造业,机器学习正在改变着我们的工作方式和生活质量。 本文将深入探讨机器学习在以下几个领域的应用…...
【生产实测有效】Windows命令行查看激活状态脚本
Windows查看激活状态关键代码 通过windows server 自带的PowerShell来执行 Get-WmiObject SoftwareLicensingProduct | Select-Object -Property Description, LicenseStatus | findstr "Operating System"|findstr "1$"Get-WmiObject SoftwareLicensingPr…...
简单的Udp服务器
目录 简单的UDP网络程序1.1 UdpServer.hpp1.2 UdpClient.cc1.3 main.cc1.4 makefile1.5 log.hpp 简单的UDP网络程序 1.1 UdpServer.hpp #pragma once#include <iostream> using namespace std;#include <unistd.h> #include <sys/types.h> #include <sy…...
【Linux进程间通信】用管道实现简单的进程池、命名管道
【Linux进程间通信】用管道实现简单的进程池、命名管道 目录 【Linux进程间通信】用管道实现简单的进程池、命名管道为什么要实现进程池?代码实现命名管道创建一个命名管道 理解命名管道匿名管道与命名管道的区别命名管道的打开规则 作者:爱写代码的刚子…...
Linux操作系统基础(九):Linux用户与权限
文章目录 Linux用户与权限 一、文件权限概述 二、终端命令:组管理 三、终端命令:用户管理 1、创建用户 、 设置密码 、删除用户 2、查看用户信息 3、su切换用户 4、sudo 4.1、给指定用户授予权限 4.2、使用 用户 zhangsan登录, 操作管理员命令…...
蓝桥杯——第 5 场 小白入门赛(c++详解!!!)
文章目录 1 十二生肖基本思路: 2 欢迎参加福建省大学生程序设计竞赛基本思路:代码: 3 匹配二元组的数量基本思路:代码: 4 元素交换基本思路:代码: 5 下棋的贝贝基本思路:代码: 6 方程…...
Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)
文章目录 题面链接题意题解代码总结 题面 链接 C. Kefa and Park 题意 求叶节点数量,叶节点满足,从根节点到叶节点的路径上最长连续1的长度小于m 题解 这道题目主要是实现,当不满足条件时直接返回。 到达叶节点后统计答案,用…...
797. 差分
Problem: 797. 差分 文章目录 思路解题方法复杂度Code 思路 这是一个差分数组的问题。差分数组的主要适用场景是频繁对原始数组的某一个区间进行增减操作。这种操作是区间修改操作,在这种操作下,差分数组只需要对区间的两个端点进行操作,时间…...
2024.2.5 vscode连不上虚拟机,始终waiting for server log
昨天还好好的,吃着火锅,做着毕设,突然就被vscode给劫了。 起初,哥们跟着网上教程有模有样地删除了安装包缓存,还删除了.vscode-server,发现没卵用,之前都是搜那个弹窗报错。 后来发现原来是vsco…...
CSS基础---新手入门级详解
CSS:层叠样式表 CSS(Cascading Style Sheets,层叠样式表),是一种用来为结构化文档添加样式(字体、间距和颜色)的计算机语言,css扩展名为.css。 实例: <!DOCTYPE html><html> <head><…...
Python中Pymysql库的常见用法和代码示例
关注B站可以观看更多实战教学视频:肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) pymysql是一个用于连接MySQL数据库的Python库,它允许你执行SQL查询并处理返回的结果。以下是pymysql库的一些常见用法和代码示例: 1. 安装…...
使用 WPF + Chrome 内核实现高稳定性的在线客服系统复合应用程序
对于在线客服与营销系统,客服端指的是后台提供服务的客服或营销人员,他们使用客服程序在后台观察网站的被访情况,开展营销活动或提供客户服务。在本篇文章中,我将详细介绍如何通过 WPF Chrome 内核的方式实现复合客服端应用程序。…...
fastapi mysql 开发restful 3
pip install mysql-connector-python pymysql 数据库链接 创建src目录,里面创建db.py 代码如下: # 导入mysql.connector模块,该模块提供了与MySQL数据库进行连接和交互的功能。 import mysql.connector # 定义一个函数get_db_connectio…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
