没有合适的资源?快使用搜索试试~ 我知道了~
传感器通信Java、Flutter和Kotlin/Native技术在传感器数据驱动应用中的比较Kamil Wasilewski和Wojciech Zabierowski *罗兹理工大学微电子与计算机科学系。Wólczan′ ska 221/223,90-924 Ekódz′,Poland;kamil. gmail.com*通信地址:wojciech. p.lodz.pl;电话:电话:+48-42-631-26-53翻译后摘要:由于移动技术的不断进步和快速增长的普及,近年来,对移动应用程序的需求迅速增加它的开发人员必须做出的最重要的决定之一是选择他们的应用程序将基于的技术本文致力于比较Java、Flutter和Kotlin/Native技术在基于处理和分析传感器数据的应用程序中的应用。的主要内容比较的是在上述每种技术中实现的用于Android OS的移动应用的效率和资源利用率。关键词:移动应用程序;移动框架;性能度量;编程语言选择校验误差更新引文:Wasilewski,K.;Zabierowski,W. Java、Flutter和Kotlin/Native技术在传感器数据驱动应用中传感器2021,21,3324。https://doi.org/10.3390/s21103324学术编辑:Ahmet Kondoz收稿日期:2021年接受日期:2021年发布时间:2021年5月11日出版商版权所有:© 2021作者。授权厂商MDPI,瑞士巴塞尔。本文是根据知识共享署名(CC BY)许可证(https:creativecommons.org/licenses/by/4.0/)的条款和条件发布的开放获取文章。1. 介绍为移动设备创建传感器数据驱动应用程序的方法的选择取决于许多因素。其中一个因素是工作量,因此开发所花费的时间 由于创建和维护已实现应用程序的成本,执行时间的优化至关重要[1]。当然,有必要参考此类应用程序应满足的标准,例如,ISO/IEC 25,010和ISO/IEC 9126 [2]。此外,在优化应用程序开发时间时,设备这一点很重要,因为目标设备由容量有限的电池供电。关于这个问题已经进行了许多研究,包括执行时间[4]和使用蓝牙LE与信标[5]通信对能耗的影响在我们部门,我们研究基于各种传感器网络的系统。 这项研究的结果随后被用于例如波兰国家研究和发展中心(StrategMed计划)支持的医疗项目,这些项目正在或将在该行业实施(例如,监测和防止患者跌倒的设备,或用于护理人员的智能套件这些项目中的许多涉及定制传感器的设计,例如适当集成的加速度计和陀螺仪,它们还必须具有比商业上可用的传感器更好的响应时间和精度虽然移动解决方案目前可能拥有几乎无限的资源,但由于必须小型化,标准智能手机无法用于我们的解决方案。因此,我们必须找到一种解决方案,既能快速处理从传感器网络收集的数据,又能使用很少的资源,使目标设备紧凑。实施的解决方案还必须可靠:传感器数据的延迟或不正确处理可能导致整个系统出现故障。例如,在上述用于防止跌倒的应用中,数据处理中的过度延迟可能导致脉冲传输延迟,并因此导致患者Corral、Sillitti和Succi [6]对使用PhoneGap前端的原生应用程序和混合应用程序的性能进行了比较分析。反过来,Delía等人[7]对性能进行了比较分析。传感器2021,21,3324。https://doi.org/10.3390/s21103324https://www.mdpi.com/journal/sensors传感器2021、21、33242月16日通过本地开发的移动应用程序和使用多平台解决方案实现。作者重点讨论了原生应用程序的实现时间,以及同时为许多平台创建移动应用程序的不同方法然而,这不是我们文章中介绍的方法,特别是关于Kotlin/Native和Flutter。在其他出版物中,进行了性能比较,例如Android Native Develop- ment Kit(NDK)与Dalvik [8,9]。作者进行了各种测试,例如数值计算(包括Ackerman递归函数),排序(Hash,Hash2),嵌套循环,随机数生成和字符串操作。作为一项规则,采取这样一套测试是有意义的,但在我们看来,它们并不能充分反映最使用移动应用程序时使用的常见和相关操作本出版物中的测试一般指的是语言本身的质量,并不特别以与外部世界的交流为特征。本文中的测试,由于其特殊性,更多地涉及在移动应用程序使用期间执行的最常见的操作(例如对象序列化和重新序列化,REST请求以及对集合,文件或数据库的操作然而,应该考虑到,当然可以发明其他测试(例如,矩阵运算的性能测试),并且不影响我们获得的结果的可靠性和正确视图。在文献中有许多与性能相关的比较,但这些比较是针对特定应用解决方案[10]的,而不是像本文中那样,影响应用最终结果的这使得现有的论文不那么通用,因此它们的结果只能用于满足非常特定条件的应用。出于这个原因,本出版物的作者决定回答使用不同编程语言对性能的影响问题,这取决于目标应用程序执行的操作。为了进行测试,Java被选为为Android设备创建本地应用程序的本地语言,而Flutter [11,12]和Kotlin/Native [13]框架用于其他解决方案。根据我们以前的项目经验和与其他团队的讨论,编程技术的选择通常是基于主观感受和习惯,甚至归结为实现一种语言,因为有人事先知道它。我们的研究是在对前面提到的医疗项目进行学术研究的过程中产生的,它使我们有机会根据本文中描述的非常具体的参数,根据要求,对移动应用程序技术进行适当的选择2. 背景和技术描述2.1. 移动应用移动应用程序(Mobile App)是一种设计用于在智能手机、平板电脑或手表等移动终端上运行的软件应用程序[14]。使用它们有无数的目的:通信;社交媒体;新闻;发送电子邮件;购物;付款;观看视频和流媒体;玩游戏。移动应用程序下载量每年都在稳步增长[15]。收入的增加和活跃用户的数量导致越来越多的企业通过移动设备提供服务。已经开发了诸如用于患者的医疗应用[16]、支持农民的应用[17]以及使残疾人的生活更轻松的应用[18随着这些解决方案的流行,有关开发的应用程序的性能的问题也出现了。 应用程序运行速度是否足够快,启动时是否不会冻结设备?操作是否足够快?开发和测试过程是否足够短,使得创建后续构建对程序员来说不是太繁重重要的是,创建过程不会太长,因此不会太昂贵。传感器2021、21、33243月16日2.2. 移动平台目前,Android(谷歌)和iOS(苹果)几乎占据了全球移动操作系统市场份额的98%,这在实践中限制了新应用程序的目标平台的选择其他以前常见的操作系统(如BlackBerry或Symbian)的重要性微不足道(图1)。图1.移动操作系统的全球市场份额。由于存在两个重要的移动平台,开发人员需要在开发的早期阶段决定最终的解决方案是原生的,基于Web的还是混合的[19,20]。2.3. 应用类型2.3.1. 原生本机应用程序是那些已经开发和设计为在特定平台上运行的应用程序。编译源代码以获得可执行代码。这是一个类似于传统应用程序中使用的过程。当应用程序准备好分发时,它被上传到特定于平台的应用程序商店,然后在那里对其进行审核,以确保应用程序满足目标平台的要求。原生应用程序的一个重要特征是,由于它们与特定平台甚至特定设备的高度兼容性,它们可以使用给定系统提供的所有外围设备,包括传感器[21,22]。2.3.2. Web移动Web应用程序被设计为在设备的浏览器中运行它们是使用标准的Web技术开发的,所以它们只不过是用HTML、CSS和JavaScript制作的网页 [23]。这种解决方案的优点无疑是其极端的便携性。这些应用程序将在所有具有与W3C标准兼容的Web浏览器的设备上正常工作然而,有一些限制,从操作系统体系结构的原则派生。对设备和系统功能的访问是有限的,因此这种移动应用程序类型不适合所有解决方案[24]。2.3.3. 混合混合应用是上述解决方案的某种组合它们是客户端的Web技术的混合,也运行在特定于平台的容器中。这提供了一个优势:代码可以在平台之间轻松传输。与此同时,由于使用专用于特定平台的API,混合应用程序传感器2021、21、33244月16日还可以访问设备和给定操作系统的许多功能[25]。2.4. 技术2.4.1. Android OSAndroid是由Android Inc. (Palo Alto,CA,USA),其最初的概念是为数码相机开发一个复杂的操作系统[26]。由于这些设备的市场很小,这个想法已经因此,新的目标是生产一个专用于移动设备的解决方案,与Windows Mobile和Symbian竞争。2005年6月,Android Inc.被Google以5000多万美元收购。Android的第一个商业版本于三年后的2008年9月发布2019年5月,谷歌在其年度开发者大会“Google I/O”上宣布该平台提供的节目数量超过360万个。2.4.2. JavaJava是一种基于类、面向对象的通用编程语言。它的起源可以追溯到1991年,当时Sun Microsystems的James Gosling决定实现一种简单,小型和平台无关的语言。第一个公共实现是在1996年发布的Java 1.0。2010年,Sun Microsystems被Oracle收购,此后一直负责Java开发[28]。Java是目前世界上最流行的语言之一,因此拥有最大的全球社区之一这个社区提供了大量的免费库和现成的解决方案。2.4.3. 颤振Flutter是Google于2017年创建的开源移动应用程序开发框架。它用于为Android和iOS开发应用程序,也是为Android的继任者Google Fuchsia创建应用程序的主要方法。基于Flutter框架的移动应用程序是用Dart语言编写的[12]。这种解决方案的最大优点是它允许iOS和Android应用程序使用相同的代码库另一个重要的特性是构建从代码级创建的用户界面的简单性2.4.4. Kotlin/NativeKotlin/Native是由JetBrains开发的Kotlin模块,能够为iOS和Android应用程序编译单个代码库。该框架的第一个早期版本于2017年初发布,稳定版本于2018年9月发布。 一个大型社区也参与了该技术的开发,准备扩展Kotlin/Native可能性的库。使用此框架开发的应用程序是用Kotlin语言编写的。一个代码库允许实现所有流行平台的版本,而不仅仅是移动平台[13]。3. 材料和方法为了进行测试,开发了三个移动应用程序,每种技术一个:Java(1.8),Flutter(1.5.4-hotfix.2)和Kotlin/Native(1.3.40)。设备的性能和资源利用率都是使用AndroidStudio(3.4.1)内置的Android Profiler工具测量的。在每次测试之前,手动强制进行Android完整垃圾收集(在Flutter的情况下,Dart传感器2021、21、33245月16日3.1. 试验台所有应用程序和REST服务器都是按照以下规范在PC上开发、构建和部署的:•主板:华硕ROG Maximus XI Hero;•CPU:Intel Core i9-9900k(5.0 GHZ);•RAM:2× 8 GB(双通道,4000 MHZ);•GPU:华硕ROG Strix GeForce RTX 2080 Ti OC;•SSD:三星970 EVO 1 TB;•操作系统:Windows 10 Pro(October 2018 Update).此外,上述计算机一直在运行具有以下规格的Android虚拟机:•模拟设备:Google Pixel 3;•操作系统:Android 9.0 Pie(API 28);•CPU核心:4个;•RAM:2 GB.3.2. 测试假设:构建时间和应用程序文件大小为了减少应用程序的大小,它们已经被构建为最小化(收缩和模糊)版本。Gradle(5.5)负责构建过程。3.3. 测试假设:应用程序启动和RAM空闲使用这两个测试的效果是10次尝试的平均结果在应用程序启动后30秒记录RAM使用情况3.4. 测试假设:收集操作为了测试集合操作,使用了列表的最简单实现:Java和Kotlin/Native的ArrayList,Flutter的List每个测试中的单个项目是一个包含一个double和一个字符串变量的对象;两个变量都被分配了一个示意性生成的值。顺序添加测试包括将10,000个项目逐一添加到最初空列表的末尾。序贯阅读测试是从一万个项目的开头开始,一个接一个地获得这两个测试的结果是执行单个操作(写入/读取项目)所花费的平均时间随机阅读测试包括从100,000个项目的列表中随机抽取10,000个项目测试的结果是基于随机索引获得单个项目所需的平均时间随机删除测试包括从100,000个项目的列表中随机删除10,000个项目测试的结果是基于随机指数的单个项目的平均移除时间。过滤测试的结果是基于10,000次尝试的包含10,000个项目的列表的过滤的平均持续时间排序测试的结果是基于10,000次尝试,包含10,000个混洗项的排序列表的平均持续时间。3.5. 测试假设:REST-GET和POSTREST服务器使用Spring框架开发。为了保证对请求的最短响应,服务器被部署在本地。REST请求的测试包括10,000个GET和POST请求。GET响应主体和POST请求主体包含一个JSON对象,其中包含一个long变量、一个double变量和三个字符串变量;所有变量都被分配了一个示意性生成的值。测试的结果是单个请求的平均响应时间。传感器2021、21、33246月16日3.6. 测试假设:数据库操作所有技术都允许使用Android原生支持的SQLite数据库在Kotlin/Native应用程序的情况下,需要使用SQLDelight库。测试中使用的数据库由一个包含2个整数类型列和3个文本类型列的表组成测试的结果是在1000次尝试的基础上,使用SQL语句将单个记录添加到最初为空的“USERS”表所需的平均时间SELECT ALL测试的结果是从“USERS”表中获取所有记录所需的平均时间,该表最初填充有10,000条记录(使用不带WHERE子句的SELECT语句),基于1000次SELECT ONE、UPDATE ONE和UPDATE ONE测试的结果是执行单个操作(使用带有WHERE子句的SELECT语句获取一个项目、使用UPDATE语句更新一个项目或使用UPDATE语句删除一个项目)所需的平均时间,以1000次尝试为基础在每种情况下,表最初都填充了10,000条记录。3.7. 测试假设:序列化和重复化为了测试序列化和非序列化,在每个应用程序中实现了具有相同结构的对象该对象包含一个long、一个double和三个字符串变量;所有变量都被分配了一个示意性生成的值。每个测试的结果是基于10,000次尝试执行单个操作(将对象序列化为JSON,或从JSON重新定义对象)所需的平均时间。3.8. 测试假设:文件操作在所有测试中,使用了100 MB的文件设备保存和删除测试结果是基于100次尝试执行单个操作(分别为保存文件和删除文件)所需的平均时间。文件读取测试结果是基于100次尝试读取文件所需的平均时间4. 结果4.1. 构建时间和应用程序文件大小Java构建应用程序所需的时间几乎是Flutter的一半,比Kotlin/Native少了大约35%此外,Java应用程序的大小比Flutter小五倍以上,比Kotlin/Native小30%以上(图2)。图2. 平均应用程序生成时间和安装文件的大小。4.2. 应用程序的启动和RAMFlutter应用程序的结果与其他应用程序的结果存在负面差异它花了两倍多的时间启动,是唯一的应用程序传感器2021、21、33247月16日这并不顺利和直接。此外,Flutter应用程序在空闲时需要的内存几乎是Java的两倍,比Kotlin/Native多60%(图3)。图3.RAM的平均启动时间和平均空闲使用率。4.3. 收集操作所获得的结果不允许明确选择最有效的收集操作技术(图4在六个测试中的三个测试中,Flutter应用程序获得了最短的执行时间(图4,10和12)。然而,在随机删除测试中,Java快了52倍以上,Kotlin/Native快了34倍(图8)。在剩下的两个测试中,每种技术的执行时间是相同的(图4和图6)。Kotlin/Native和Java应用程序在执行时间和资源利用率方面都非常相似Flutter在每个测试中的CPU使用率最低,但也使用了最多的RAM(图5,7,9,11和13)。图4.单个项目的平均添加和读取时间。图5. 在顺序添加和顺序读取期间,RAM和CPU的最大使用率。传感器2021、21、33248月16日图6.在列表中的随机点读取项目的平均时间。图7. 在随机项目读取过程中,RAM和CPU的最大使用率。图8.从列表中随机位置移除单个项目的平均时间。图9. 在随机项目删除过程中最大限度地使用RAM和CPU。传感器2021、21、33249月16日图10. 列表过滤的平均时间。图11. 列表过滤期间RAM和CPU的最大使用率。图12. 列表排序的平均时间。传感器2021、21、332410月16日图13. 列表排序期间RAM和CPU的最大使用率。4.4. REST-GET和POSTKotlin/Native应用程序在两种测试类型的REST请求的执行时间方面存在负面差异此外,它比其他应用程序使用更多的CPU功率。Flutter和Java应用程序的结果相似,除了使用RAM之外,Flutter在峰值时需要几乎两倍的RAM(图14和15)。图14.单个REST请求的平均响应时间。图15. 在请求执行期间最大限度地使用RAM和CPU。4.5. 数据库操作Flutter应用程序在数据库操作方面表现最差。它需要几倍的时间来执行每个操作,并且使用的内存大约是其他应用程序的两倍。Kotlin/Native和Java应用程序传感器2021、21、332411月16日取得了非常相似的好的结果。每种技术的处理器使用情况几乎相同(图16图16. 插入单个记录的平均时间。图17. 插入记录时的最大RAM和CPU使用率。图18. 获取所有记录的平均时间。图19. 获取所有记录期间的最大RAM和CPU使用率。传感器2021、21、332412月16日图20. 执行SELECT、UPDATE、UPDATE操作的平均时间。图21. 在SELECT ONE、UPDATE ONE、NETWORK ONE测试期间,RAM和CPU的最大使用率。4.6. 序列化和反序列化在这两个测试中,Flutter应用程序的执行时间大约快了四倍,但同时使用了大部分RAM。其他应用 不仅需要更多的时间来执行这两个操作,而且还使用了更多的CPU功率(图22和23)。图22.序列化和重新序列化对象的平均时间。传感器2021、21、332413月16日图23. 测试期间RAM和CPU的最大使用率4.7. 文件操作对于每个应用程序,保存和删除文件所需的时间和资源量非常相似(图24和25)。在读取文件的情况下,Flutter应用程序被证明是最快的,但与其他应用程序相比使用了更多的内存(图26和27)。图24. 保存和删除文件的平均时间。图25. 在文件保存和删除过程中最大限度地使用RAM和CPU。传感器2021、21、332414月16日图26. 文件读取的平均时间。图27. 在文件读取过程中最大限度地使用RAM和CPU。5. 讨论考虑到每个操作的执行时间,最值得注意的是Flutter应用程序,尽管它在最大数量的测试中获得了最佳时间结果,但在数据库操作测试中却被超越,竞争对手的应用程序快了10倍。每个应用程序的资源利用率也很有趣。在RAM使用的情况下,Flutter应用程序是最差的,Java应用程序是最好的。CPU使用情况相反,Flutter应用程序实现了最佳结果,Java和Kotlin/Native应用程序的结果类似,更差。Java应用程序的结果(以执行每个应用程序所需的时间表示)的操作是最稳定的,并且在任何测试中,它们与其他应用程序实现的操作都没有显著差异。同时,它具有最小的RAM使用量。应该始终记住,在规划时必须考虑对于将单个数据保存到数据库的应用程序,以及从传感器生成大量数据以进行进一步处理的应用程序,必须以不同的方式考虑所呈现的结果,例如某些移动应用程序解决方案[16]。当对文件的操作是零星的时,这是不同的,当它是创建和保存大量甚至小文件的过程时,这是不同的最后,还应该指出的是,Flutter和Kotlin/Native仍然处于早期开发阶段,因此,预计下一个版本应该会解决一些问题。但是,这并不意味着开发人员应该害怕使用这些技术创建应用程序。他们丰富的文档使他们易于学习,并且围绕他们的不断增长的社区将帮助解决可能出现的任何问题。传感器2021、21、332415月16日−6. 结论从所进行的测试中得出以下结论。在不考虑节省资源和执行时间的地方,Flutter似乎是一个自然的选择,特别是对于某些排队操作,排序,过滤,序列化或文件操作。在其中的一些测试中,Flutter也被证明在CPU使用率方面更好。测试还表明,Flutter不应该用于严重依赖数据库操作的应用程序。在使用Java和Kotlin/Native时也要同样小心,特别是因为语言中的一些异常可能并且确实会影响其创建过程[29]。经过一段时间的审议,可以得出结论,这种结果是可以预期的。原则上,这是正确的。然而,提出一个论点并证明它是不同的,正如本文作者所指出的那样。总之,重要的是要意识到每种解决方案的局限性和优势,以便能够在对问题进行良好分析后选择最佳解决方案然而,要有效地实现这一点,总是需要经验。我们的研究结果是通用的,因此对于任何想要开发从任何传感器网络收集和处理数据的应用程序的人都有帮助为了做出最终决定,除了所获得的结果之外,仅需要关于所设计的移动应用程序最频繁执行的操作的信息这篇文章提供了尚未得到文献支持的问题的答案,并对移动应用程序的开发做出了重大贡献。作者贡献:K.W.:资料整理、调查、撰写(初稿); W.Z.:概念化,监督,写作(评论编辑)。所有作者均已阅读并同意手稿的出版版本。资助:本研究未收到外部资助。机构审查委员会声明:不适用。知情同意声明:不适用。数据可用性声明:不适用。利益冲突作者声明没有利益冲突引用1.高,J.;Li,L.;Bissyandé,T.F.;Klein,J.移动应用复杂性的演变在2019年第24届复杂计算机系统工程国际会议(ICECCS)的会议记录中200-209. [交叉引用]2.Ho-Won,J.;Seung-Gweon,K.;昌信角软件产品质量度量:ISO/IEC 9126综述 IEEE Softw. 2004年21,88-92. [交叉引用]3.Asprilla,R.;阿尔穆埃莱岛使用cloudlets提高移动终端性能。在IEEE中美洲和巴拿马公约(CONCAPAN XXXIV)的会议记录中,巴拿马,巴拿马,2014年11月12日至14日; pp. 1-5. [交叉引用]4.科拉尔湖;Georgiev,A.B.;Sillitti,A.;Succi,G.执行时间能准确描述移动应用的能耗在Android上做实验第三届绿色和可持续软件国际研讨会(GREENS 2014),印度海得拉巴,2014年6月1日。31-37. [交叉引用]5.Czurak,P.; Maj,C.; Szermer,M.; Zabierowski,W.蓝牙低能耗对Android操作系统能耗的影响。在第十四届MEMS设计透视技术和方法国际会议(MEMSTECH)会议记录中,乌克兰利沃夫,2018年4月18日至22日;第14255-258. [交叉引用]6.科拉尔湖; Sillitti,A.; Succi,G.移动多平台开发:性能分析实验。Procedia计算Sci. 2012,10,736-743. [交叉引用]7.德 利 亚 湖 ; Galdamez , N.; Corpus , L.; Pesado , P.; Thomas , P. , Approaches to Mobile Application Development :Comparative Performance Analysis。在计算会议论文集,伦敦,英国,2017年7月18日至20日; pp。652-659. [交叉引用]8.林,C.;林,J.; Dow,C.;温角Android系统的基准Dalvik和原生代码。2011年第二届生物启发计算和应用创新国际会议(IBICA),中国深圳,2011年12月16日至18320-323. [交叉引用]传感器2021、21、332416月16日9.Fikri,A.;Presekal,A.;Harwahyu,R.;Sari,R.F.Dalvik和ART在不同Android移动设备上的性能比较在2018年信息技术和智能系统研究国际研讨会(ISRITI)的会议记录中,印度尼西亚日惹,2018年11月21日至22日; pp. 439-442. [交叉引用]10.Jakimoski,K.; Andonoska,A.移动应用程序的性能评估。在第三届自治和自治系统国际会议(ICAS11.马里兰州那不勒斯介绍Flutter并开始使用。InBeginning Flutter:A Hands-on Guide to App Development; Wrox:Indianapolis,IN,USA,2019; pp. 三比二十五12.FAQ–Flutter, 可于网上查阅:https://flutter.dev/docs/resources/faq(于二零二零年四月六13.Kotlin/Native for NativeKotlin 可于网上查阅:https://kotlinlang.org/docs/reference/native-overview.html(于二零二零年四月六14.手机appWikipedia. 可于网上查阅:https://en.wikipedia.org/wiki/Mobile_app(于二零二零年四月六15.全球前100名应用程序发布商的支出,Sensor Tower。可于网上查阅:https://sensortower.com/blog/average-publisher-revenue(于二零二零年四月六日查阅)。16.Inomata,T.; Iwagami,M.; Nakamura,M.; Shiang,T.; Yoshimura,Y.; Fujimoto,K.; Okumura,Y.; Eguchi,A.; Iwata,N.; Miura,M.;等人,Characteristics and Risk Factors Associated with Diagnosed and Undiagnosed Symptoms Dry EyeUsing a Smartphone Application. JAMA Ophthalmol. 2020,138,56-68. [交叉参考][PubMed]17.让农民有力量,FarmSmart。可于网上查阅:https://www.farmsmart.co/our-app(于二零二零年四月六18.为视力受损的人创造视觉,设想。可于网上查阅:https://www.letsenvision.com(于二零二零年四月六19.农凯瑟河Beyond Web/Native/Hybrid:A New Taxonomy for Mobile App Development.在2018年IEEE/ACM第五届移动软件工程和系统国际会议(MOBILESoft)的会议记录中,瑞典哥德堡,2018年5月27日214-21820.Mendoza,A.移动应用或移动网络:大辩论。移动用户体验,第1版。Morgan Kaufmann:San Francisco,CA,USA,2013;pp. 161-173.21.Ahmad,A.;李,K.;冯,C.;Asim,S.M.;Yousif,A.;Ge,S.移动应用开发挑战的实证研究IEEE Access2018,6,17711-17728。[交叉引用]22.Pinto,C.M.;科蒂尼奥角从原生到跨平台混合开发。在2018年智能系统国际会议(IS)的会议记录中,葡萄牙丰沙尔,2018年9月25日至27日; pp。669-676. [交叉引用]23.Duckett,J.HTML和CSS:设计和构建网站,第1版Wiley:Indianapolis,IN,USA,2011.24.马,Y.;刘,X.;刘玉;刘玉;Huang,G.两种时尚的故事:Android上原生应用和Web应用性能的实证研究IEEE移动计算2018,17,990-1003. [交叉引用]25.Cheng,F.用Ionic 4和Firebase构建移动应用程序:混合移动应用程序开发,第2版;Apress:Auckland,New Zealand,2018.26.Android(操作系统),维基百科。可于网上查阅:https://en.wikipedia.org/wiki/Android_(operating_system)(于二零二零年四月六日生效)。27.Android是开放的,iOS是封闭的,如何做极客。可于网上查阅:https://www.howtogeek.com/217593(于二零二零年四月28.Java的完整历史,Geeks for Geeks可在线查阅:https://www.geeksforgeeks.org/the-complete-history-of-java-programming-language(于2020年4月6日访问)。29.Bryksin,T.; Petukhov,V.; Smirenko,K.; Povarov,N.检测Kotlin代码中的异常。在同伴诉讼程序研讨会(ISSTA '18),萨尔布吕肯,德国,2018年7月17日至23日;页。10-12. [交叉引用]经版权所有者许可转载。未经允许禁止进一步复制。
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功