Android学习笔记(一) - 如果我们来设计Android
大家应该都背过公式,对于背公式,大体上有这么几种做法:
1,死背。
2,看公式的证明,并看懂。
3,尝试自己证明公式,而后对照“标准”证明。
一般来说,对公式的记忆和使用:3 > 2 > 1。这里只是说明这样一个事实,不打算探究其原因,有兴趣者可以自行翻阅记忆和认知心理学相关书籍。
对Android最熟悉的人是谁?自然是设计并实现它们的工程师。那么,如果我们自己来设计Android,会是怎样的结果呢?
1, 我们的需求
移动计算火了,我们要做移动计算平台。
这个平台应该尽可能支持各种设备,无论是平板电脑、手机、机顶盒还是电冰箱。
这个平台应该尽可能支持各种体系结构,无论是X86、ARM还是MIPS。
出于硬件的摩尔定律(对移动开发来说,免费的午餐还没结束),这个平台应该以功能丰富为主,兼顾低资源下的运行效率。
云来了,所以要有很强的网络功能。
内容为王,所以要有很多丰富的资源。
内容都是人提供的,所以要吸引众多开发者,同时提供很棒的开发工具来提高效率。
要吸引开发者就要让他们觉得有前途和有钱途,并且学习成本低。
2,我们的设计
我们需要操作系统来管理(移动设备的)硬件。不造轮子,并且要求支持众多硬件,支持众多体系结构,功能丰富,配套工具齐全,最好免费开源,最好有强大的网络功能,那么答案几乎只有一个: Linux。
现在有了设备 + OS,还需要各种应用。第一,要有应用,所以要有SDK给开发者;第二,应用要能跑,所以要有相应的运行时环境。这两者是紧密结合的。
SDK需要这些东西:语言、工具链、库。
那么我们有这些选择:
2.1 基于原生机器码
语言:c语言
工具链:针对不同体系结构的特定工具链(比如arm用ads或rvct),或者统一用现成的GNU工具链,这些工具链提供从源代码到可执行文件的转换,以及debug。加上其它的一些改善开发效率的通用工具:版本控制、模拟器、log、性能剖析等。还有编辑器或IDE(vi、Emacs及其他)。
库:标准C库 + GUI库(如GTK) + linux-system-api + 移动设备特定库(触摸、感应、摄像头、LBS等)。
运行时环境:如同linux,即elf文件的加载及运行。
优点:C语言能保证有限资源的充分利用,有大量的熟悉C语言的开发者。
有大量现成工具链。有一定数量熟悉这些工具的开发者。
库已经被证明(在PC上)能提供足够丰富的功能。
缺点:C语言偏底层,开发效率不高,对开发者要求较高。
依赖于体系结构的工具链和库,需要开发者针对不同平台进行构建及部署,导致一个APP有多个版本。而且无论是工具链还是库的使用,还是有一定的技术门槛的。另外特定体系结构的工具(ads\rvct)需要价值不菲的许可证。
现有的库(基于PC)是否适用于嵌入式环境。
elf有一定的冗余,是否适合嵌入式环境下资源(空间、网速)相对匮乏的环境。
· 总结:主要优点是:运行效率高(不确保,只是想当然,毕竟没做profiling);主要缺点是:开发效率低(相对而言,应该没什么疑问)。目前移动设备有非常大一部分是基于C语言来开发的,比如功能手机主要的平台:MTK、SPRD、MSTAR、互芯的主要版本(2012年之前),都是基于C开发的。
2.2 基于原生机器码
语言:C++
工具链:同C语言系列
库:STL + QT + linux-system-api + 移动设备特定库
运行时环境:同C语言系列
优点:运行效率高。QT在嵌入式领域已经有了一定的应用。
缺点:C++开发者相对小众,门槛相对较高(高于C)。开发效率相对来说也不高。
QT使用者相对小众,而且不同版本的许可也比较纠结。
有成功的前例(Symbian) 和 开发中(???)的系统(MeeGo + Tizen)
总结:优点和缺点几乎和C语言一样,不同的是:开发效率可能高一些;但门槛也会高一些;现有开发者数量更少一些(虽然有Symbian转行的开发者,但应该还是比不过C系的)。
2.3 基于虚拟机
语言:java
工具链:Eclipse + 插件 + jdk + 通用工具
库:jdk + 大量现成java库 + 移动设备特定库
运行时环境:JVM
优点:大量现成的轮子,开发效率较高,现有开发者众多,门槛相对较低,一次开发,四处运行(或者说部署)。
缺点:性能(空间+时间)是大问题。
和甲骨文可能有版权方面的纠结。
总结:如果能改善性能到理想的水准,这将是非常好的选择。改善性能是java社区长盛不衰的话题,这方面的努力和成果也非常多,普遍的做法是提供高效的虚拟机实现(jit、hotspot)。另外就是提供高效的库(特别是针对并发进行优化过的库,以在多核系统上达到高效),或者提供利于并发的语言特性。特别的,对于嵌入式领域,如果在arm架构上运行,那么可以充分利用arm芯片(型号带J的)对java字节码的硬件支持(Jazelle技术),以达到提速的目的。
2.4 基于解释型语言
语言:其它解释型语言(python、perl、 Ruby等)
工具链:IDE + 解释器 + 通用工具
库:相应语言的库。
运行时环境:相应语言的运行时环境
优点:高开发效率。
缺点:性能是大问题,是否能提供移动设备所需的丰富功能也是个问题。并且目前没有针对嵌入式做特定的优化(典型的,调试将是比较痛苦的事情)。
总结:基本不可行。
2.5 其他选择
还可以用D、Scala、 Go... 这些语言本身功能足够强大(应付系统及应用开发),而且相对较新(通常意味着较优美),但受限于工具、现有开发者、库等因素,并非很好的选择。C#也许语言本身很不错,但显然,这里是不可能的。
3,google - android的设计
语言:java
os: Linux
工具链:Eclipse + 插件(第三方+google针对android自行开发的大量插件)+ jdk(javac) + google自行开发的大量工具。
库:jdk(j2se的大部分,放弃了awt和swing) + google自己提供的大量类库
运行时环境 : google自己开发了Dalvik-VM代替了标准的JVM;使用dex代替了标准的java字节码文件(.class).
优点:选择java能带来大量开发者,能保证开发效率,有丰富的工具可用。
android-SDK中提供的各种工具确实非常棒。
dvm 据说效率高于jvm(我现在无法确定),dex确实比class文件紧凑。
缺点:没有使用arm的Jazelle技术,本来这是很棒的提升相关平台运行效率的方法,原因据说两方面:
1, dvm不使用标准java字节码,因此无法使用Jazelle。
2,Jazelle需要arm授权,google不喜欢这个。
似乎没有针对并发做太多优化。
不确定:性能真的达标了吗?为什么要有NDK?
google自己的GUI库确实比j2se中的好吗?
开发者都喜欢统一,不喜欢分裂。android会造成Linux和java的碎片化吗?
总结:走着瞧
4,其它:
对比之前我们的需求,google还需要做的就是用“开发android有前途和有钱途”来吸引众多开发者转向或进入android领域,就目前成果来看,无疑是成功的。至于其具体做法和成功的原因,由于个人缺乏这方面的知识和经验,就不妄加评论了。
本文简单的陈述了android的大体设计,后续将会针对android的每一个具体的特定的方面提出自己的设计、对照(并学习)google的设计,从而在学习android的过程中,能够于多个层次上都有所收获。
如果你觉得还有其他的设计方式,或者对本文观点有不同看法,欢迎交流。
转载于:https://www.cnblogs.com/CreateLight/archive/2012/02/25/2367654.html
Android学习笔记(一) - 如果我们来设计Android相关推荐
- Android学习笔记五—简易新闻应用设计
由于平板Pad屏幕尺寸一般都比较大,在展示内容时,可以同时展示更多信息,如左侧是导航列表,右侧是具体内容(双页模式).而手机,因为屏幕尺寸限制,只能显示一部分信息,或者是左侧导航列表,或者是右侧具体内 ...
- Android学习笔记(18)————利用tts开发一个android发音字典
/******************************************************************************************** * auth ...
- Android学习笔记----ArcGIS在线地图服务(Android API)坐标纠偏
仅限于如下ArcGIS在线地图服务(高德提供数据): //概述:彩色中文含兴趣点版中国基础地图 //投影:WGS 1984 Web-Mercator //切片格式:MIXED90 //服务类型:基础地 ...
- Android学习笔记:Android基础知识点(不断更新中)
1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...
- android jackson xml,[Android学习笔记]jackson库的使用
Jackson库一般用于序列化和反序列化操作,通常会涉及到的操作是: 1. Java Object -> Json String 2. Java Object -> Xml String ...
- Pro Android学习笔记(二九):用户界面和控制(17):include和merge
xml控件代码重用:include 如果我们定义一个控件,需要在不同的layout中重复使用,或者在同一个layout中重复使用,可以采用include的方式.例如定义my_button.xml如下 ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...
- Android学习笔记之(一)开发环境搭建
Android学习笔记之(一)开发环境搭建 zouxy09@qq.com http://blog.csdn.net/zouxy09 至于说Android是什么之类的俺就不啰嗦了,因为它离我们太近了.直 ...
- Android学习笔记-常用的一些源码,防止忘记了
Android学习笔记-常用的一些源码,防止忘记了... 设置拨打电话 StringdialUri="tell:"+m_currentTelNumble; IntentcallIn ...
最新文章
- 话里话外:为什么管理咨询业必须走专业化服务之路
- 远程代理模式-Remote Proxy(Java实现)
- C++面向对象程序设计的一些知识点(5)
- 【OMP信道估计】基于OMP压缩感知的信道估计算法的MATLAB仿真
- [PHP] 使用 pcntl 库实现PHP多进程
- 1 客户端性能--浏览器页面处理
- 11.context_suggester
- TypeScript 里的 module 概念
- r语言ggplot2 多线图绘制图例_plotnine: Python版的ggplot2作图库
- python2和3切换_python2和python3切换
- Python3.6 用Django连接MySQL
- 视频后期制作Premiere Pro 2022
- 如何使用代码调用API接口发送短信?(以SendCloud为例)
- 【图】爱情公寓里你最喜欢谁?爱情公寓3的投票,快来参加哦。
- 【领域泛化论文阅读】Semantic-Aware Domain Generalized Segmentation
- css中div怎么飞翔
- flutter flutter_easyloading全局初始化
- L1正则化进行特征选择
- 数据网站 免费数据网站
- Kernel源码笔记之调度:4.Fork系统调用
热门文章
- bps计算机,bps指的是计算机的什么
- 计算机复试题库.doc,计算机基础知识面试题库.doc
- mysql约束条件整型_MySQL 数据类型(整型,浮点型,字符类型,日期类型,枚举和集合) 约束条件 自增...
- php 表单变量,PHP学习笔记——访问表单变量
- android软件查找号码位置,如何在Android中通过GPS获取位置时获取卫星名称或号码?...
- qstring删除最后一个字符_Excel去掉最后一个字符两个方法,正反思维,你支持哪一个?...
- Git 2.18版本发布:支持Git协议v2,提升性能
- 调整屏幕亮度,调整字体大小
- Android平台调用WebService详解
- Node.js 体验-在Windows Azure工作者角色上托管Node.js