Android系统为什么要设计得那么臃肿?

[复制链接]
網絡被詐騙錢財 发表于 2023-10-8 17:38:41|来自:北京 | 显示全部楼层 |阅读模式
现在6G的安卓系统,多开一点APP,多开几个浏览器标签页就开始杀进程,或者杀标签页。同样差不多内存的8G的电脑,开那么多软件都不杀进程。这是什么原因?
为什么安卓要基于Java开发,需要dalvik或者art这种东西?直接做一个原生Linux系统内核+一套窗口管理器+硬件外设驱动+负责监听GSM电话呼入和短信接收的Service(守护进程),然后QQ,微信,Chrome甚至电话拨号盘都直接用C++写,直接编译到ARMv8或者其他版本的ARM指令集对应的本地平台机器码,丢到这个Linux上面跑,不需要dalvik那些runtime岂不是能节省很多内存?节省了runtime托管平台的字节码到底层机器码的转换工作,是不是也能节省电池,提升运行性能?
至于驱动,我觉得这个也不算什么问题,本质上不就是按照硬件厂商给的datasheet里面的规范,写好对应的驱动程序嘛,电脑的硬件外设一样很多,驱动兼容都可以做好,只要硬件厂商和手机厂商愿意配合去做都可以做好,他们不愿意做,硬件厂商放出datasheet,让那些和linus一样的极客和开源贡献者们一起贡献也可以建设好的吧?!~
全部回复5 显示全部楼层
czf002 发表于 2023-10-8 17:39:09|来自:北京 | 显示全部楼层
google的选择向来如此,搞大杂烩技术栈。
对比苹果的做法,unix内核,GUI等统统二进制,native语言开发一把梭,干净的一逼!
现在oc不符合潮流了,直接造一门swift,还是非虚拟机语言,干净。(缺点是开发效率低)
安卓:Linux内核+HLA+虚拟机+字节码
chromeos:Linux内核+x11+chromium+v8+js
你看看,对比apple的选择,google做东西真的就是大杂烩,大家都知道技术栈越复杂,坑越多,构建越吃力,维护越困难。
google选择情怀:前期快速成型,后期黑人抬棺。
性请所次 发表于 2023-10-8 17:39:43|来自:北京 | 显示全部楼层
题主的疑问需要到历史中去寻找。每每这个时刻,像我这样参与过历史进程的中老年人的优势就表现出来了。
android 的项目立项非常早,缘起于 2003 年的创立 android 公司。当时笔者还在读初中,玩伴之间使用的还是诺基亚、摩托罗拉、金立一类的“功能机”。虽说是“功能机”,但它们还是可以安装一些功能简单的应用程序的,像是备忘录、计算器一类的,还有手机QQ (想不到吧,手机QQ在塞班时代就有了)。
当时的程序采用的是 jar 包。说到此,题主一定很震惊,使用 java 开发的手机程序竟早于 ios 和 android !但事实确实如此。
依题主疑问,使用 c/c++ 开发程序,直接编译为本地机器码岂不是更加方便简单?其实不然,确切地说当时嵌入式芯片领域还没有这样的技术。题主有没有想过这样一个问题:操作系统运行于 cpu 上,接下来要运行一个应用程序,如此操作系统是不是得让出 cpu 时间片,让 cpu 去执行这个应用程序;那么该应用程序结束,抑或崩溃后,如何保证 cpu 重新运行操作系统?答案是:这个过程需要 cpu 的硬件支持。以 intel cpu 为例:intel cpu 将可执行的程序划分为4个权限级:ring 0、1、2、3。windows 操作系统运行于 ring 0 ,应用程序运行于 ring 3 。当 ring 3 程序时间片耗尽,或出现指令异常时,cpu 自动将执行权交还给 ring 0 的操作系统。这就是操作系统能“掌控”应用程序的原理。而当时的手机嵌入式芯片,由于体积、功耗、产业链等一些列原因,不支持“权限级”的机制,所以无法使用被编译为机器码的应用程序。硬件不堪用,只能在软件上想办法。1995发布的 java ,本就是为各种嵌入式设备所设计的 (当时的设想是用作物联网和智能家电,唉,天意弄人呀)。于是在手机系统中嵌入 java me 虚拟机(当时还被称为 micro 版),使用 java 编写应用程序就成为了解决方案。
( 说到此,题主可能又要问了:那当时“功能机”的一些内置应用程序,像是 mp3 播放器、通讯录等,是如何工作的?它们其实是操作系统的一部分,和操作系统链接在相同的可执行文件上。没想到吧 ^_^ )
这是 2003 年 android 的立项背景。android 的定位,是发展为和塞班、黑莓一样的“功能机”操作系统。android 公司在 2005 年被 google 收购,直到 2007 年 iphone 横空出世与硬件产业链的升级,android 系统才被修改定位,向智能机系统转变。这就是 android 采用 java 的缘起。用多年前教授我 windows 程序开发的老师的话:“车子太大,转弯困难”。
如果题主有愿在移动端开发领域深耕,就会发现 android 系统在设计上带有很明显的“前移动互联网时代”的影子。我试以 android api 接口中的“四大组件”举一例:
android api 将用户程序定义为“四大组件”:activity (带用户界面的程序)、service (后台程序)、broad cast (用作程序间通讯)、content provider (数据存储与共享)。这种的“考虑周到”的设计带有一个假定:应用程序的主要功能在用户设备上实现。但在移动互联网时代,应用程序的主要功能恰恰不是在用户设备上实现的,而是在“云”上。智能手机仅仅是移动互联网的用户接入的端口。相比下,一开始就作为智能机操作系统被设计的 ios ,其用户 api 的设计重点在 view 、view controller ,强调图形界面的展现,则更符合智能机的时代特质。
以上。共勉。
kangsi-111 发表于 2023-10-8 17:39:53|来自:北京 | 显示全部楼层
这个需要考验计算机历史能力了呢!

Android第一个版本是2008年,当年x86依然如日中天,Google并没有把握ARM一定能赢。所以当时Google对Android的一个要求就是:编译一次,到处死机…啊不对运行。这样假如ARM输了Android生态不会受影响。

这个策略我觉得并没有问题——2012年的时候确实出现过基于x86 CPU的Android手机:
Orange San Diego review: Intel comes to smartphones
只是后来发现还是ARM更有市场罢了。

此外,这一策略带来的一个legacy就是,Android至今依然官方支持x86:
https://developer.android.com/ndk/guides/abis
dermot 发表于 2023-10-8 17:40:38|来自:北京 | 显示全部楼层
好吧,我来正经回答下这个问题

  • 为什么用Java?
因为Java简单,能让庞大数量的Java程序员很容易转到Android开发上,进而丰富Android生态,以此跟iOS生态抗衡。
2. 为什么要用Dalvik/ART?
同样,在选择了Java语言后,接下来就是虚拟机了,由于官方的HotSpot 是基于栈结构的虚拟机,而Android的CPU指令集一开始就选择的是ARM,ARM的特点就是寄存器多,所以就开发了Dalvik,Dalvik相对于HotSpot的最大区别就是改成基于寄存器的了,这样可以提高性能,也最大化发挥ARM的优势。至于ART,其实就是优化后的Dalvik。
3. 为什么不直接用Linux 内核+驱动+服务?
这个其实很简单,因为Linux是GPL协议,如果按照这个模式,那芯片商像高通/MTK的驱动都得开源,而他们是很不愿意开源的。
谷歌为了解决这个问题,就在Linux 上层添加了一个HAL层(Hardware Abstract Layer),以此把内核跟驱动程序隔离了,这样驱动那里就可以不用开源了。也是因为这个原因,Linux 社区也不再认为Android是Linux的一个分支版本。
除了协议的原因之外,Android还面临的一个问题就是兼容的厂商超级多,每家厂商的驱动都不一样,这也是HAL层的另一个好处,就是隔离驱动,要不然把驱动都放进来,系统要升级可就麻烦了。
4. 为什么要有一个Runtime 而不是直接编译机器码来运行?
这个原因主要原因其实是为了安全性。手机设备跟电脑有个很大的不同,手机上有很多的用户隐私数据,为了这个考虑就做成了每一个App都是一个独立的沙盒环境,互相之间隔离,每一个这个东西就是Runtime做的。直接编译成机器码App能做的事情很多,就会有安全隐患。而Runtime能够限制到App能做的事情是有限的,而且还能做权限的控制。
5. 至于杀内存的问题
早先的android系统内存都是很小的,256M,512M很常见,硬件能跟电脑比也就是近两年的事情。所以 Android系统一开始就有Low Memory Killer 的设计,就是在内存不够用时候,能够把那些很久不用的app干掉,留给用户当前看到的app。
至于电脑上,肯定也是会有杀进程的情况的,只不过电脑的策略宽松很多,不会轻易杀进程。而 Android本身的交互形式就和电脑的不一样,电脑上不太会考虑一个App的耗电情况的,而移动设备就不一样了,电池贼小,用户基本上一定时间内只会用到最新的3 4 个app,那些打开了几天的App不杀它在后台会带来电量损耗的问题。
而且这个杀内存的策略是每一个厂商可以自己定制的,原生的本身对后台App还是相对宽松的,一些定制厂的策略可能就比较严格,比如说华为相对就比较严格。
杀内存考虑到的不仅仅是当前内存还够不够用,还要考虑的是这个App你短期内还会不会再再打开,如果系统判定你短期内不会用这个App也会把它杀掉,要不然多费电。这样才能做到3000多mAh的电池能待机1天。

以上。
heyond 发表于 2023-10-8 17:41:23|来自:北京 | 显示全部楼层
老夫写程序就是一个词
敏捷!
怎么写得快怎么来
别跟我说什么算法复杂度,性能优化
一个词
敏捷!
优化?优化不存在的
你优化能赶得上项目经理加功能?
写得快就完事了
管他复杂度多少
O(n^2) O(n^3) O(2^n)安排上
所有数据一个链表全串起来
查找就遍历!遍历!遍历!
又 不 是 不 能 跑
敏捷开发懂吗
我一天能更10个版本
什么解释型语言什么虚拟机全给我安排上
python js java
一份代码,到处运行
平台不同重新写?不存在的
套!给他套个虚拟机
一层不行套两层
两层不行套三层
套到原来代码能跑为止
多线程?我的词典里就没有多线程这个词
整那么多没用的能敏捷
所有逻辑全放ui线程
io全放ui线程
老夫的i9屏蔽成一个核超到10GHz跑
又 不 是 不 能 跑



<hr/>稍微总结一下:
当初开发安卓的时候要速度不要质量,结果后来想改也不好改了...

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则