写点什么

社区讨论:Android 的架构设计

  • 2012-07-31
  • 本文字数:1967 字

    阅读完需:约 6 分钟

最近,开发者在知乎社区中就 Android 的架构设计展开了讨论

有人问“Android 架构设计的思想与原则是什么?”:

最近工作中遇到了 Android 中的权限问题,发现 Android 确实是开源的,但并不开放,比如权限控管就相当严格,限制做很多事情,这一点得益于 Linux 内核。这也勾起来对其架构研究的兴趣,不知到哪位能够深度剖析下 Android 架构设计的思想与原则?

rlei 分析了 Android 的设计哲学:

理解好 Intent,就可以理解 Android 哲学 (“所有应用生来平等”) 的一部分。举个简单的例子,iOS 里面应用要集成 SNS 如 facebook/twitter/sina weibo 等,都需要应用自己实现(iOS5 也只是集成 twitter 一家);Android 上只需要广播一个 share 内容的 intent。从理解 Intent 如何工作开始,你就在慢慢理解 Activity Manager, Package Manager, Services 这些 Android 的重要组件是如何工作的。

另外 Binder 是 Android 架构里非常核心的一块。Android 基于 Intent 的消息传递和组件 / 应用解耦,下面的基础都是 Binder IPC。在这一点上,Android 实际上是光荣的传承了 BeOS 和 Palm OS 6(悲催的 OS6…)未能发扬光大的一部分。

MVC(Content Provider, Activity, Layout, Adapters) 这个比较基础,也不算 Android 特有的。

Content Provider 对数据访问的抽象也是比较有意思的一块。理想情况下,content provider 可以让客户端用 URI 以语义化的方式访问数据 (URI 本身即表示数据层次结构和查询条件),而下面数据库表的结构可以任意变动,不影响客户端代码。当然实做的时候 content provider 还是会被各种复杂的 where 子句暴露出 SQL 的实现细节……

至于 Android 的权限管理,其实比较简单,主要是利用现成的 Linux 安全模型,进程之间相互隔离。API 级别的权限管理和 JVM 类似。

Billy Cui 重点解析了权限系统的设计:

Android 的权限系统是基于 Linux,但又增加了很多自己的控制模块。

总体上来说,其分为以下几部分权限系统:

1. userid : 继承于 linux,对于多个 app,通过 shareuid 的方式可以使用同一个 userid,主要承担一些目录访问权限之类的工作,比如私有目录只能由同一 uid 应用访问。

2. 安装 level:system level or app level,这个是根据应用的安装位置决定的,在 system/app 下安装的应用就是 system level,在权限访问中会得到更多的权限,比如静默安装应用的权限等。

3. permission : 这个是最主要的权限控制,一般开发者开发应用主要是接触这个部分,在这部分中,会根据应用在 AndroidManifest.xml 中声明的 use-permission 而在访问相应 api 或资源时判断其是否有访问权限,比如常用的 android.permission.INTERNET 等。

4. signature: 签名,是 Android 权限系统中的重要组成部分,对于系统签名的应用,会有一些特殊的功能,而 shareuid 等特性也是需要同一签名作为基础。此外,permission 在设置 / 自定义其权限时也经常会使用到签名,比如控制只有我自己的应用才可以访问我自己定义的公开 API。

除此以外,其实 Android 在 uid 的里面设置了一些预定义有特殊功能的 uid,比如 system/media 等,在配置其 system level 的 services 的时候会用到。

董兆辉则认为 Android 主要是基于组件搭配思想:

Android 是开源的,不过开源不意味着可以乱来,开源只是告诉你我是怎么做的,至于为什么这么做,就是另外一个问题了。任何一个系统如果没有权限管理,那不是乱套了么?我倒是觉得 Android 的权限管理设计的还不错,有些地方比 iOS 好,也较灵活,不过同样是因为这一点,容易被利用。

说到 Android 架构的设计思想和原则,按我的理解主要是组件搭配,即在用户看来,所有的 module 或者组件,都是可以重复利用和简单组合的。想法是好的,不过有得必有失,或者说 Android 现在做的还不够好,在性能方面是很低的,否则的话 Android 也不会推出补丁(NDK 之类的,dalvik 的不断升级)。

我觉得所有 Framework 或者平台或者语言都想给应用开发者最方便使用的接口,最人性化的体验,同时又要争取最大的性能,两者权衡折中吧。不过随着硬件速度的飞速增长,性能的权重会变低。

范怀宇还谈到了资源体系:

Android 架设在 Linux 之上,因此,继承了 Linux 可移植性、用户管理机制、文件系统,等等。

Android 的核心在 Framework 层,本质上,这是一个基于组件的应用开发系统,组件间通过消息(Intent)进行通信。一方面,Intent 是通信信息的载体,另一方面,Intent 也定义了 Android 组件的通信协议。

Android 可以对组件所运行的进程做托管,在 Android 中,进程概念相当薄弱。依赖于进程托管,Android 可以轻松支撑多任务多进程的应用模型。

除了组件,资源体系也是 Android 中比较特色的一块,它提供了完整的资源支持,可以用来描述一切与 UI 相关的内容,并实现多设备的适配。

InfoQ 的读者对 Android 的架构有何理解?欢迎发表自己的看法。

2012-07-31 09:075826
用户头像

发布了 501 篇内容, 共 255.3 次阅读, 收获喜欢 59 次。

关注

评论

发布
暂无评论
发现更多内容

点云标注的算法优化与性能提升

来自四九城儿

HDC精彩回顾|7月8日OpenTiny重磅发布

OpenTiny社区

开源 前端 UI组件库

技术分享 | 如何利用GPU云服务器加速AIGC训练

阿里云弹性计算

云计算 阿里云 大模型 AIGC

点云标注与自动驾驶的安全性

来自四九城儿

超高速稳定!香港虚拟主机助你网站飞一般的速度!

一只扑棱蛾子

香港虚拟主机

低代码的出现,程序员要拒绝还是拥抱

互联网工科生

软件开发 低代码 JNPF

基于列存储的开源分布式NoSQL数据库Apache Cassandra入门分享

快乐非自愿限量之名

开源 NoSQL 数据库

CentOS7系统更新yum源教程

百度搜索:蓝易云

MySQL Linux centos 运维 yum

RTC+AI|“即智”数智人创新内容生产体验,为企业降本增效再提速

ZEGO即构

数字人 虚拟直播 AI人工智能 数字人短视频 直播间

点云标注的标准化与数据共享

来自四九城儿

Python源码剖析:深度探索Cpython对象-达观数据

NLP资深玩家

Python CPython 达观数据

瓴羊QuickBI为什么被称为国内口碑最好的BI工具

夜雨微澜

私有化部署这件事儿

高端章鱼哥

低代码 私有化部署 JNPF

DPO 直接偏好优化:跳过复杂的对抗学习,语言模型本来就会奖励算法

Zilliz

AIGC LLM RLHF

区块链技术协议有哪些?

TiAmo

区块链 技术协议

一文详解新一代高效前端构建工具VITE-达观数据

NLP资深玩家

vite 前端构建 es modules

不要爱上解决方案,而是爱上问题!什么是设计思维

汽车之家客户端前端团队

前端 设计思维 学会思考 ChatGPT

对线面试官-Redis 八 | 基于哨兵HA的原理

派大星

Java 面试题

问答对话文本数据:解锁智能问答的未来

来自四九城儿

语音标注平台:推动语音技术发展的关键支撑

来自四九城儿

以开放安全底座赋能全球开发者,华为云构筑云原生安全防护体系

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 7 月 PK 榜

ZipZapAI大模型与勇者斗恶龙:探索AVG游戏的无限可能

Ricky

AI Chat ChatGPT

Buck电路的原理及器件选型指南

元器件秋姐

电路 元器件 PCB设计 电源 Buck

模块七:王者荣耀商城异地多活设计

家有两宝

架构训练营

秒验丨 REST API:手机号码置换接口

MobTech袤博科技

大数据 前端 后端

华为云云原生数据库,让企业离应用更进一步

新消费日报

如何评价MyBatis-Flex框架

酱紫的小白兔

基于 EMQX 和 Neuron 的工业物联网 MQTT Sparkplug 解决方案

EMQ映云科技

解决方案 工业物联网 sparkplug

社区讨论:Android的架构设计_Android/iOS_崔康_InfoQ精选文章