Android意外的诞生

Android和Linux一样,一个人完成雏形的编码,巨头林立中称之为意外

Windows Mobile

Windows Mobile是微软针对移动产品而开发的精简操作系统

Pocket PC 2000

2000年4月19日

Mobile 6.5

2009年2月发布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sd43yzuw-1575015710034)(https://cdn.arstechnica.net/wp-content/uploads/2009/10/htc_winmo65_ars.jpg)]

Kin

Microsoft Kin标榜为社交电话. 这些功能跨越功能手机的门槛[7],可以使用Facebook, Twitter, Windows Live, and MySpace等社群.

2010年5月13发布

2010年6月30日终止

微软公司的官员告诉《纽约时报》说,他们对Verizon推动Kin的发展不够积极感到遗憾。仅上市48天。

Verizon,是一家美国移动网络运营商

Windows Phone

Windows Phone具有桌面定制、图标拖拽、滑动控制等一系列前卫的操作体验。

微软在该系统中使用了叫做Metro UI(后改名Modern)的新界面,完全改变了应用封装格式,所以Windows Phone 7的应用与Windows Mobile应用完全不兼容。

2010年10月11日晚上9点30分发布

CLR公共语言Runtime

Windows Phone使用.NET CLR来应用程序,CLR是Common Language Runtime的简称,和Java虚拟机一样也是一个Runtime环境;Windows Phone 7所有第三方程序均要经过CLR来运行。与Windows Phone 7不同的是,微软的Windows Phone 8采用与Windows 8相同的NT内核,可不经CLR直接运行原生码桯式;换上新内核的Windows Phone 8开始向所有开发者开放原生代码(C和C++),应用的性能将得到大幅提升。因此Windows Phone 8几乎兼容所有Windows Phone 7.X的应用程序,但Windows Phone 7.X无法运行为Windows Phone 8开发的所有原生程序。

软体结构体系

Windows Phone 7中的软件层,即软件结构体系,主要由两个部分组成,它们分别是Screen部分和Cloud部分。而Screen部分和Cloud部分则又分别由不同的部分组成,Screen部分由“Tool and Support”和“Runtimes”组成,Cloud则由“Developer Portal Services”和“Cloud Service”组成。Screen部分可以理解为本地,Cloud部分可以理解为云端,它们都是Windows Phone 7软件体系中不可缺少的部分。

Screen部分中的“Tool and Support”是开发应用所必需的开发工具和技术支持,“Runtimes”则是开发应用的Framework,提供所需要的API和功能。Windows Phone 7提供了两种框架,分别是Silverlight Framework与XNA Framework。

Silverlight Framework是以XAML文件为基础的应用程序设计框架,用来开发基本应用、网络应用、多媒体应用和控件。

XNA Framework则是用来开发基础的游戏设计框架,用来开发2D游戏、3D游戏和游戏控件。

Silverlight Framework和XNA

Framework都是在.NET平台上的应用程序开发架构,能够有效率地协助开发人员开发应用程序,而且开发人员只要稍微修改现有的Silverlight应用程序或XNA应用程序,就可以将Silverlight应用程序或XNA应用程序移植到Windows Phone 7上执行。

Cloud部分中的“Developer Portal

Services”是开发者开发应用程序所必需的注册账号、认证、发布、更新管理以及Market Place的付费管理,由于Windows Phone 7开发必须拥有注册的账号才能进行真机测试,否则只能在模拟器上进行测试。“Cloud Service”则是云端服务所需要的服务器API。

编程语言

微软当前只允许开发者使用C#和Visual Basic来进行Windows Phone 7的应用开发。此外,在Windows Phone 7应用程序的开发中不允许使用Native Code,也不允许使用C/C++语言(Windows Phone 8已经向开发者开放了C/C++),每个程序安装包(.xap)的大小最大只允许400MB,同时微软也对应用程序占用的RAM大小也做出了相应的限制。

开发限制

微软为了规范Windows Phone的用户体验,对开发者开发应用进行了严格的约束,开发者必须严格遵循这些开发约束和条款来进行应用开发。例如,开发者不能开发涉及到手机摄像头的应用程序;开发者不能对应用程序的界面进行私自的定制;涉及到系统类的应用必须使用系统提供的界面来运行。

Android

离开Danger后,Andy曾再次隐居开曼群岛,想开发一款数码相机,但是没有找到支持者。他很快回到熟悉的领域,创办Android,开始启动下一代智能手机的开发。这次的宗旨,是设计一款对所有软件开发者开放的移动平台
2005年,Andy靠自己的积蓄和朋友的支持,艰难地完成了这一项目。在与一家风投洽谈的同时,Andy突然想到了Larry Page,于是给后者发了一封邮件。仅仅几周时间,Google就完成了对Android的收购。接下来的故事,已经载入史册。

2005年4000万美元收购

开源节点

在2007年11月5日,Google公司正式向外界展示了这款名为Android的操作系统,并在这天Google建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成。这一联盟将支持谷歌发布的手机操作系的统以及应用软件,并共同开发Android系统的开放代码。此时,Android系统的定位已确定,基于Linux、开源、免费供手机厂商使用等,谷歌则将其服务深度集成在系统中以获取利润。

1.1

2008年9月22号发布的Android第一版。HTC Dream

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZuykNbd-1575015710037)(https://cnet4.cbsistatic.com/img/7b3e2PtMAM7BchfLuji77UjX404=/980x551/2018/08/31/4bd92183-19fb-4bff-8169-363b65e71ac1/g1-use-3602.jpg)]

2009年4月发布Android 1.6

HTC顶峰时期HTC Hero

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPiRIr2Q-1575015710038)(https://www.androidcentral.com/sites/androidcentral.com/files/deviceimages/samsung-galaxy-s.png)]

Galaxy S

2.3.x

Gingerbread(姜饼) :2010年12月7日发布。

主要的更新如下:
增加了新的垃圾回收和优化处理事件;原生代码可直接存取输入和感应器事件、EGL/OpenGLES、OpenSL ES;++新的管理窗口和生命周期的框架++;支持VP8和WebM视频格式,提供AAC和AMR宽频编码,提供了新的音频效果器;支持前置摄像头、SIP/VOIP和++NFC(近场通讯)++;简化界面、速度提升;更快更直观的文字输入;一键文字选择和复制/粘帖;改进的电源管理系统;新的应用管理方式。

IOS

iPhone OS 1

2007年 6月

乔布斯在2007年推出了首款iPhone,那时,为它提供服务支持的软件,还只是被附属简单地提及了一下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c0OGtuYx-1575015710038)(https://d2um6umu4gwssp.cloudfront.net/apple/wp-content/uploads/2016/06/iphone-1.jpg)]

iPhone OS 2

2008年 7月

故事的另一个结果是“AppStore”出现了:它将数百万的 iTunes Music 用户转变为潜在的App用户。

在iPhone OS诞生初期,还没有应用商店可供下载第三方的应用程序。乔布斯在当时鼓励开发者开发网页应用而不是原生应用,导致在当时应用程序质量不高,功能有限。直到几个月后,苹果改变了主意,并在2008年3月发布了第一款iOS软件开发包。并在当年7月推出App Store,这是iOS历史上的一个重要里程碑,它的出现开启了iOS和整个移动应用时代。

收入三七分成的制度和良好的生态环境迅速吸引了大量开发者。很快,iPhone几乎变成了一款“万能”的手机:量角器,水平仪,游戏机,其中还不乏一些相当具有逼格的“喝啤酒”,“吹蜡烛”等游戏。并且在此后的几年中苹果不停地完善App Store的功能。直到现在,App Store里的应用数量都是苹果自己最值得骄傲的地方之一。

iPhone OS 3 / iOS 3

2009年6月

新版本的 iOS 带来了许多新功能,比如复制粘贴、著名的 Spotlight 搜索和语音控制。

除此之外,App还出现了备受争议的新外观:拟物设计(skeuomorphism)。

iOS 4

2010年 6月全新的高分辨率Retina屏幕。

IOS7 2013年扁平化, Android则是2014年6月25日5.0版本

Dark主题2015年Marshmallow被移除

塞班

1980年David Potter成立Psion公司。1998年在爱立信、诺基亚、摩托罗拉和Psion的共同合作下成立塞班公司。1999年塞班公司推出Symbian OS v5.x操作系统。2000年全球第一款Symbian系统手机:爱立信R380正式出售。

2001年塞班公司推出Symbian OS v6.x。2003年推出 v7.x4,创始人之一的摩托罗拉退出塞班公司。2004年推出 v8.x版,2005年升级为 v9.x版。

2006年全球Symbian手机总量达到一亿部。2008年诺基亚收购塞班公司,塞班成为诺基亚独占系统。

2009年LG、索尼爱立信等各大厂商纷纷宣布退出塞班平台,转而投入新系统领域。至2010年塞班仅剩诺基亚一家支持。

2011年3月,Symbian被传“开源”,之后更名为诺基亚Belle。11月,塞班在全球的市场占有率降至22.1%,霸主地位已彻底被Android取代,中国市场占有率则降为23%。12月21日,诺基亚宣布放弃Symbian品牌。

2008年发布。Series 60第五版

俗称:S60v5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ohfhjBWU-1575015710041)(https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRO-f7kHUaLqXX2DNJokCA_9Niy7VDTc_BM7zDfoexPE6hetIP_)]

Chrome

2008年9月2日发布beta测试版本

V8 (JavaScript引擎)

V8在运行之前将JavaScript编译成了机器代码,而非字节码或是解释执行它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。

Android Runtime(缩写为ART)

2013年10月31日年作为Android 4.4系统中的一项测试功能正式对外发布,在Android 5.0及后续Android版本中作为正式的运行时库取代了以往的Dalvik虚拟机。ART能够把应用程序的字节码转换为机器码,是Android所使用的一种新的虚拟机。它与Dalvik的主要不同在于:Dalvik采用的是JIT技术,而ART采用Ahead-of-time(AOT)技术。ART同时也改善了性能、垃圾回收(Garbage Collection)、应用程序出错以及性能分析。

2013年3月13日Google官方发布博客文章称,安迪·鲁宾将离开Android部门而转向公司内的其它事务。其原职位由Chrome部门副主管桑德尔·皮蔡兼任。此举也引发了外界对Google日后是否会将Chrome与Android整合的猜想。[4]

其他历史节点:

2006年10月,谷歌以16.5亿美元收购影音内容分享网站YouTube,这是谷歌公司成立以来最大笔的并购。

2012年5月,谷歌以125亿美元收购摩托罗拉移动。

2013年10月3日,谷歌收购Flutter,该公司的主要业务是手势识别技术。

2015年4月,谷歌获得防剧透系统专利。

正文

读过万历十五年的人都清楚,万历十五年并没有发生什么记录史册的大事。谈不是什么开国,安史之乱,伐纣什么的大事。但我们要记得2007年这个节点,它是现在格局的关键因素。

前置:

现在有一个问题是如何向非Android开发解释Android是个什么东西。《大象 Thinking In UML》里对面向对象几个特点的描述非常棒,我也尝试映射一下各端开发自己理解的隐喻。

前端面向的最终是视图,也就是,无论你写了多美丽的代码和算法,最后展示给用户的就是你的界面,就是设计给你的那个界面。

后台面向需要渲染成各种格式的数据,xml, json等,后端需要给前端需要的数据格式,例如列表数据[{},{}]。

Java程序员其实很容易互相做彼此的工作。所以18年移动端寒冬之后,很多Android转了后台开发,SpringBoot降低了门槛,尴尬的是android没有Spring套装给后台入门。

那我们明白了Android的最终的工作就是“渲染”页面,那来看看Android的视图怎么组织

<?xml version="1.0" encoding="utf-8"?>    

页面上居中显示一行正文Hello World!

感觉还可以,就是比html复杂了一点

Hello World

假如后台的数据交换方式是xml, Android可以直接解析返回的xml, 然后直接渲染出界面。但是好像没人这么用。很早之前,前后端不分离的时候,后台貌似也需要渲染jsp内嵌的格式是html。大致大家都可以称之为DOM,就是document,代表了你的布局文件。

var a = document.getElementById("id");val tvHello = root.findViewById(R.id.tv_hello)

我们姑且将xml布局称之为画布,因为它唯一提供核心的东西就是Canvas对象。

那么画布没有被展开之前,谁也看不到,所以需要一个画板,将画布展开。另外的比喻就是剪纸,xml就是剪纸,需要贴在窗户上,我们称之为Window。这个概念在前端也有,在IOS应该也是存在的。到这其实大家的概念和做法都差不多,谁都有Canvas::draw方法。

但在承载window的时候就有些分歧了

我们拿Android的亲兄弟Chrome做对比,看看想不想双胞胎

Chrome吃内存,Android吃内存
Chrome一个标签,一项任务就是一个独立进程,Android一个程序就是一个独立进程,一个程序可以存在多个进程。
Chrome插件是单独进程,Android插件也是单独进程,优点肯定是大大的,任何一个进程崩溃,其他App都可以围观。

当然还有很多的相似点,毕竟亲兄弟,Flutter能开发Android,也能开发ChromeOS。

所以,咱们来介绍一下Android的Window承载器Activity(活动), 如果按现在Android3.0以的架构来映射,这倒霉玩意就是Chrome的一个标签。能想象吗?开启一个Activity就是开启了一个带URL的浏览器标签。所以写一个Activity就是写了一个本地Html和Js。

好了,到这,我们终于可以把Activity的另一个附加属性抽象映射到了前端JS,没错这玩意简单页面,映射的就是JSP(themeself),复杂界面就是JS。介绍了这么多,估计回去下载个IDE就能写登录功能了。

到这,有任何开发经验的人基本上都已经入门Android了。

抽象的映射完了,就开始正式介绍一些倒霉玩意了。

上图:

show Me the Code

public final class UsersActivity extends ListActivity {   @Override   protected void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       //...       new ListUsers().execute();   }   private final class ListUsers extends AsyncTask {       @Override       protected Void doInBackground(Void... voids) {           // final SQLiteOpenHelper sqLiteOpenHelper = ...           // JsonObjectRequest jsObjRequest = new JsonObjectRequest           // (Request.Method.GET, url, null, new Response.Listener() {           // MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);           // showData(user);           return null;       }   }}
  • God Activity

上古时代Android1.0到3.0都是这个写法

操作数据库,访问网络,解析数据,切换线程以及渲染数据

All in one多合一

AsyncTask怎么用,如何防止内存泄漏。
四大组件是什么,怎么用
Activity如何返回结果
Service有那几种启动方式

第二次迭代MVP(4.0-5.1)

  • God Presenter

MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

MVP这种模式很早就存在了,应用在Android上是因为Fragment

  • Added in API level 11
  • Deprecated in API level 28

This class was deprecated in API level 28.
Use the Support Library Fragment for consistent behavior across all devices and access to Lifecycle.

我们解释Fragment是不能扔掉的垃圾,Fragment在国内被广泛应用时,大概在2016年以后。因为之前BUG太多,和Async一样难用,现在是共识的使用方式,虽然还是那么不好用。

Fragment是Android的视图生命周期控制器(带生命周期的自定义View),是Activity上的View层级中的一部分,一般可以把它看做一个轻量级的Activity。与传统的Activity相比,它只占用更少的资源,并且提供更大的编码灵活性、在超低版本上的兼容性等。

使用Fragment,即使是在肥肠差劲的平台(例如API 19以下连ART都没有的的老系统)上也能得到较好的运行效果,并且能将过渡动画兼容到更低的版本(通过FragmentTransition指定)。

早期的Fragment出现过很多问题,比如没有onBackPressed(),没有启动模式,重复创建,辣鸡的回退栈,迷之生命周期等等,导致很多开源作者自己独立开发了用于Fragment管理的框架,其中比较出名的有YoKeyword大佬的Fragmentation。

No bibi, Show Code

第一个是短信Activity,294行代码
第二个是对应的UiController,4629行代码

这个是经典的MVC架构,引入MVP之后就多了一个类和写不完的接口,优点是,一套业务逻辑可以对应多个页面,平板的出现不得不如此来做。

下面的是另外一个直播App的主页面的接口约定,带上注释427行

第三次迭代MVP + managers(5.1-7.0)

这些类有很多名字:uitls、helpers、fooBarBuzz-ator、等等。因此我们引入 Manager。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dcNqXYm-1575015710044)(https://five.agency/wp-content/uploads/2016/11/Diagram_4-1.png)]

如果项目写在17年之前,能有这样的架构,已经很棒,维护起来已经很容易了。


也就是,到16年,Google也没告诉我们,Android是否存在一个标准通用的,没那么多BUG系统组件和框架。

在17年,我们几乎所有Android开发者要感谢的一位大神Jake Wharton和Square,2017年从Square离职去了Google。

他给我们带来了那些轮子

  • butterknife 24213
  • dagger
  • DrawerBehavior 903
  • NineOldAndroids 4492
  • leakcanary 23183
  • retrofit 33038
  • picasso 16895

黎明之后

  • RxBinding 8917
  • kotterknife 2243
  • timber 7144 Android日志框架
  • retrofit2-kotlinx-serialization-converter 345

名言:

When Google bought Android, I honestly think they treated it just as some other side project.

是他们才让我们感觉到Android还有一点优势,能在IOS开发者面前抬得起头。

我们身后的巨人Google做了什么

面对Android开发者一直被IOS开发和前端开发鄙视,Google做了什么?
2016年,support-v7, databinding-alpha(这玩意MVVM模式的Android实现),当时属于脑残项目,19年又被提上了Jetpack。

2017年,放弃自己的HttpUrlConnection, 使用okhttp3作为网络框架(简单的说,开发者把坑踩完了,发现了更牛逼的存在)

和Java打了官司,才决定用Kotlin。
Android碎片化严重,ReactNative霸占市场,马后炮出了Flutter和新的操作系统。

被欧盟开罚单,之前说好的靠内置应用赚钱破灭了,开始逐渐闭源。

2018年,Jetpack,简单的说,开发者们,Google还是靠得住的,你看我们想起你们来了,你们不用去自己造轮子了,我们都给你们提供alpha版的AndroidX,必须用啊,不用你就是找事情,一天提醒你三遍。

2019年,Jetpack一部分是1.0了,Flutter的热度成功盖过了Kotlin原生开发。

前一段时间中美贸易战,Android和华为之前的关系很紧张,其实华为早就有备胎,不是现在的那个什么鸿蒙,而是很早的麒麟OS,让我们想到了悲剧的阿里云OS。备胎早晚会转正,只是现阶段转正的代价不可估量。

话说,都这么烂了,为啥还开发Android,还有那么多人入坑

入门简单,计算机相关专业的,你可以说你没学过oc,但不能说你没学过Java

入门便宜,一台Mac等于三台PC,开发不需要注册账号,不需要花一分钱。

对开发者不友好,对手机厂商友好啊,不花钱,随便改,随便造,你只要开机启动的时候协商power by android就完了,毕竟当时塞班诺基亚收购了,除了它,就剩下WindowsPhone,大家都知道,自己和自己不兼容。

So,现在啥样?

Google的拷问

Google:

还想做Android开发不?

开发者:

Google:

先去学Kotlin


Google:

还想做Android开发不?

开发者:

Google:

先去学Jetpack


Google:

还想用AndroidStudio开发Android不?

开发者:

Google:

先去把项目升级到AndroidX支持,要啥啥support


开发者:

Android是亲生的?

Google:

大家的女儿,Flutter才是亲生的,Chrome的媳妇儿

十岁的Android何去何从

Android越来越来越像IOS,IOS也越来越像Android

kotlin官方提供了编译Native代码还是很激动的,最起码看到了当年没有完成的事情仍有希望被完成,用Java写IOS app

什么ReactNavtive, Flutter都要让路。

Apple不让怎么办,kotlin, Flutter会和JS一样,分一杯移动端的蛋糕。Flutter会更强势,因为他自带先进的渲染库,可以做JS做不了的游戏。

那来瞅瞅Android可能即将流行的架构

大公司的组件化,以阿里巴巴的开源路由ARouter的诞生为起点,主打模块的复用性和可拆分性,同一套登录逻辑没有第二遍,新项目除了Domain和问题领域,其他都可以拿来主义。淘宝先上线扫垃圾,支付宝随后就来。

小公司的Single Activity,The Clean Architecture,最小的系统依赖,专心在业务领域建模。这么干的国内有重构后的知乎

虽然这两个方法处于不同的层面,你就一款App,给谁去复用,增加项目维护成本。组件化本身就拆散了很多东西。理想状态可以实现组件之间的小型前后端分离。

前后端分离

路由这个概念存在,大致就明白这是个啥

The Clean Architecture

这个是2012年,《代码简洁之道》的作者Uncle Bob发布在博客上的内容。

面向的是面向对象开发者,很拗口,都懂。

OO,OOD,OOAD,TDD,DDD

想到最近人间蒸发的南京音乐人李志的一句歌词,

他们在这世界上不停的奔跑,一不小心就改变了我们

这个简洁的架构也不是目前Android开发的银弹,虽然已经可以在Android上来应用这个繁杂的,多层的,但可维护的架构。奈何kotlin中,函数是一等公民。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KpbG3hYD-1575015710045)(https://blog.cleancoder.com/uncle-bob/images/2012-08-13-the-clean-architecture/CleanArchitecture.jpg)]

So, So?, So!

abstract class UseCase where Type : Any {    abstract suspend fun run(params: Params): Either    operator fun invoke(params: Params, onResult: (Either) -> Unit = {}) {        val job = async(CommonPool) { run(params) }        launch(UI) { onResult(job.await()) }    }    class None}
class MainApplication : Application() {    override fun onCreate() {        super.onCreate()        // start Koin context        startKoin {            androidContext(this@MainApplication)            androidLogger()            modules(appModule)        }    }}val appModule = module {    // single instance of HelloRepository    single { HelloRepositoryImpl() }    // Simple Presenter Factory    factory { MySimplePresenter(get()) }    // Simple Java Presenter    factory { MyJavaPresenter(get()) }    // scope for MyScopeActivity    scope(named()) {        // scoped MyScopePresenter instance        scoped { MyScopePresenter(get()) }    }    // MyViewModel ViewModel    viewModel { MyViewModel(get()) }}

十年,大致和移动端的Android开发者,度过了婴儿期和儿童期,还有很长的路要走。


图片均来自于网络,如有侵权,请联系删除

更多相关文章

  1. android 蓝牙、低功耗BLE开发问题总结
  2. Android(安卓)OpenGL ES 开发教程(13):阶段小结
  3. 推荐几个非常有用的开发工具之Android(安卓)Studio插件
  4. Android伸手党系列之四:Android项目开发常用技术
  5. Android(安卓)网络开发详解
  6. Android(安卓)studio高效开发之——快捷键的使用
  7. 下载频道2013年超人气精华资源汇总---全都是免积分下载
  8. 开箱即用!Android四款系统架构工具
  9. RAD DELPHI XE5的android开发环境配置

随机推荐

  1. 【竞价网站绝技】根据访客ip,页面显示访客
  2. Html css缩放会将大小改变几个像素
  3. 利用HTML5开发Android笔记
  4. J2EE进阶之onsubmit表单提交 五
  5. j2ee的web项目,有最终的html代码(即f12看到
  6. 仅使用CSS / HTML将鼠标悬停在按钮上时显
  7. 如何截取html的子字符串作为内容摘要
  8. vs远程调试 转http://www.cnblogs.com/ma
  9. 如何使用JavaScript修改基于onclick的文
  10. vue常见面试题